use broken-out patches for the coldfire to make it easier to follow differences again...
authorkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 23 Jun 2009 21:04:37 +0000 (21:04 +0000)
committerkaloz <kaloz@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Tue, 23 Jun 2009 21:04:37 +0000 (21:04 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@16547 3c298f89-4303-0410-b956-a3cf2f4a3e73

88 files changed:
target/linux/coldfire/patches/001-cf.patch [deleted file]
target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch [new file with mode: 0644]
target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch [new file with mode: 0644]
target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch [new file with mode: 0644]
target/linux/coldfire/patches/004-m5445x_headers.patch [new file with mode: 0644]
target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch [new file with mode: 0644]
target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch [new file with mode: 0644]
target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch [new file with mode: 0644]
target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch [new file with mode: 0644]
target/linux/coldfire/patches/009-m5445x_serial.patch [new file with mode: 0644]
target/linux/coldfire/patches/010-m5445x_fec.patch [new file with mode: 0644]
target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch [new file with mode: 0644]
target/linux/coldfire/patches/012-m5445x_defconfig_base.patch [new file with mode: 0644]
target/linux/coldfire/patches/013-m5445x_ata.patch [new file with mode: 0644]
target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch [new file with mode: 0644]
target/linux/coldfire/patches/015-m5445x_cau_crypto.patch [new file with mode: 0644]
target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch [new file with mode: 0644]
target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch [new file with mode: 0644]
target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch [new file with mode: 0644]
target/linux/coldfire/patches/019-m5445x_spi.patch [new file with mode: 0644]
target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch [new file with mode: 0644]
target/linux/coldfire/patches/021-m5445x_usb_premerge.patch [new file with mode: 0644]
target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch [new file with mode: 0644]
target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch [new file with mode: 0644]
target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch [new file with mode: 0644]
target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch [new file with mode: 0644]
target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch [new file with mode: 0644]
target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch [new file with mode: 0644]
target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch [new file with mode: 0644]
target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch [new file with mode: 0644]
target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch [new file with mode: 0644]
target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch [new file with mode: 0644]
target/linux/coldfire/patches/032-m5445x_edma_update.patch [new file with mode: 0644]
target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch [new file with mode: 0644]
target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/036-m5445x_pci.patch [new file with mode: 0644]
target/linux/coldfire/patches/037-m5445x_edma_callback.patch [new file with mode: 0644]
target/linux/coldfire/patches/038-m5445x_audio_rates.patch [new file with mode: 0644]
target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch [new file with mode: 0644]
target/linux/coldfire/patches/040-m5445x_usb_header_move.patch [new file with mode: 0644]
target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch [new file with mode: 0644]
target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch [new file with mode: 0644]
target/linux/coldfire/patches/044-m547x_8x_initial.patch [new file with mode: 0644]
target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch [new file with mode: 0644]
target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch [new file with mode: 0644]
target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch [new file with mode: 0644]
target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch [new file with mode: 0644]
target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch [new file with mode: 0644]
target/linux/coldfire/patches/052-m547x_8x_dspi.patch [new file with mode: 0644]
target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch [new file with mode: 0644]
target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch [new file with mode: 0644]
target/linux/coldfire/patches/055-m547x_8x_i2c.patch [new file with mode: 0644]
target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch [new file with mode: 0644]
target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch [new file with mode: 0644]
target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch [new file with mode: 0644]
target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch [new file with mode: 0644]
target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch [new file with mode: 0644]
target/linux/coldfire/patches/061-m5445x_rename_config.patch [new file with mode: 0644]
target/linux/coldfire/patches/062-mcfv4e_cache_split.patch [new file with mode: 0644]
target/linux/coldfire/patches/063-m5445x_rambar_config.patch [new file with mode: 0644]
target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch [new file with mode: 0644]
target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch [new file with mode: 0644]
target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch [new file with mode: 0644]
target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch [new file with mode: 0644]
target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch [new file with mode: 0644]
target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch [new file with mode: 0644]
target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch [new file with mode: 0644]
target/linux/coldfire/patches/071-m5445x_i2c.patch [new file with mode: 0644]
target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch [new file with mode: 0644]
target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch [new file with mode: 0644]
target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch [new file with mode: 0644]
target/linux/coldfire/patches/075-mcfv4e_watchdog.patch [new file with mode: 0644]
target/linux/coldfire/patches/076-mcfv4e_irda.patch [new file with mode: 0644]
target/linux/coldfire/patches/077-mcfv4e_flexcan.patch [new file with mode: 0644]
target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch [new file with mode: 0644]
target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch [new file with mode: 0644]
target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch [new file with mode: 0644]
target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch [new file with mode: 0644]
target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch [new file with mode: 0644]
target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch [new file with mode: 0644]
target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch [new file with mode: 0644]
target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch [new file with mode: 0644]
target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch [new file with mode: 0644]
target/linux/coldfire/patches/100-compile_fixes.patch

diff --git a/target/linux/coldfire/patches/001-cf.patch b/target/linux/coldfire/patches/001-cf.patch
deleted file mode 100644 (file)
index 66417e7..0000000
+++ /dev/null
@@ -1,51053 +0,0 @@
---- /dev/null
-+++ b/arch/m68k/coldfire/cache.c
-@@ -0,0 +1,43 @@
-+/*
-+ *  linux/arch/m68k/coldfire/cache.c
-+ *
-+ *  Matt Waddel Matt.Waddel@freescale.com
-+ *  Kurt Mahan kmahan@freescale.com
-+ *  Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ *  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/interrupt.h>
-+#include <asm/cfcache.h>
-+#include <asm/coldfire.h>
-+#include <asm/system.h>
-+
-+/* Cache Control Reg shadow reg */
-+unsigned long shadow_cacr;
-+
-+/**
-+ * cacr_set - Set the Cache Control Register
-+ * @x Value to set
-+ */
-+void cacr_set(unsigned long x)
-+{
-+      shadow_cacr = x;
-+
-+      __asm__ __volatile__ ("movec %0, %%cacr"
-+                            : /* no outputs */
-+                            : "r" (shadow_cacr));
-+}
-+
-+/**
-+ * cacr_get - Get the current value of the Cache Control Register
-+ *
-+ * @return CACR value
-+ */
-+unsigned long cacr_get(void)
-+{
-+      return shadow_cacr;
-+}
---- /dev/null
-+++ b/arch/m68k/coldfire/config.c
-@@ -0,0 +1,483 @@
-+/*
-+ *  linux/arch/m68k/coldfire/config.c
-+ *
-+ *  Kurt Mahan kmahan@freescale.com
-+ *  Matt Waddel Matt.Waddel@freescale.com
-+ *  Copyright Freescale Semiconductor, Inc. 2007, 2008
-+ *
-+ *  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/module.h>
-+#include <linux/init.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+#include <linux/console.h>
-+#include <linux/bootmem.h>
-+#include <linux/mm.h>
-+#include <asm/bootinfo.h>
-+#include <asm/machdep.h>
-+#include <asm/coldfire.h>
-+#include <asm/cfcache.h>
-+#include <asm/cacheflush.h>
-+#include <asm/io.h>
-+#include <asm/cfmmu.h>
-+#include <asm/setup.h>
-+#include <asm/irq.h>
-+#include <asm/traps.h>
-+#include <asm/movs.h>
-+#include <asm/movs.h>
-+#include <asm/page.h>
-+#include <asm/pgalloc.h>
-+
-+#include <asm/mcfsim.h>
-+
-+#if defined(CONFIG_M5445X)
-+#define UBOOT_EXTRA_CLOCKS
-+#elif defined(CONFIG_M547X_8X)
-+#define UBOOT_PCI
-+#endif
-+#include <asm/bootinfo.h>
-+
-+#ifdef CONFIG_M5445X
-+#include <asm/mcf5445x_intc.h>
-+#include <asm/mcf5445x_sdramc.h>
-+#include <asm/mcf5445x_fbcs.h>
-+#include <asm/mcf5445x_dtim.h>
-+#include <asm/mcf5445x_xbs.h>
-+#endif
-+
-+#ifdef CONFIG_M547X_8X
-+#include <asm/m5485gpt.h>
-+#endif
-+
-+extern int get_irq_list(struct seq_file *p, void *v);
-+extern char _text, _end;
-+extern char _etext, _edata, __init_begin, __init_end;
-+extern struct console mcfrs_console;
-+extern char m68k_command_line[CL_SIZE];
-+extern unsigned long availmem;
-+
-+static int irq_enable[NR_IRQS];
-+unsigned long num_pages;
-+
-+/* ethernet mac addresses from uboot */
-+unsigned char uboot_enet0[6];
-+unsigned char uboot_enet1[6];
-+
-+void coldfire_sort_memrec(void)
-+{
-+      int i, j;
-+
-+      /* Sort the m68k_memory records by address */
-+      for (i = 0; i < m68k_num_memory; ++i) {
-+              for (j = i + 1; j < m68k_num_memory; ++j) {
-+                      if (m68k_memory[i].addr > m68k_memory[j].addr) {
-+                              struct mem_info tmp;
-+                              tmp = m68k_memory[i];
-+                              m68k_memory[i] = m68k_memory[j];
-+                              m68k_memory[j] = tmp;
-+                      }
-+              }
-+      }
-+      /* Trim off discontiguous bits */
-+      for (i = 1; i < m68k_num_memory; ++i) {
-+              if ((m68k_memory[i-1].addr + m68k_memory[i-1].size) !=
-+                      m68k_memory[i].addr) {
-+                      printk(KERN_DEBUG "m68k_parse_bootinfo: addr gap between \
-+                              0x%lx & 0x%lx\n",
-+                              m68k_memory[i-1].addr+m68k_memory[i-1].size,
-+                              m68k_memory[i].addr);
-+                      m68k_num_memory = i;
-+                      break;
-+              }
-+      }
-+}
-+
-+/*
-+ * UBoot Handler
-+ */
-+int __init uboot_commandline(char *bootargs)
-+{
-+      int len = 0, cmd_line_len;
-+      static struct uboot_record uboot_info;
-+      u32 offset = PAGE_OFFSET_RAW - PHYS_OFFSET;
-+
-+      extern unsigned long uboot_info_stk;
-+
-+      /* validate address */
-+      if ((uboot_info_stk < PAGE_OFFSET_RAW) ||
-+          (uboot_info_stk >= (PAGE_OFFSET_RAW + CONFIG_SDRAM_SIZE)))
-+              return 0;
-+
-+      /* Add offset to get post-remapped kernel memory location */
-+      uboot_info.bdi = (struct bd_info *)((*(u32 *)(uboot_info_stk)) + offset);
-+      uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset;
-+      uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset;
-+      uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset;
-+      uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset;
-+
-+      /* copy over mac addresses */
-+      memcpy(uboot_enet0, uboot_info.bdi->bi_enet0addr, 6);
-+      memcpy(uboot_enet1, uboot_info.bdi->bi_enet1addr, 6);
-+
-+      /* copy command line */
-+      cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start;
-+      if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1))
-+              len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\
-+                                 cmd_line_len);
-+
-+      return len;
-+}
-+
-+/*
-+ * This routine does things not done in the bootloader.
-+ */
-+#if defined(CONFIG_M54451)
-+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1"
-+#elif defined(CONFIG_M54455)
-+#define MTD_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
-+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.55:172.27.155.1"
-+#elif defined(CONFIG_M547X_8X)
-+#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.75:172.27.155.1"
-+#endif
-+asmlinkage void __init cf_early_init(void)
-+{
-+      struct bi_record *record = (struct bi_record *) &_end;
-+
-+      extern char _end;
-+
-+#if defined(CONFIG_M5445X)
-+      SET_VBR((void *)MCF_RAMBAR1);
-+#elif defined(CONFIG_M547X_8X)
-+      SET_VBR((void *)MCF_RAMBAR0);
-+#endif
-+
-+      /* Mask all interrupts */
-+#if defined(CONFIG_M5445X)
-+      MCF_INTC0_IMRL = 0xFFFFFFFF;
-+      MCF_INTC0_IMRH = 0xFFFFFFFF;
-+      MCF_INTC1_IMRL = 0xFFFFFFFF;
-+      MCF_INTC1_IMRH = 0xFFFFFFFF;
-+#elif defined(CONFIG_M547X_8X)
-+      MCF_IMRL = 0xFFFFFFFF;
-+      MCF_IMRH = 0xFFFFFFFF;
-+#endif
-+
-+#if defined(CONFIG_M5445X)
-+#if defined(CONFIG_NOR_FLASH_BASE)
-+      MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE;
-+#else
-+      MCF_FBCS_CSAR(1) = 0x00000000;
-+#endif
-+
-+#if CONFIG_SDRAM_SIZE > (256*1024*1024)
-+      /* Init optional SDRAM chip select */
-+      MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B;
-+#endif
-+#endif /* CONFIG_M5445X */
-+
-+#if defined(CONFIG_M5445X)
-+      /* Setup SDRAM crossbar(XBS) priorities */
-+      MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) |
-+                      MCF_XBS_PRS_M1(MCF_XBS_PRI_3) |
-+                      MCF_XBS_PRS_M2(MCF_XBS_PRI_4) |
-+                      MCF_XBS_PRS_M3(MCF_XBS_PRI_5) |
-+                      MCF_XBS_PRS_M5(MCF_XBS_PRI_6) |
-+                      MCF_XBS_PRS_M6(MCF_XBS_PRI_1) |
-+                      MCF_XBS_PRS_M7(MCF_XBS_PRI_7));
-+#endif
-+
-+      m68k_machtype = MACH_CFMMU;
-+      m68k_fputype = FPU_CFV4E;
-+      m68k_mmutype = MMU_CFV4E;
-+      m68k_cputype = CPU_CFV4E;
-+
-+      m68k_num_memory = 0;
-+      m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
-+      m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
-+
-+      if (!uboot_commandline(m68k_command_line)) {
-+#if defined(CONFIG_BOOTPARAM)
-+              strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
-+#else
-+              strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
-+#endif
-+      }
-+
-+#if defined(CONFIG_BLK_DEV_INITRD)
-+      /* add initrd image */
-+      record = (struct bi_record *) ((void *)record + record->size);
-+      record->tag = BI_RAMDISK;
-+      record->size =  sizeof(record->tag) + sizeof(record->size)
-+              + sizeof(record->data[0]) + sizeof(record->data[1]);
-+#endif
-+
-+      /* Mark end of tags. */
-+      record = (struct bi_record *) ((void *) record + record->size);
-+      record->tag = 0;
-+      record->data[0] = 0;
-+      record->data[1] = 0;
-+      record->size = sizeof(record->tag) + sizeof(record->size)
-+              + sizeof(record->data[0]) + sizeof(record->data[1]);
-+
-+      /* Invalidate caches via CACR */
-+      flush_bcache();
-+      cacr_set(CACHE_DISABLE_MODE);
-+
-+      /* Turn on caches via CACR, enable EUSP */
-+      cacr_set(CACHE_INITIAL_MODE);
-+
-+}
-+
-+#if defined(CONFIG_M5445X)
-+void settimericr(unsigned int timer, unsigned int level)
-+{
-+      volatile unsigned char *icrp;
-+      unsigned int icr;
-+      unsigned char irq;
-+
-+      if (timer <= 2) {
-+              switch (timer) {
-+              case 2:  irq = 33; icr = MCFSIM_ICR_TIMER2; break;
-+              default: irq = 32; icr = MCFSIM_ICR_TIMER1; break;
-+              }
-+
-+              icrp = (volatile unsigned char *) (icr);
-+              *icrp = level;
-+              coldfire_enable_irq0(irq);
-+      }
-+}
-+#endif
-+
-+/* Assembler routines */
-+asmlinkage void buserr(void);
-+asmlinkage void trap(void);
-+asmlinkage void system_call(void);
-+asmlinkage void inthandler(void);
-+
-+void __init coldfire_trap_init(void)
-+{
-+      int i = 0;
-+      e_vector *vectors;
-+
-+#if defined(CONFIG_M5445X)
-+      vectors = (e_vector *)MCF_RAMBAR1;
-+#elif defined(CONFIG_M547X_8X)
-+      vectors = (e_vector *)MCF_RAMBAR0;
-+#endif
-+      /*
-+       * There is a common trap handler and common interrupt
-+       * handler that handle almost every vector. We treat
-+       * the system call and bus error special, they get their
-+       * own first level handlers.
-+       */
-+      for (i = 3; (i <= 23); i++)
-+              vectors[i] = trap;
-+      for (i = 33; (i <= 63); i++)
-+              vectors[i] = trap;
-+      for (i = 24; (i <= 31); i++)
-+              vectors[i] = inthandler;
-+      for (i = 64; (i < 255); i++)
-+              vectors[i] = inthandler;
-+
-+      vectors[255] = 0;
-+      vectors[2] = buserr;
-+      vectors[32] = system_call;
-+}
-+
-+#if defined(CONFIG_M5445X)
-+
-+void coldfire_tick(void)
-+{
-+      /* Reset the ColdFire timer */
-+      __raw_writeb(MCF_DTIM_DTER_CAP | MCF_DTIM_DTER_REF, MCF_DTIM0_DTER);
-+}
-+
-+void __init coldfire_sched_init(irq_handler_t handler)
-+{
-+      unsigned int    mcf_timerlevel = 5;
-+      unsigned int    mcf_timervector = 64+32;
-+
-+      __raw_writew(MCF_DTIM_DTMR_RST_RST, MCF_DTIM0_DTMR);
-+      __raw_writel(((MCF_BUSCLK / 16) / HZ), MCF_DTIM0_DTRR);
-+      __raw_writew(MCF_DTIM_DTMR_ORRI | MCF_DTIM_DTMR_CLK_DIV16 |
-+                   MCF_DTIM_DTMR_FRR  | MCF_DTIM_DTMR_RST_EN, \
-+                   MCF_DTIM0_DTMR);
-+
-+      request_irq(mcf_timervector, handler, IRQF_DISABLED, \
-+                  "timer", (void *)MCF_DTIM0_DTMR);
-+
-+      settimericr(1, mcf_timerlevel);
-+}
-+
-+int timerirqpending(int timer)
-+{
-+      unsigned int imr = 0;
-+
-+      switch (timer) {
-+      case 1:  imr = 0x1; break;
-+      case 2:  imr = 0x2; break;
-+      default: break;
-+      }
-+
-+      return (getiprh() & imr);
-+}
-+
-+unsigned long coldfire_gettimeoffset(void)
-+{
-+      volatile unsigned long trr, tcn, offset;
-+
-+      tcn = __raw_readw(MCF_DTIM0_DTCN);
-+      trr = __raw_readl(MCF_DTIM0_DTRR);
-+      offset = (tcn * (1000000 / HZ)) / trr;
-+
-+      /* Check if we just wrapped the counters and maybe missed a tick */
-+      if ((offset < (1000000 / HZ / 2)) && timerirqpending(1))
-+              offset += 1000000 / HZ;
-+      return offset;
-+}
-+
-+#elif defined(CONFIG_M547X_8X)
-+
-+void coldfire_tick(void)
-+{
-+      /* Reset the ColdFire timer */
-+      MCF_SSR(0) = MCF_SSR_ST;
-+}
-+
-+void __init coldfire_sched_init(irq_handler_t handler)
-+{
-+      int irq = ISC_SLTn(0);
-+
-+      MCF_SCR(0) = 0;
-+      MCF_ICR(irq) = ILP_SLT0;
-+      request_irq(64 + irq, handler, IRQF_DISABLED, "ColdFire Timer 0", NULL);
-+      MCF_SLTCNT(0) = MCF_BUSCLK / HZ;
-+      MCF_SCR(0) |=  MCF_SCR_TEN | MCF_SCR_IEN | MCF_SCR_RUN;
-+}
-+
-+unsigned long coldfire_gettimeoffset(void)
-+{
-+      volatile unsigned long trr, tcn, offset;
-+      trr = MCF_SLTCNT(0);
-+      tcn = MCF_SCNT(0);
-+
-+      offset = (trr - tcn) * ((1000000 >> 3) / HZ) / (trr >> 3);
-+      if (MCF_SSR(0) & MCF_SSR_ST)
-+              offset += 1000000 / HZ;
-+
-+      return offset;
-+}
-+
-+#endif
-+
-+void coldfire_reboot(void)
-+{
-+#if defined(CONFIG_M5445X)
-+      /* disable interrupts and do a software reset */
-+      asm("movew #0x2700, %%sr\n\t"
-+          "moveb #0x80, %%d0\n\t"
-+          "moveb %%d0, 0xfc0a0000\n\t"
-+          : : : "%d0");
-+#elif defined(CONFIG_M547X_8X)
-+      /* disable interrupts and enable the watchdog */
-+      printk(KERN_INFO "Rebooting\n");
-+      asm("movew #0x2700, %sr\n");
-+      MCF_GPT_GMS0 = MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS(4);
-+#endif
-+}
-+
-+static void coldfire_get_model(char *model)
-+{
-+      sprintf(model, "Version 4 ColdFire");
-+}
-+
-+static void __init
-+coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end)
-+{
-+      unsigned long base_pfn;
-+
-+      /* compute total pages in system */
-+      num_pages = PAGE_ALIGN(memory_end - PAGE_OFFSET) >> PAGE_SHIFT;
-+
-+      /* align start/end to page boundries */
-+      memory_start = PAGE_ALIGN(memory_start);
-+      memory_end = memory_end & PAGE_MASK;
-+
-+      /* page numbers */
-+      base_pfn = __pa(PAGE_OFFSET) >> PAGE_SHIFT;
-+      min_low_pfn = __pa(memory_start) >> PAGE_SHIFT;
-+      max_low_pfn = __pa(memory_end) >> PAGE_SHIFT;
-+
-+      high_memory = (void *)memory_end;
-+      availmem = memory_start;
-+
-+      /* setup bootmem data */
-+      m68k_setup_node(0);
-+      availmem += init_bootmem_node(NODE_DATA(0), min_low_pfn,
-+              base_pfn, max_low_pfn);
-+      availmem = PAGE_ALIGN(availmem);
-+      free_bootmem(__pa(availmem), memory_end - (availmem));
-+}
-+
-+void __init config_coldfire(void)
-+{
-+      unsigned long endmem, startmem;
-+      int i;
-+
-+      /*
-+       * Calculate endmem from m68k_memory, assume all are contiguous
-+       */
-+      startmem = ((((int) &_end) + (PAGE_SIZE - 1)) & PAGE_MASK);
-+      endmem = PAGE_OFFSET;
-+      for (i = 0; i < m68k_num_memory; ++i)
-+              endmem += m68k_memory[i].size;
-+
-+      printk(KERN_INFO "starting up linux startmem 0x%lx, endmem 0x%lx, \
-+              size %luMB\n", startmem,  endmem, (endmem - startmem) >> 20);
-+
-+      memset(irq_enable, 0, sizeof(irq_enable));
-+
-+      /*
-+       * Setup coldfire mach-specific handlers
-+       */
-+      mach_max_dma_address    = 0xffffffff;
-+      mach_sched_init         = coldfire_sched_init;
-+      mach_tick               = coldfire_tick;
-+      mach_gettimeoffset      = coldfire_gettimeoffset;
-+      mach_reset              = coldfire_reboot;
-+/*    mach_hwclk              = coldfire_hwclk; to be done */
-+      mach_get_model          = coldfire_get_model;
-+
-+      coldfire_bootmem_alloc(startmem, endmem-1);
-+
-+      /*
-+       * initrd setup
-+       */
-+/* #ifdef CONFIG_BLK_DEV_INITRD
-+      if (m68k_ramdisk.size)  {
-+              reserve_bootmem (__pa(m68k_ramdisk.addr), m68k_ramdisk.size);
-+              initrd_start = (unsigned long) m68k_ramdisk.addr;
-+              initrd_end = initrd_start + m68k_ramdisk.size;
-+              printk (KERN_DEBUG "initrd: %08lx - %08lx\n", initrd_start,
-+                      initrd_end);
-+      }
-+#endif */
-+
-+#if defined(CONFIG_DUMMY_CONSOLE) || defined(CONFIG_FRAMEBUFFER_CONSOLE)
-+      conswitchp = &dummy_con;
-+#endif
-+
-+#if defined(CONFIG_SERIAL_COLDFIRE)
-+      /*
-+       * This causes trouble when it is re-registered later.
-+       * Currently this is fixed by conditionally commenting
-+       * out the register_console in mcf_serial.c
-+       */
-+      register_console(&mcfrs_console);
-+#endif
-+}
---- /dev/null
-+++ b/arch/m68k/coldfire/entry.S
-@@ -0,0 +1,711 @@
-+/*
-+ *  arch/m68k/coldfire/entry.S
-+ *
-+ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
-+ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                      Kenneth Albanowski <kjahds@kjahds.com>,
-+ *  Copyright (C) 2000  Lineo Inc. (www.lineo.com)
-+ *  Copyright (C) 2004-2006  Macq Electronique SA. (www.macqel.com)
-+ *  Matt Waddel Matt.Waddel@freescale.com
-+ *  Kurt Mahan kmahan@freescale.com
-+ *  Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ *  Modify irq status in buserr -- (c) Copyright 2008, SYSTEM electronic Gmbh
-+ *
-+ * Based on:
-+ *
-+ *  arch/m68knommu/platform/5307/entry.S &
-+ *  arch/m68k/kernel/entry.S
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file README.legal in the main directory of this archive
-+ * for more details.
-+ *
-+ * Linux/m68k support by Hamish Macdonald
-+ *
-+ * ColdFire support by Greg Ungerer (gerg@snapgear.com)
-+ * 5307 fixes by David W. Miller
-+ * linux 2.4 support David McCullough <davidm@snapgear.com>
-+ * Bug, speed and maintainability fixes by Philippe De Muyter <phdm@macqel.be>
-+ * Ported to mmu Coldfire by Matt Waddel
-+ */
-+
-+#include <linux/sys.h>
-+#include <linux/linkage.h>
-+#include <asm/cf_entry.h>
-+#include <asm/errno.h>
-+#include <asm/setup.h>
-+#include <asm/segment.h>
-+#include <asm/traps.h>
-+#include <asm/unistd.h>
-+
-+/*
-+ * TASK_INFO:
-+ *
-+ *  - TINFO_PREEMPT (struct thread_info / preempt_count)
-+ *      Used to keep track of preemptability
-+ *  - TINFO_FLAGS (struct thread_info / flags - include/asm-m68k/thread_info.h)
-+ *      Various bit flags that are checked for scheduling/tracing
-+ *    Bits 0-7  are checked every exception exit
-+ *         8-15 are checked every syscall exit
-+ *
-+ *      TIF_SIGPENDING                6
-+ *      TIF_NEED_RESCHED      7
-+ *      TIF_DELAYED_TRACE     14
-+ *      TIF_SYSCALL_TRACE     15
-+ *      TIF_MEMDIE            16 (never checked here)
-+ */
-+
-+.bss
-+
-+sw_ksp:
-+.long 0
-+
-+sw_usp:
-+.long 0
-+
-+.text
-+
-+.globl system_call
-+.globl buserr
-+.globl trap
-+.globl resume
-+.globl ret_from_exception
-+.globl ret_from_signal
-+.globl sys_call_table
-+.globl ret_from_interrupt
-+.globl inthandler
-+
-+ENTRY(buserr)
-+#ifdef CONFIG_COLDFIRE_FOO
-+      movew   #0x2700,%sr             /* lock interrupts */
-+#endif
-+      SAVE_ALL_INT
-+#ifdef        CONFIG_COLDFIRE_FOO
-+      movew   PT_SR(%sp),%d3          /* get original %sr */
-+      oril    #0x2000,%d3             /* set supervisor mode in it */
-+      movew   %d3,%sr                 /* recover irq state */
-+#endif
-+      GET_CURRENT(%d0)
-+      movel   %sp,%sp@-               /* stack frame pointer argument */
-+      jsr     buserr_c
-+      addql   #4,%sp
-+      jra     .Lret_from_exception
-+
-+ENTRY(trap)
-+      SAVE_ALL_INT
-+      GET_CURRENT(%d0)
-+      movel   %sp,%sp@-               /* stack frame pointer argument */
-+      jsr     trap_c
-+      addql   #4,%sp
-+      jra     .Lret_from_exception
-+
-+      /* After a fork we jump here directly from resume,
-+         %d1 contains the previous task schedule_tail */
-+ENTRY(ret_from_fork)
-+      movel   %d1,%sp@-
-+      jsr     schedule_tail
-+      addql   #4,%sp
-+      jra     .Lret_from_exception
-+
-+do_trace_entry:
-+      movel   #-ENOSYS,%d1            /* needed for strace */
-+      movel   %d1,%sp@(PT_D0)
-+      subql   #4,%sp
-+      SAVE_SWITCH_STACK
-+      jbsr    syscall_trace
-+      RESTORE_SWITCH_STACK
-+      addql   #4,%sp
-+      movel   %sp@(PT_ORIG_D0),%d0
-+      cmpl    #NR_syscalls,%d0
-+      jcs     syscall
-+badsys:
-+      movel   #-ENOSYS,%d1
-+      movel   %d1,%sp@(PT_D0)
-+      jra     ret_from_exception
-+
-+do_trace_exit:
-+      subql   #4,%sp
-+      SAVE_SWITCH_STACK
-+      jbsr    syscall_trace
-+      RESTORE_SWITCH_STACK
-+      addql   #4,%sp
-+      jra     .Lret_from_exception
-+
-+ENTRY(ret_from_signal)
-+      RESTORE_SWITCH_STACK
-+      addql   #4,%sp
-+      jra     .Lret_from_exception
-+
-+ENTRY(system_call)
-+      SAVE_ALL_SYS
-+
-+      GET_CURRENT(%d1)
-+      /* save top of frame */
-+      movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
-+
-+      /* syscall trace */
-+      tstb    %curptr@(TASK_INFO+TINFO_FLAGS+2)
-+      jmi     do_trace_entry          /* SYSCALL_TRACE is set */
-+      cmpl    #NR_syscalls,%d0
-+      jcc     badsys
-+syscall:
-+      movel   #sys_call_table,%a0
-+      asll    #2,%d0
-+      addl    %d0,%a0
-+      movel   %a0@,%a0
-+      jsr     %a0@
-+      movel   %d0,%sp@(PT_D0)         /* save the return value */
-+ret_from_syscall:
-+      movew   %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
-+      jne     syscall_exit_work       /* flags set so process */
-+1:    RESTORE_ALL
-+
-+syscall_exit_work:
-+      btst    #5,%sp@(PT_SR)          /* check if returning to kernel */
-+      bnes    1b                      /* if so, skip resched, signals */
-+
-+      btstl   #15,%d0                 /* check if SYSCALL_TRACE */
-+      jne     do_trace_exit
-+      btstl   #14,%d0                 /* check if DELAYED_TRACE */
-+      jne     do_delayed_trace
-+      btstl   #6,%d0                  /* check if SIGPENDING */
-+      jne     do_signal_return
-+      pea     resume_userspace
-+      jra     schedule
-+
-+ENTRY(ret_from_exception)
-+.Lret_from_exception:
-+      btst    #5,%sp@(PT_SR)          /* check if returning to kernel */
-+      bnes    1f                      /* if so, skip resched, signals */
-+      movel   %d0,%sp@-               /* Only allow interrupts when we are  */
-+      move    %sr,%d0                 /* last one on the kernel stack,      */
-+      andl    #ALLOWINT,%d0           /* otherwise stack overflow can occur */
-+      move    %d0,%sr                 /* during heavy interrupt load.       */
-+      movel   %sp@+,%d0
-+
-+resume_userspace:
-+      moveb   %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
-+      jne     exit_work       /* SIGPENDING and/or NEED_RESCHED set */
-+1:    RESTORE_ALL
-+
-+exit_work:
-+      /* save top of frame */
-+      movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
-+      btstl   #6,%d0                  /* check for SIGPENDING in flags */
-+      jne     do_signal_return
-+      pea     resume_userspace
-+      jra     schedule
-+
-+do_signal_return:
-+      subql   #4,%sp                  /* dummy return address */
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      clrl    %sp@-
-+      bsrl    do_signal
-+      addql   #8,%sp
-+      RESTORE_SWITCH_STACK
-+      addql   #4,%sp
-+      jbra    resume_userspace
-+
-+do_delayed_trace:
-+      bclr    #7,%sp@(PT_SR)          /* clear trace bit in SR */
-+      pea     1                       /* send SIGTRAP */
-+      movel   %curptr,%sp@-
-+      pea     LSIGTRAP
-+      jbsr    send_sig
-+      addql   #8,%sp
-+      addql   #4,%sp
-+      jbra    resume_userspace
-+
-+/*
-+ * This is the interrupt handler (for all hardware interrupt
-+ * sources). It figures out the vector number and calls the appropriate
-+ * interrupt service routine directly.
-+ */
-+ENTRY(inthandler)
-+      SAVE_ALL_INT
-+      GET_CURRENT(%d0)
-+      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+      /* put exception # in d0 */
-+      movel   %sp@(PT_VECTOR),%d0
-+      swap    %d0                     /* extract bits 25:18 */
-+      lsrl    #2,%d0
-+      andl    #0x0ff,%d0
-+
-+      movel   %sp,%sp@-
-+      movel   %d0,%sp@-               /* put vector # on stack */
-+auto_irqhandler_fixup = . + 2
-+      jbsr    process_int             /* process the IRQ */
-+      addql   #8,%sp                  /* pop parameters off stack */
-+
-+ENTRY(ret_from_interrupt)
-+ret_from_interrupt:
-+
-+      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+      jeq     ret_from_last_interrupt
-+2:    RESTORE_ALL
-+
-+      ALIGN
-+ret_from_last_interrupt:
-+      moveb   %sp@(PT_SR),%d0
-+      andl    #(~ALLOWINT>>8)&0xff,%d0
-+      jne     2b
-+
-+      /* check if we need to do software interrupts */
-+      tstl    irq_stat+CPUSTAT_SOFTIRQ_PENDING
-+      jeq     .Lret_from_exception
-+      pea     ret_from_exception
-+      jra     do_softirq
-+
-+ENTRY(user_inthandler)
-+      SAVE_ALL_INT
-+      GET_CURRENT(%d0)
-+      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+      /* put exception # in d0 */
-+      movel   %sp@(PT_VECTOR),%d0
-+user_irqvec_fixup = . + 2
-+      swap    %d0                     /* extract bits 25:18 */
-+      lsrl    #2,%d0
-+      andl    #0x0ff,%d0
-+
-+      movel   %sp,%sp@-
-+      movel   %d0,%sp@-               /* put vector # on stack */
-+user_irqhandler_fixup = . + 2
-+      jbsr    process_int             /* process the IRQ */
-+      addql   #8,%sp                  /* pop parameters off stack */
-+
-+      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+      jeq     ret_from_last_interrupt
-+        RESTORE_ALL
-+
-+/* Handler for uninitialized and spurious interrupts */
-+
-+ENTRY(bad_inthandler)
-+      SAVE_ALL_INT
-+      GET_CURRENT(%d0)
-+      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+
-+      movel   %sp,%sp@-
-+      jsr     handle_badint
-+      addql   #4,%sp
-+
-+      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
-+      jeq     ret_from_last_interrupt
-+      RESTORE_ALL
-+
-+ENTRY(sys_fork)
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      jbsr    m68k_fork
-+      addql   #4,%sp
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_clone)
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      jbsr    m68k_clone
-+      addql   #4,%sp
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_vfork)
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      jbsr    m68k_vfork
-+      addql   #4,%sp
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_sigsuspend)
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      jbsr    do_sigsuspend
-+      addql   #4,%sp
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_rt_sigsuspend)
-+      SAVE_SWITCH_STACK
-+      pea     %sp@(SWITCH_STACK_SIZE)
-+      jbsr    do_rt_sigsuspend
-+      addql   #4,%sp
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_sigreturn)
-+      SAVE_SWITCH_STACK
-+      jbsr    do_sigreturn
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+ENTRY(sys_rt_sigreturn)
-+      SAVE_SWITCH_STACK
-+      jbsr    do_rt_sigreturn
-+      RESTORE_SWITCH_STACK
-+      rts
-+
-+resume:
-+      /*
-+       * Beware - when entering resume, prev (the current task) is
-+       * in a0, next (the new task) is in a1,so don't change these
-+       * registers until their contents are no longer needed.
-+       */
-+
-+      /* save sr */
-+      movew   %sr,%d0
-+      movew   %d0,%a0@(TASK_THREAD+THREAD_SR)
-+
-+      /* save usp */
-+      /* Save USP via %a1 (which is saved/restored from %d0) */
-+      movel   %a1,%d0
-+      movel   %usp,%a1
-+      movel   %a1,%a0@(TASK_THREAD+THREAD_USP)
-+      movel   %d0,%a1
-+
-+      /* save non-scratch registers on stack */
-+      SAVE_SWITCH_STACK
-+
-+      /* save current kernel stack pointer */
-+      movel   %sp,%a0@(TASK_THREAD+THREAD_KSP)
-+
-+      /* Return previous task in %d1 */
-+      movel   %curptr,%d1
-+
-+      /* switch to new task (a1 contains new task) */
-+      movel   %a1,%curptr
-+
-+      /* restore the kernel stack pointer */
-+      movel   %a1@(TASK_THREAD+THREAD_KSP),%sp
-+
-+      /* restore non-scratch registers */
-+      RESTORE_SWITCH_STACK
-+
-+      /* restore user stack pointer */
-+      movel   %a1@(TASK_THREAD+THREAD_USP),%a0
-+      movel   %a0,%usp
-+
-+      /* restore status register */
-+      movew   %a1@(TASK_THREAD+THREAD_SR),%d0
-+      movew   %d0,%sr
-+
-+      rts
-+
-+.data
-+ALIGN
-+sys_call_table:
-+      .long sys_ni_syscall    /* 0  -  old "setup()" system call*/
-+      .long sys_exit
-+      .long sys_fork
-+      .long sys_read
-+      .long sys_write
-+      .long sys_open          /* 5 */
-+      .long sys_close
-+      .long sys_waitpid
-+      .long sys_creat
-+      .long sys_link
-+      .long sys_unlink        /* 10 */
-+      .long sys_execve
-+      .long sys_chdir
-+      .long sys_time
-+      .long sys_mknod
-+      .long sys_chmod         /* 15 */
-+      .long sys_chown16
-+      .long sys_ni_syscall                    /* old break syscall holder */
-+      .long sys_stat
-+      .long sys_lseek
-+      .long sys_getpid        /* 20 */
-+      .long sys_mount
-+      .long sys_oldumount
-+      .long sys_setuid16
-+      .long sys_getuid16
-+      .long sys_stime         /* 25 */
-+      .long sys_ptrace
-+      .long sys_alarm
-+      .long sys_fstat
-+      .long sys_pause
-+      .long sys_utime         /* 30 */
-+      .long sys_ni_syscall                    /* old stty syscall holder */
-+      .long sys_ni_syscall                    /* old gtty syscall holder */
-+      .long sys_access
-+      .long sys_nice
-+      .long sys_ni_syscall    /* 35 */        /* old ftime syscall holder */
-+      .long sys_sync
-+      .long sys_kill
-+      .long sys_rename
-+      .long sys_mkdir
-+      .long sys_rmdir         /* 40 */
-+      .long sys_dup
-+      .long sys_pipe
-+      .long sys_times
-+      .long sys_ni_syscall                    /* old prof syscall holder */
-+      .long sys_brk           /* 45 */
-+      .long sys_setgid16
-+      .long sys_getgid16
-+      .long sys_signal
-+      .long sys_geteuid16
-+      .long sys_getegid16     /* 50 */
-+      .long sys_acct
-+      .long sys_umount                        /* recycled never used phys() */
-+      .long sys_ni_syscall                    /* old lock syscall holder */
-+      .long sys_ioctl
-+      .long sys_fcntl         /* 55 */
-+      .long sys_ni_syscall                    /* old mpx syscall holder */
-+      .long sys_setpgid
-+      .long sys_ni_syscall                    /* old ulimit syscall holder */
-+      .long sys_ni_syscall
-+      .long sys_umask         /* 60 */
-+      .long sys_chroot
-+      .long sys_ustat
-+      .long sys_dup2
-+      .long sys_getppid
-+      .long sys_getpgrp       /* 65 */
-+      .long sys_setsid
-+      .long sys_sigaction
-+      .long sys_sgetmask
-+      .long sys_ssetmask
-+      .long sys_setreuid16    /* 70 */
-+      .long sys_setregid16
-+      .long sys_sigsuspend
-+      .long sys_sigpending
-+      .long sys_sethostname
-+      .long sys_setrlimit     /* 75 */
-+      .long sys_old_getrlimit
-+      .long sys_getrusage
-+      .long sys_gettimeofday
-+      .long sys_settimeofday
-+      .long sys_getgroups16   /* 80 */
-+      .long sys_setgroups16
-+      .long old_select
-+      .long sys_symlink
-+      .long sys_lstat
-+      .long sys_readlink      /* 85 */
-+      .long sys_uselib
-+      .long sys_swapon
-+      .long sys_reboot
-+      .long old_readdir
-+      .long old_mmap          /* 90 */
-+      .long sys_munmap
-+      .long sys_truncate
-+      .long sys_ftruncate
-+      .long sys_fchmod
-+      .long sys_fchown16      /* 95 */
-+      .long sys_getpriority
-+      .long sys_setpriority
-+      .long sys_ni_syscall                    /* old profil syscall holder */
-+      .long sys_statfs
-+      .long sys_fstatfs       /* 100 */
-+      .long sys_ni_syscall                    /* ioperm for i386 */
-+      .long sys_socketcall
-+      .long sys_syslog
-+      .long sys_setitimer
-+      .long sys_getitimer     /* 105 */
-+      .long sys_newstat
-+      .long sys_newlstat
-+      .long sys_newfstat
-+      .long sys_ni_syscall
-+      .long sys_ni_syscall    /* 110 */       /* iopl for i386 */
-+      .long sys_vhangup
-+      .long sys_ni_syscall                    /* obsolete idle() syscall */
-+      .long sys_ni_syscall                    /* vm86old for i386 */
-+      .long sys_wait4
-+      .long sys_swapoff       /* 115 */
-+      .long sys_sysinfo
-+      .long sys_ipc
-+      .long sys_fsync
-+      .long sys_sigreturn
-+      .long sys_clone         /* 120 */
-+      .long sys_setdomainname
-+      .long sys_newuname
-+      .long sys_cacheflush                    /* modify_ldt for i386 */
-+      .long sys_adjtimex
-+      .long sys_mprotect      /* 125 */
-+      .long sys_sigprocmask
-+      .long sys_ni_syscall                    /* old "create_module" */
-+      .long sys_init_module
-+      .long sys_delete_module
-+      .long sys_ni_syscall    /* 130 - old "get_kernel_syms" */
-+      .long sys_quotactl
-+      .long sys_getpgid
-+      .long sys_fchdir
-+      .long sys_bdflush
-+      .long sys_sysfs         /* 135 */
-+      .long sys_personality
-+      .long sys_ni_syscall                    /* for afs_syscall */
-+      .long sys_setfsuid16
-+      .long sys_setfsgid16
-+      .long sys_llseek        /* 140 */
-+      .long sys_getdents
-+      .long sys_select
-+      .long sys_flock
-+      .long sys_msync
-+      .long sys_readv         /* 145 */
-+      .long sys_writev
-+      .long sys_getsid
-+      .long sys_fdatasync
-+      .long sys_sysctl
-+      .long sys_mlock         /* 150 */
-+      .long sys_munlock
-+      .long sys_mlockall
-+      .long sys_munlockall
-+      .long sys_sched_setparam
-+      .long sys_sched_getparam        /* 155 */
-+      .long sys_sched_setscheduler
-+      .long sys_sched_getscheduler
-+      .long sys_sched_yield
-+      .long sys_sched_get_priority_max
-+      .long sys_sched_get_priority_min  /* 160 */
-+      .long sys_sched_rr_get_interval
-+      .long sys_nanosleep
-+      .long sys_mremap
-+      .long sys_setresuid16
-+      .long sys_getresuid16   /* 165 */
-+      .long sys_getpagesize
-+      .long sys_ni_syscall                    /* old sys_query_module */
-+      .long sys_poll
-+      .long sys_nfsservctl
-+      .long sys_setresgid16   /* 170 */
-+      .long sys_getresgid16
-+      .long sys_prctl
-+      .long sys_rt_sigreturn
-+      .long sys_rt_sigaction
-+      .long sys_rt_sigprocmask        /* 175 */
-+      .long sys_rt_sigpending
-+      .long sys_rt_sigtimedwait
-+      .long sys_rt_sigqueueinfo
-+      .long sys_rt_sigsuspend
-+      .long sys_pread64       /* 180 */
-+      .long sys_pwrite64
-+      .long sys_lchown16;
-+      .long sys_getcwd
-+      .long sys_capget
-+      .long sys_capset        /* 185 */
-+      .long sys_sigaltstack
-+      .long sys_sendfile
-+      .long sys_ni_syscall                    /* streams1 */
-+      .long sys_ni_syscall                    /* streams2 */
-+      .long sys_vfork         /* 190 */
-+      .long sys_getrlimit
-+      .long sys_mmap2
-+      .long sys_truncate64
-+      .long sys_ftruncate64
-+      .long sys_stat64        /* 195 */
-+      .long sys_lstat64
-+      .long sys_fstat64
-+      .long sys_chown
-+      .long sys_getuid
-+      .long sys_getgid        /* 200 */
-+      .long sys_geteuid
-+      .long sys_getegid
-+      .long sys_setreuid
-+      .long sys_setregid
-+      .long sys_getgroups     /* 205 */
-+      .long sys_setgroups
-+      .long sys_fchown
-+      .long sys_setresuid
-+      .long sys_getresuid
-+      .long sys_setresgid     /* 210 */
-+      .long sys_getresgid
-+      .long sys_lchown
-+      .long sys_setuid
-+      .long sys_setgid
-+      .long sys_setfsuid      /* 215 */
-+      .long sys_setfsgid
-+      .long sys_pivot_root
-+      .long sys_ni_syscall
-+      .long sys_ni_syscall
-+      .long sys_getdents64    /* 220 */
-+      .long sys_gettid
-+      .long sys_tkill
-+      .long sys_setxattr
-+      .long sys_lsetxattr
-+      .long sys_fsetxattr     /* 225 */
-+      .long sys_getxattr
-+      .long sys_lgetxattr
-+      .long sys_fgetxattr
-+      .long sys_listxattr
-+      .long sys_llistxattr    /* 230 */
-+      .long sys_flistxattr
-+      .long sys_removexattr
-+      .long sys_lremovexattr
-+      .long sys_fremovexattr
-+      .long sys_futex         /* 235 */
-+      .long sys_sendfile64
-+      .long sys_mincore
-+      .long sys_madvise
-+      .long sys_fcntl64
-+      .long sys_readahead     /* 240 */
-+      .long sys_io_setup
-+      .long sys_io_destroy
-+      .long sys_io_getevents
-+      .long sys_io_submit
-+      .long sys_io_cancel     /* 245 */
-+      .long sys_fadvise64
-+      .long sys_exit_group
-+      .long sys_lookup_dcookie
-+      .long sys_epoll_create
-+      .long sys_epoll_ctl     /* 250 */
-+      .long sys_epoll_wait
-+      .long sys_remap_file_pages
-+      .long sys_set_tid_address
-+      .long sys_timer_create
-+      .long sys_timer_settime /* 255 */
-+      .long sys_timer_gettime
-+      .long sys_timer_getoverrun
-+      .long sys_timer_delete
-+      .long sys_clock_settime
-+      .long sys_clock_gettime /* 260 */
-+      .long sys_clock_getres
-+      .long sys_clock_nanosleep
-+      .long sys_statfs64
-+      .long sys_fstatfs64
-+      .long sys_tgkill        /* 265 */
-+      .long sys_utimes
-+      .long sys_fadvise64_64
-+      .long sys_mbind 
-+      .long sys_get_mempolicy
-+      .long sys_set_mempolicy /* 270 */
-+      .long sys_mq_open
-+      .long sys_mq_unlink
-+      .long sys_mq_timedsend
-+      .long sys_mq_timedreceive
-+      .long sys_mq_notify     /* 275 */
-+      .long sys_mq_getsetattr
-+      .long sys_waitid
-+      .long sys_ni_syscall                    /* for sys_vserver */
-+      .long sys_add_key
-+      .long sys_request_key   /* 280 */
-+      .long sys_keyctl
-+      .long sys_ioprio_set
-+      .long sys_ioprio_get
-+      .long sys_inotify_init
-+      .long sys_inotify_add_watch     /* 285 */
-+      .long sys_inotify_rm_watch
-+      .long sys_migrate_pages
-+      .long sys_openat
-+      .long sys_mkdirat
-+      .long sys_mknodat               /* 290 */
-+      .long sys_fchownat
-+      .long sys_futimesat
-+      .long sys_fstatat64
-+      .long sys_unlinkat
-+      .long sys_renameat              /* 295 */
-+      .long sys_linkat
-+      .long sys_symlinkat
-+      .long sys_readlinkat
-+      .long sys_fchmodat
-+      .long sys_faccessat             /* 300 */
-+      .long sys_ni_syscall                    /* Reserved for pselect6 */
-+      .long sys_ni_syscall                    /* Reserved for ppoll */
-+      .long sys_unshare
-+      .long sys_set_robust_list
-+      .long sys_get_robust_list       /* 305 */
-+      .long sys_splice
-+      .long sys_sync_file_range
-+      .long sys_tee
-+      .long sys_vmsplice
-+      .long sys_move_pages            /* 310 */
-+
---- /dev/null
-+++ b/arch/m68k/coldfire/head.S
-@@ -0,0 +1,661 @@
-+/*
-+ *  head.S is the MMU enabled ColdFire specific initial boot code
-+ *
-+ *  Ported to ColdFire by
-+ *    Matt Waddel Matt.Waddel@freescale.com
-+ *    Kurt Mahan kmahan@freescale.com
-+ *  Copyright Freescale Semiconductor, Inc. 2007, 2008
-+ *  Phys kernel mapping Copyright Daniel Krueger, SYSTEC electornic GmbH 2008
-+ *
-+ *  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.
-+ *
-+ *  Parts of this code came from arch/m68k/kernel/head.S
-+ */
-+#include <linux/linkage.h>
-+#include <linux/init.h>
-+#include <asm/bootinfo.h>
-+#include <asm/setup.h>
-+#include <asm/entry.h>
-+#include <asm/pgtable.h>
-+#include <asm/page.h>
-+#include <asm/coldfire.h>
-+#include <asm/mcfuart.h>
-+#include <asm/cfcache.h>
-+
-+#define DEBUG
-+
-+.globl kernel_pg_dir
-+.globl availmem
-+.globl set_context
-+.globl set_fpga
-+
-+#ifdef DEBUG
-+/* When debugging use readable names for labels */
-+#ifdef __STDC__
-+#define L(name) .head.S.##name
-+#else
-+#define L(name) .head.S./**/name
-+#endif
-+#else
-+#ifdef __STDC__
-+#define L(name) .L##name
-+#else
-+#define L(name) .L/**/name
-+#endif
-+#endif
-+
-+/* The __INITDATA stuff is a no-op when ftrace or kgdb are turned on */
-+#ifndef __INITDATA
-+#define __INITDATA    .data
-+#define __FINIT               .previous
-+#endif
-+
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+/*
-+ * Kernel mapped to virtual ram address.
-+ *
-+ * M5445x:
-+ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
-+ *    Data[1]: 0xA0000000 -> 0xAFFFFFFF       PCI
-+ *    Code[0]: Not Mapped
-+ *    Code[1]: Not Mapped
-+ *
-+ * M547x/M548x
-+ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
-+ *    Data[1]: Not Mapped
-+ *    Code[0]: Not Mapped
-+ *    Code[1]: Not Mapped
-+ */
-+#if defined(CONFIG_M5445X)
-+#define ACR0_DEFAULT  #0xF00FA048   /* System regs */
-+#define ACR1_DEFAULT  #0xA00FA048   /* PCI */
-+#define ACR2_DEFAULT  #0x00000000   /* Not Mapped */
-+#define ACR3_DEFAULT  #0x00000000   /* Not Mapped */
-+#elif defined(CONFIG_M547X_8X)
-+#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
-+#define ACR1_DEFAULT  #0x00000000   /* Not Mapped */
-+#define ACR2_DEFAULT  #0x00000000   /* Not Mapped */
-+#define ACR3_DEFAULT  #0x00000000   /* Not Mapped */
-+#endif
-+
-+#else /* CONFIG_SDRAM_BASE = PAGE_OFFSET */
-+/*
-+ * Kernel mapped to physical ram address.
-+ *
-+ * M5445x:
-+ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
-+ *    Data[1]: 0x40000000 -> 0x4FFFFFFF       SDRAM - uncached
-+ *    Code[0]: Not Mapped
-+ *    Code[1]: 0x40000000 -> 0x4FFFFFFF       SDRAM - cached
-+ *
-+ * M547x/M548x
-+ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
-+ *    Data[1]: 0x00000000 -> 0x0FFFFFFF       SDRAM - uncached
-+ *    Code[0]: Not Mapped
-+ *    Code[1]: 0x00000000 -> 0x0FFFFFFF       SDRAM - cached
-+ */
-+#if defined(CONFIG_M5445X)
-+#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
-+#define ACR1_DEFAULT  #0x400FA048   /* SDRAM uncached */
-+#define ACR2_DEFAULT  #0x00000000   /* Not mapped */
-+#define ACR3_DEFAULT  #0x400FA008   /* SDRAM cached */
-+#elif defined(CONFIG_M547X_8X)
-+#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
-+#define ACR1_DEFAULT  #0x000FA048   /* SDRAM uncached */
-+#define ACR2_DEFAULT  #0x00000000   /* Not mapped */
-+#define ACR3_DEFAULT  #0x000FA008   /* SDRAM cached */
-+#endif
-+#endif
-+
-+/* Several macros to make the writing of subroutines easier:
-+ * - func_start marks the beginning of the routine which setups the frame
-+ *   register and saves the registers, it also defines another macro
-+ *   to automatically restore the registers again.
-+ * - func_return marks the end of the routine and simply calls the prepared
-+ *   macro to restore registers and jump back to the caller.
-+ * - func_define generates another macro to automatically put arguments
-+ *   onto the stack call the subroutine and cleanup the stack again.
-+ */
-+
-+.macro        load_symbol_address     symbol,register
-+      movel   #\symbol,\register
-+.endm
-+      
-+.macro        func_start      name,saveregs,savesize,stack=0
-+L(\name):
-+      linkw   %a6,#-\stack
-+      subal   #(\savesize),%sp
-+      moveml  \saveregs,%sp@
-+.set  stackstart,-\stack
-+
-+.macro        func_return_\name
-+      moveml  %sp@,\saveregs
-+      addal   #(\savesize),%sp
-+      unlk    %a6
-+      rts
-+.endm
-+.endm
-+
-+.macro        func_return     name
-+      func_return_\name
-+.endm
-+
-+.macro        func_call       name
-+      jbsr    L(\name)
-+.endm
-+
-+.macro        move_stack      nr,arg1,arg2,arg3,arg4
-+.if   \nr
-+      move_stack      "(\nr-1)",\arg2,\arg3,\arg4
-+      movel   \arg1,%sp@-
-+.endif
-+.endm
-+
-+.macro        func_define     name,nr=0
-+.macro        \name   arg1,arg2,arg3,arg4
-+      move_stack      \nr,\arg1,\arg2,\arg3,\arg4
-+      func_call       \name
-+.if   \nr
-+      lea     %sp@(\nr*4),%sp
-+.endif
-+.endm
-+.endm
-+
-+func_define   serial_putc,1
-+
-+.macro        putc    ch
-+      pea     \ch
-+      func_call       serial_putc
-+      addql   #4,%sp
-+.endm
-+
-+.macro        dputc   ch
-+#ifdef DEBUG
-+      putc    \ch
-+#endif
-+.endm
-+
-+func_define   putn,1
-+
-+.macro        dputn   nr
-+#ifdef DEBUG
-+      putn    \nr
-+#endif
-+.endm
-+
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+/*
-+      mmu_map  -  creates a new TLB entry
-+
-+      virt_addr      Must be on proper boundary
-+      phys_addr      Must be on proper boundary
-+      itlb           MMUOR_ITLB if instruction TLB or 0
-+      asid           address space ID
-+      shared_global  MMUTR_SG if shared between different ASIDs or 0
-+      size_code      MMUDR_SZ1M  1 MB
-+                     MMUDR_SZ4K  4 KB
-+                     MMUDR_SZ8K  8 KB
-+                     MMUDR_SZ16M 16 MB
-+      cache_mode     MMUDR_INC   instruction non-cacheable
-+                       MMUDR_IC    instruction cacheable
-+                       MMUDR_DWT   data writethrough
-+                     MMUDR_DCB   data copyback
-+                     MMUDR_DNCP  data non-cacheable, precise
-+                     MMUDR_DNCIP data non-cacheable, imprecise
-+      super_prot     MMUDR_SP if user mode generates exception or 0
-+      readable       MMUDR_R if permits read access (data TLB) or 0
-+      writable       MMUDR_W if permits write access (data TLB) or 0
-+      executable     MMUDR_X if permits execute access (instruction TLB) or 0
-+      locked         MMUDR_LK prevents TLB entry from being replaced or 0
-+      temp_data_reg  a data register to use for temporary values
-+*/
-+.macro mmu_map        virt_addr,phys_addr,itlb,asid,shared_global,size_code,cache_mode,super_prot,readable,writable,executable,locked,temp_data_reg
-+      /* Set up search of TLB. */
-+      movel   #(\virt_addr+1), \temp_data_reg
-+      movel   \temp_data_reg, MMUAR
-+      /* Search.  */
-+      movel   #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg
-+      movew   \temp_data_reg, (MMUOR)
-+      /* Set up tag value.  */
-+      movel   #(\virt_addr + \asid + \shared_global + MMUTR_V), \temp_data_reg
-+      movel   \temp_data_reg, MMUTR
-+      /* Set up data value.  */
-+      movel   #(\phys_addr + \size_code + \cache_mode + \super_prot + \readable + \writable + \executable + \locked), \temp_data_reg
-+      movel   \temp_data_reg, MMUDR
-+      /* Save it.  */
-+      movel   #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg
-+      movew   \temp_data_reg, (MMUOR)
-+.endm /* mmu_map */
-+
-+.macro mmu_unmap      virt_addr,itlb,temp_data_reg
-+      /* Set up search of TLB. */
-+      movel   #(\virt_addr+1), \temp_data_reg
-+      movel   \temp_data_reg, MMUAR
-+      /* Search.  */
-+      movel   #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg
-+      movew   \temp_data_reg, (MMUOR)
-+      /* Test for hit.  */
-+      movel   MMUSR,\temp_data_reg
-+      btst    #MMUSR_HITN,\temp_data_reg
-+      beq     1f
-+      /* Read the TLB.  */
-+      movel   #(MMUOR_RW + MMUOR_ACC +\itlb), \temp_data_reg
-+      movew   \temp_data_reg, (MMUOR)
-+      movel   MMUSR,\temp_data_reg
-+      /* Set up tag value.  */
-+      movel   #0, \temp_data_reg
-+      movel   \temp_data_reg, MMUTR
-+      /* Set up data value.  */
-+      movel   #0, \temp_data_reg
-+      movel   \temp_data_reg, MMUDR
-+      /* Save it.  */
-+      movel   #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg
-+      movew   \temp_data_reg, (MMUOR)
-+1:    
-+.endm /* mmu_unmap */
-+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-+
-+/* .text */
-+.section ".text.head","ax"
-+ENTRY(_stext)
-+/* Version numbers of the bootinfo interface -- if we later pass info
-+ * from boot ROM we might want to put something real here.
-+ *
-+ * The area from _stext to _start will later be used as kernel pointer table
-+ */
-+      bras    1f      /* Jump over bootinfo version numbers */
-+
-+      .long   BOOTINFOV_MAGIC
-+      .long   0
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+1:    jmp     __start-(0xc0000000-CONFIG_SDRAM_BASE)
-+#else
-+1:    jmp     __start
-+#endif
-+
-+.equ  kernel_pg_dir,_stext
-+.equ  .,_stext+0x1000
-+
-+ENTRY(_start)
-+      jra     __start
-+__INIT
-+ENTRY(__start)
-+/* Save the location of u-boot info - cmd line, bd_info, etc. */
-+      movel   %a7,%a4         /* Don't use %a4 before cf_early_init */
-+      addl    #0x00000004,%a4 /* offset past top */
-+      addl    #(PAGE_OFFSET-CONFIG_SDRAM_BASE),%a4    /* high mem offset */
-+
-+/* Setup initial stack pointer */
-+      movel   #CONFIG_SDRAM_BASE+0x1000,%sp
-+
-+/* Setup usp */
-+      subl    %a0,%a0
-+      movel   %a0,%usp
-+
-+#if defined(CONFIG_M5445X)
-+      movel   #0x80000000, %d0
-+      movec   %d0, %rambar1
-+#elif defined(CONFIG_M547X_8X)
-+      movel   #MCF_MBAR, %d0
-+      movec   %d0, %mbar
-+      move.l  #(MCF_RAMBAR0 + 0x21), %d0
-+      movec   %d0, %rambar0
-+      move.l  #(MCF_RAMBAR1 + 0x21), %d0
-+      movec   %d0, %rambar1
-+#endif
-+
-+      movew   #0x2700,%sr
-+
-+/* reset cache */
-+      movel   #(CF_CACR_ICINVA + CF_CACR_DCINVA),%d0
-+      movecl  %d0,%cacr
-+
-+      movel   #(MMU_BASE+1),%d0
-+      movecl  %d0,%mmubar
-+      movel   #MMUOR_CA,%a0                   /* Clear tlb entries */
-+      movew   %a0,(MMUOR)
-+      movel   #(MMUOR_CA + MMUOR_ITLB),%a0    /* Use ITLB for searches */
-+      movew   %a0,(MMUOR)
-+      movel   #0,%a0                          /* Clear Addr Space User ID */
-+      movecl  %a0,%asid 
-+
-+/* setup ACRs */
-+      movel   ACR0_DEFAULT, %d0               /* ACR0 (DATA) setup */
-+      movec   %d0, %acr0
-+      nop
-+      movel   ACR1_DEFAULT, %d0               /* ACR1 (DATA) setup */
-+      movec   %d0, %acr1
-+      nop
-+      movel   ACR2_DEFAULT, %d0               /* ACR2 (CODE) setup */
-+      movec   %d0, %acr2
-+      nop
-+      movel   ACR3_DEFAULT, %d0               /* ACR3 (CODE) setup */
-+      movec   %d0, %acr3
-+      nop
-+
-+      /* If you change the memory size to another value make a matching 
-+         change in paging_init(cf-mmu.c) to zones_size[]. */
-+
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+#if defined(CONFIG_M5445X)
-+      /* Map 256MB as code */
-+      mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+1*0x1000000),  (PHYS_OFFSET+1*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+2*0x1000000),  (PHYS_OFFSET+2*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+3*0x1000000),  (PHYS_OFFSET+3*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+4*0x1000000),  (PHYS_OFFSET+4*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+5*0x1000000),  (PHYS_OFFSET+5*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+6*0x1000000),  (PHYS_OFFSET+6*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+7*0x1000000),  (PHYS_OFFSET+7*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+8*0x1000000),  (PHYS_OFFSET+8*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+9*0x1000000),  (PHYS_OFFSET+9*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
-+              0, 0, MMUDR_X, MMUDR_LK, %d0
-+
-+      /* Map 256MB as data also */
-+      mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+1*0x1000000),  (PHYS_OFFSET+1*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+2*0x1000000),  (PHYS_OFFSET+2*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+3*0x1000000),  (PHYS_OFFSET+3*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+4*0x1000000),  (PHYS_OFFSET+4*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+5*0x1000000),  (PHYS_OFFSET+5*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+6*0x1000000),  (PHYS_OFFSET+6*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+7*0x1000000),  (PHYS_OFFSET+7*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+8*0x1000000),  (PHYS_OFFSET+8*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+9*0x1000000),  (PHYS_OFFSET+9*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+
-+      /* Map ATA registers -- sacrifice a data TLB due to the hw design */
-+      mmu_map (0x90000000), (0x90000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, MMUDR_LK, %d0
-+
-+#elif defined(CONFIG_M547X_8X)
-+
-+      /* Map first 8 MB as code */
-+      mmu_map (PAGE_OFFSET+0*1024*1024),  (0*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+1*1024*1024),  (1*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+2*1024*1024),  (2*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+3*1024*1024),  (3*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+4*1024*1024),  (4*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+5*1024*1024),  (5*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+6*1024*1024),  (6*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+7*1024*1024),  (7*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
-+              MMUDR_LK, %d0
-+
-+      /* Map first 8 MB as data */
-+      mmu_map (PAGE_OFFSET+0*1024*1024),  (0*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+1*1024*1024),  (1*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+2*1024*1024),  (2*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+3*1024*1024),  (3*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+4*1024*1024),  (4*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+5*1024*1024),  (5*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+6*1024*1024),  (6*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+      mmu_map (PAGE_OFFSET+7*1024*1024),  (7*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, MMUDR_LK, %d0
-+#endif
-+      /*
-+       * Do unity mapping to enable the MMU.  Map first chunk of memory
-+       * in place as code/data.  The TLBs will be deleted after the MMU is
-+       * enabled and we are executing in high memory.
-+       */
-+
-+#if defined(CONFIG_M5445X)
-+      /* Map first 16 MB as code */
-+      mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \
-+              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC,  MMUDR_SP, 0, \
-+              0, MMUDR_X, 0, %d0
-+      /* Map first 16 MB as data too  */
-+      mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
-+              0, 0, %d0
-+#elif defined(CONFIG_M547X_8X)
-+      /* Map first 4 MB as code */
-+      mmu_map (0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
-+              MMUDR_X, 0, %d0
-+      mmu_map (1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
-+              MMUDR_X, 0, %d0
-+      mmu_map (2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
-+              MMUDR_X, 0, %d0
-+      mmu_map (3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
-+              MMUDR_X, 0, %d0
-+
-+      /* Map first 4 MB as data too */
-+      mmu_map (0*1024*1024), (0*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, 0, %d0
-+      mmu_map (1*1024*1024), (1*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, 0, %d0
-+      mmu_map (2*1024*1024), (2*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, 0, %d0
-+      mmu_map (3*1024*1024), (3*1024*1024), 0, 0, \
-+              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
-+              MMUDR_W, 0, 0, %d0
-+#endif
-+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-+
-+      /* Turn on MMU */
-+      movel   #(MMUCR_EN),%a0
-+      movel   %a0,MMUCR
-+      nop     /* This synchs the pipeline after a write to MMUCR */
-+
-+      movel   #__running_high,%a0  /* Get around PC-relative addressing. */
-+      jmp     %a0@
-+
-+ENTRY(__running_high)
-+      load_symbol_address _stext,%sp
-+      movel   L(memory_start),%a0
-+      movel   %a0,availmem
-+      load_symbol_address L(phys_kernel_start),%a0
-+      load_symbol_address _stext,%a1
-+      subl    #_stext,%a1
-+      addl    #PAGE_OFFSET,%a1
-+      movel   %a1,%a0@
-+
-+/* zero bss */
-+      lea     _sbss,%a0
-+      lea     _ebss,%a1
-+      clrl    %d0
-+_loop_bss:
-+      movel   %d0,(%a0)+
-+      cmpl    %a0,%a1
-+      bne     _loop_bss
-+
-+      /* Unmap unity mappings */
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+#if defined(CONFIG_M5445X)
-+      mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
-+      mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
-+#elif defined(CONFIG_M547X_8X)
-+      mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
-+      mmu_unmap (PHYS_OFFSET+1*0x1000000), MMUOR_ITLB, %d0
-+      mmu_unmap (PHYS_OFFSET+2*0x1000000), MMUOR_ITLB, %d0
-+      mmu_unmap (PHYS_OFFSET+3*0x1000000), MMUOR_ITLB, %d0
-+      mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
-+      mmu_unmap (PHYS_OFFSET+1*0x1000000), 0, %d0
-+      mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0
-+      mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0
-+#endif
-+#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
-+
-+/* Setup initial stack pointer */
-+      lea     init_task,%a2 
-+      lea     init_thread_union+THREAD_SIZE,%sp
-+      subl    %a6,%a6         /* clear a6 for gdb */
-+
-+#ifdef CONFIG_MCF_USER_HALT
-+/* Setup debug control reg to allow halts from user space */
-+      lea     wdbg_uhe,%a0
-+      wdebug  (%a0)
-+#endif
-+
-+      movel   %a4,uboot_info_stk /* save uboot info to variable */
-+      jsr     cf_early_init
-+      jmp     start_kernel
-+
-+.section ".text.head","ax"
-+set_context:
-+func_start    set_context,%d0,(1*4)
-+      movel   12(%sp),%d0
-+      movec   %d0,%asid
-+func_return   set_context
-+
-+#ifdef CONFIG_M5445X
-+/*
-+ * set_fpga(addr,val) on the M5445X
-+ *
-+ * Map in 0x00000000 -> 0x0fffffff and then do the write.
-+ */
-+set_fpga:
-+#if 0
-+      movew   %sr,%d1
-+      movew   #0x2700,%sr
-+      movel   ACR0_FPGA, %d0
-+      movec   %d0, %acr0
-+      nop
-+      moveal  4(%sp),%a0
-+      movel   8(%sp),%a0@
-+      movel   ACR0_DEFAULT, %d0
-+      movec   %d0, %acr0
-+      nop
-+      movew   %d1,%sr
-+#endif
-+      rts
-+#endif
-+
-+      .data
-+      .align  4
-+
-+availmem:
-+      .long   0
-+L(phys_kernel_start):
-+      .long   PAGE_OFFSET
-+L(kernel_end):
-+      .long   0
-+L(memory_start):
-+      .long   PAGE_OFFSET_RAW
-+
-+#ifdef CONFIG_MCF_USER_HALT
-+/*
-+ * Enable User Halt Enable in the debug control register.
-+ */
-+wdbg_uhe:
-+      .word   0x2c80  /* DR0 */
-+      .word   0x00b0  /* 31:16 */
-+      .word   0x0400  /* 15:0 -- enable UHE */
-+      .word   0x0000  /* unused */
-+#endif
-+
-+
---- /dev/null
-+++ b/arch/m68k/coldfire/ints.c
-@@ -0,0 +1,463 @@
-+/*
-+ * linux/arch/m68k/coldfire/ints.c -- General interrupt handling code
-+ *
-+ * Copyright (C) 1999-2002  Greg Ungerer (gerg@snapgear.com)
-+ * Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
-+ *                     Kenneth Albanowski <kjahds@kjahds.com>,
-+ * Copyright (C) 2000  Lineo Inc. (www.lineo.com)
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007, 2008
-+ *    Kurt Mahan kmahan@freescale.com
-+ *    Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Based on:
-+ * linux/arch/m68k/kernel/ints.c &
-+ * linux/arch/m68knommu/5307/ints.c
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file COPYING in the main directory of this archive
-+ * for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/sched.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/errno.h>
-+#include <linux/seq_file.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/system.h>
-+#include <asm/irq.h>
-+#include <asm/traps.h>
-+#include <asm/page.h>
-+#include <asm/machdep.h>
-+#include <asm/irq_regs.h>
-+
-+#include <asm/mcfsim.h>
-+
-+/*
-+ * IRQ Handler lists.
-+ */
-+static struct irq_node *irq_list[SYS_IRQS];
-+static struct irq_controller *irq_controller[SYS_IRQS];
-+static int irq_depth[SYS_IRQS];
-+
-+/*
-+ * IRQ Controller
-+ */
-+#if defined(CONFIG_M5445X)
-+void m5445x_irq_enable(unsigned int irq);
-+void m5445x_irq_disable(unsigned int irq);
-+static struct irq_controller m5445x_irq_controller = {
-+      .name           = "M5445X",
-+      .lock           = SPIN_LOCK_UNLOCKED,
-+      .enable         = m5445x_irq_enable,
-+      .disable        = m5445x_irq_disable,
-+};
-+#elif defined(CONFIG_M547X_8X)
-+void m547x_8x_irq_enable(unsigned int irq);
-+void m547x_8x_irq_disable(unsigned int irq);
-+static struct irq_controller m547x_8x_irq_controller = {
-+      .name           = "M547X_8X",
-+      .lock           = SPIN_LOCK_UNLOCKED,
-+      .enable         = m547x_8x_irq_enable,
-+      .disable        = m547x_8x_irq_disable,
-+};
-+#else
-+# error No IRQ controller defined
-+#endif
-+
-+#define       POOL_SIZE       SYS_IRQS
-+static struct irq_node  pool[POOL_SIZE];
-+static struct irq_node *get_irq_node(void);
-+
-+/* The number of spurious interrupts */
-+unsigned int num_spurious;
-+asmlinkage void handle_badint(struct pt_regs *regs);
-+
-+/*
-+ * void init_IRQ(void)
-+ *
-+ * This function should be called during kernel startup to initialize
-+ * the IRQ handling routines.
-+ */
-+void __init init_IRQ(void)
-+{
-+      int i;
-+
-+#if defined(CONFIG_M5445X)
-+      for (i = 0; i < SYS_IRQS; i++)
-+              irq_controller[i] = &m5445x_irq_controller;
-+#elif defined(CONFIG_M547X_8X)
-+      for (i = 0; i < SYS_IRQS; i++)
-+              irq_controller[i] = &m547x_8x_irq_controller;
-+#endif
-+}
-+
-+/*
-+ * process_int(unsigned long vec, struct pt_regs *fp)
-+ *
-+ * Process an interrupt.  Called from entry.S.
-+ */
-+asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
-+{
-+      struct pt_regs *old_regs;
-+      struct irq_node *node;
-+      old_regs = set_irq_regs(fp);
-+      kstat_cpu(0).irqs[vec]++;
-+
-+      node = irq_list[vec];
-+      if (!node)
-+              handle_badint(fp);
-+      else {
-+              do {
-+                      node->handler(vec, node->dev_id);
-+                      node = node->next;
-+              } while (node);
-+      }
-+
-+      set_irq_regs(old_regs);
-+}
-+
-+/*
-+ * show_interrupts( struct seq_file *p, void *v)
-+ *
-+ * Called to show all the current interrupt information.
-+ */
-+int show_interrupts(struct seq_file *p, void *v)
-+{
-+      struct irq_controller *contr;
-+      struct irq_node *node;
-+      int i = *(loff_t *) v;
-+
-+      if ((i < NR_IRQS) && (irq_list[i])) {
-+              contr = irq_controller[i];
-+              node = irq_list[i];
-+              seq_printf(p, "%-8s %3u: %10u %s", contr->name, i,
-+                      kstat_cpu(0).irqs[i], node->devname);
-+              while ((node = node->next))
-+                      seq_printf(p, ", %s", node->devname);
-+
-+              seq_printf(p, "\n");
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * get_irq_node(void)
-+ *
-+ * Get an irq node from the pool.
-+ */
-+struct irq_node *get_irq_node(void)
-+{
-+      struct irq_node *p = pool;
-+      int i;
-+
-+      for (i = 0; i < POOL_SIZE; i++, p++) {
-+              if (!p->handler) {
-+                      memset(p, 0, sizeof(struct irq_node));
-+                      return p;
-+              }
-+      }
-+      printk(KERN_INFO "%s(%s:%d): No more irq nodes, I suggest you \
-+              increase POOL_SIZE", __FUNCTION__, __FILE__, __LINE__);
-+      return NULL;
-+}
-+
-+void init_irq_proc(void)
-+{
-+      /* Insert /proc/irq driver here */
-+}
-+
-+int setup_irq(unsigned int irq, struct irq_node *node)
-+{
-+      struct irq_controller *contr;
-+      struct irq_node **prev;
-+      unsigned long flags;
-+
-+      if (irq >= NR_IRQS || !irq_controller[irq]) {
-+              printk("%s: Incorrect IRQ %d from %s\n",
-+                     __FUNCTION__, irq, node->devname);
-+              return -ENXIO;
-+      }
-+
-+      contr = irq_controller[irq];
-+      spin_lock_irqsave(&contr->lock, flags);
-+
-+      prev = irq_list + irq;
-+      if (*prev) {
-+              /* Can't share interrupts unless both agree to */
-+              if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
-+                      spin_unlock_irqrestore(&contr->lock, flags);
-+                      printk(KERN_INFO "%s: -BUSY-Incorrect IRQ %d \n",
-+                              __FUNCTION__, irq);
-+                      return -EBUSY;
-+              }
-+              while (*prev)
-+                      prev = &(*prev)->next;
-+      }
-+
-+      if (!irq_list[irq]) {
-+              if (contr->startup)
-+                      contr->startup(irq);
-+              else
-+                      contr->enable(irq);
-+      }
-+      node->next = NULL;
-+      *prev = node;
-+
-+      spin_unlock_irqrestore(&contr->lock, flags);
-+
-+      return 0;
-+}
-+
-+int request_irq(unsigned int irq,
-+              irq_handler_t handler,
-+              unsigned long flags, const char *devname, void *dev_id)
-+{
-+      struct irq_node *node = get_irq_node();
-+      int res;
-+
-+      if (!node) {
-+              printk(KERN_INFO "%s:get_irq_node error %x\n",
-+                      __FUNCTION__,(unsigned int) node);
-+              return -ENOMEM;
-+      }
-+      node->handler = handler;
-+      node->flags   = flags;
-+      node->dev_id  = dev_id;
-+      node->devname = devname;
-+
-+      res = setup_irq(irq, node);
-+      if (res)
-+              node->handler = NULL;
-+
-+      return res;
-+}
-+EXPORT_SYMBOL(request_irq);
-+
-+void free_irq(unsigned int irq, void *dev_id)
-+{
-+      struct irq_controller *contr;
-+      struct irq_node **p, *node;
-+      unsigned long flags;
-+
-+      if (irq >= NR_IRQS || !irq_controller[irq]) {
-+              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
-+              return;
-+      }
-+
-+      contr = irq_controller[irq];
-+      spin_lock_irqsave(&contr->lock, flags);
-+
-+      p = irq_list + irq;
-+      while ((node = *p)) {
-+              if (node->dev_id == dev_id)
-+                      break;
-+              p = &node->next;
-+      }
-+
-+      if (node) {
-+              *p = node->next;
-+              node->handler = NULL;
-+      } else
-+              printk(KERN_DEBUG "%s: Removing probably wrong IRQ %d\n",
-+                     __FUNCTION__, irq);
-+
-+      if (!irq_list[irq]) {
-+              if (contr->shutdown)
-+                      contr->shutdown(irq);
-+              else
-+                      contr->disable(irq);
-+      }
-+
-+      spin_unlock_irqrestore(&contr->lock, flags);
-+}
-+EXPORT_SYMBOL(free_irq);
-+
-+void enable_irq(unsigned int irq)
-+{
-+      struct irq_controller *contr;
-+      unsigned long flags;
-+
-+      if (irq >= NR_IRQS || !irq_controller[irq]) {
-+              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
-+              return;
-+      }
-+
-+      contr = irq_controller[irq];
-+      spin_lock_irqsave(&contr->lock, flags);
-+      if (irq_depth[irq]) {
-+              if (!--irq_depth[irq]) {
-+                      if (contr->enable)
-+                              contr->enable(irq);
-+              }
-+      } else
-+              WARN_ON(1);
-+      spin_unlock_irqrestore(&contr->lock, flags);
-+}
-+EXPORT_SYMBOL(enable_irq);
-+
-+void disable_irq(unsigned int irq)
-+{
-+      struct irq_controller *contr;
-+      unsigned long flags;
-+
-+      if (irq >= NR_IRQS || !irq_controller[irq]) {
-+              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
-+              return;
-+      }
-+
-+      contr = irq_controller[irq];
-+      spin_lock_irqsave(&contr->lock, flags);
-+      if (!irq_depth[irq]++) {
-+              if (contr->disable)
-+                      contr->disable(irq);
-+      }
-+      spin_unlock_irqrestore(&contr->lock, flags);
-+}
-+EXPORT_SYMBOL(disable_irq);
-+
-+void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
-+EXPORT_SYMBOL(disable_irq_nosync);
-+
-+
-+unsigned long probe_irq_on(void)
-+{
-+      return 0;
-+}
-+EXPORT_SYMBOL(probe_irq_on);
-+
-+int probe_irq_off(unsigned long irqs)
-+{
-+      return 0;
-+}
-+EXPORT_SYMBOL(probe_irq_off);
-+
-+asmlinkage void handle_badint(struct pt_regs *regs)
-+{
-+      kstat_cpu(0).irqs[0]++;
-+      num_spurious++;
-+      printk(KERN_DEBUG "unexpected interrupt from %u\n", regs->vector);
-+}
-+EXPORT_SYMBOL(handle_badint);
-+
-+#ifdef CONFIG_M5445X
-+/*
-+ * M5445X Implementation
-+ */
-+void m5445x_irq_enable(unsigned int irq)
-+{
-+      /* enable the interrupt hardware */
-+      if (irq < 64)
-+              return;
-+
-+      /* adjust past non-hardware ints */
-+      irq -= 64;
-+
-+      /* check for eport */
-+      if ((irq > 0) && (irq < 8)) {
-+              /* enable eport */
-+              MCF_EPORT_EPPAR &= ~(3 << (irq*2));     /* level */
-+              MCF_EPORT_EPDDR &= ~(1 << irq);         /* input */
-+              MCF_EPORT_EPIER |= 1 << irq;            /* irq enabled */
-+      }
-+
-+      if (irq < 64) {
-+              /* controller 0 */
-+              MCF_INTC0_ICR(irq) = 0x02;
-+              MCF_INTC0_CIMR = irq;
-+      } else {
-+              /* controller 1 */
-+              irq -= 64;
-+              MCF_INTC1_ICR(irq) = 0x02;
-+              MCF_INTC1_CIMR = irq;
-+      }
-+}
-+
-+void m5445x_irq_disable(unsigned int irq)
-+{
-+      /* disable the interrupt hardware */
-+      if (irq < 64)
-+              return;
-+
-+      /* adjust past non-hardware ints */
-+      irq -= 64;
-+
-+      /* check for eport */
-+      if ((irq > 0) && (irq < 8)) {
-+              /* disable eport */
-+              MCF_EPORT_EPIER &= ~(1 << irq);
-+      }
-+
-+      if (irq < 64) {
-+              /* controller 0 */
-+              MCF_INTC0_ICR(irq) = 0x00;
-+              MCF_INTC0_SIMR = irq;
-+      } else {
-+              /* controller 1 */
-+              irq -= 64;
-+              MCF_INTC1_ICR(irq) = 0x00;
-+              MCF_INTC1_SIMR = irq;
-+      }
-+}
-+#elif defined(CONFIG_M547X_8X)
-+/*
-+ * M547X_8X Implementation
-+ */
-+void m547x_8x_irq_enable(unsigned int irq)
-+{
-+      /* enable the interrupt hardware */
-+      if (irq < 64)
-+              return;
-+
-+      /* adjust past non-hardware ints */
-+      irq -= 64;
-+
-+/* JKM -- re-add EPORT later */
-+#if 0
-+      /* check for eport */
-+      if ((irq > 0) && (irq < 8)) {
-+              /* enable eport */
-+              MCF_EPORT_EPPAR &= ~(3 << (irq*2));     /* level */
-+              MCF_EPORT_EPDDR &= ~(1 << irq);         /* input */
-+              MCF_EPORT_EPIER |= 1 << irq;            /* irq enabled */
-+      }
-+#endif
-+
-+      if (irq < 32) {
-+              /* *grumble* don't set low bit of IMRL */
-+              MCF_IMRL &= (~(1 << irq) & 0xfffffffe);
-+      }
-+      else {
-+              MCF_IMRH &= ~(1 << (irq - 32));
-+      }
-+}
-+
-+void m547x_8x_irq_disable(unsigned int irq)
-+{
-+      /* disable the interrupt hardware */
-+      if (irq < 64)
-+              return;
-+
-+      /* adjust past non-hardware ints */
-+      irq -= 64;
-+
-+/* JKM -- re-add EPORT later */
-+#if 0
-+      /* check for eport */
-+      if ((irq > 0) && (irq < 8)) {
-+              /* disable eport */
-+              MCF_EPORT_EPIER &= ~(1 << irq);
-+      }
-+#endif
-+
-+      if (irq < 32)
-+              MCF_IMRL |= (1 << irq);
-+      else
-+              MCF_IMRH |= (1 << (irq - 32));
-+}
-+#endif
---- /dev/null
-+++ b/arch/m68k/coldfire/iomap.c
-@@ -0,0 +1,56 @@
-+/*
-+ * arch/m68k/coldfire/iomap.c
-+ *
-+ * Generic coldfire iomap interface
-+ *
-+ * Based on the sh64 iomap.c by Paul Mundt.
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ */
-+#include <linux/pci.h>
-+#include <asm/io.h>
-+
-+#if 0
-+void __iomem *__attribute__ ((weak))
-+ioport_map(unsigned long port, unsigned int len)
-+{
-+      return (void __iomem *)port;
-+}
-+EXPORT_SYMBOL(pci_iomap);
-+
-+void ioport_unmap(void __iomem *addr)
-+{
-+      /* Nothing .. */
-+}
-+EXPORT_SYMBOL(pci_iounmap);
-+
-+void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
-+{
-+      unsigned long start = pci_resource_start(dev, bar);
-+      unsigned long len = pci_resource_len(dev, bar);
-+      unsigned long flags = pci_resource_flags(dev, bar);
-+printk(KERN_INFO "PCI_IOMAP: BAR=%d  START=0x%lx  LEN=0x%lx  FLAGS=0x%lx\n",
-+       bar, start, len, flags);
-+
-+      if (!len)
-+              return NULL;
-+      if (max && len > max)
-+              len = max;
-+      if (flags & IORESOURCE_IO)
-+              return ioport_map(start, len);
-+      if (flags & IORESOURCE_MEM)
-+              return (void __iomem *)start;
-+
-+      /* What? */
-+      return NULL;
-+}
-+EXPORT_SYMBOL(ioport_map);
-+
-+void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
-+{
-+      /* Nothing .. */
-+}
-+EXPORT_SYMBOL(ioport_unmap);
-+#endif
---- /dev/null
-+++ b/arch/m68k/coldfire/m547x_8x-devices.c
-@@ -0,0 +1,163 @@
-+/*
-+ * arch/m68k/coldfire/m547x_8x-devices.c
-+ *
-+ * Coldfire M547x/M548x Platform Device Configuration
-+ *
-+ * Copyright (c) 2008 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/spi/spi.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+#include <asm/mcfqspi.h>
-+
-+
-+#ifdef CONFIG_SPI
-+/*
-+ *
-+ * DSPI
-+ *
-+ */
-+
-+/* number of supported SPI selects */
-+#define SPI_NUM_CHIPSELECTS   8
-+
-+void coldfire_spi_cs_control(u8 cs, u8 command)
-+{
-+      /* nothing special required */
-+}
-+
-+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
-+static struct coldfire_spi_chip spidev_chip_info = {
-+      .bits_per_word = 8,
-+};
-+#endif
-+
-+static struct spi_board_info spi_board_info[] = {
-+#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
-+      {
-+              .modalias = "spidev",
-+              .max_speed_hz = 16000000,       /* max clk (SCK) speed in HZ */
-+              .bus_num = 1,
-+              .chip_select = 0,               /* CS0 */
-+              .controller_data = &spidev_chip_info,
-+      }
-+#endif
-+};
-+
-+static int spi_irq_list[] = {
-+      /* IRQ,              ICR Offset,        ICR Val,Mask */
-+      64 + ISC_DSPI_OVRFW, ISC_DSPI_OVRFW,    0x18,   0,
-+      64 + ISC_DSPI_RFOF,  ISC_DSPI_RFOF,     0x18,   0,
-+      64 + ISC_DSPI_RFDF,  ISC_DSPI_RFDF,     0x18,   0,
-+      64 + ISC_DSPI_TFUF,  ISC_DSPI_TFUF,     0x18,   0,
-+      64 + ISC_DSPI_TCF,   ISC_DSPI_TCF,      0x18,   0,
-+      64 + ISC_DSPI_TFFF,  ISC_DSPI_TFFF,     0x18,   0,
-+      64 + ISC_DSPI_EOQF,  ISC_DSPI_EOQF,     0x18,   0,
-+      0,0,0,0,
-+};
-+
-+static struct coldfire_spi_master coldfire_master_info = {
-+      .bus_num = 1,
-+      .num_chipselect = SPI_NUM_CHIPSELECTS,
-+      .irq_list = spi_irq_list,
-+      .irq_source = 0,        /* not used */
-+      .irq_vector = 0,        /* not used */
-+      .irq_mask = 0,          /* not used */
-+      .irq_lp = 0,            /* not used */
-+      .par_val = 0,           /* not used */
-+      .cs_control = coldfire_spi_cs_control,
-+};
-+
-+static struct resource coldfire_spi_resources[] = {
-+      [0] = {
-+              .name = "spi-par",
-+              .start = MCF_MBAR + 0x00000a50, /* PAR_DSPI */
-+              .end = MCF_MBAR + 0x00000a50,   /* PAR_DSPI */
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [1] = {
-+              .name = "spi-module",
-+              .start = MCF_MBAR + 0x00008a00, /* DSPI MCR Base */
-+              .end = MCF_MBAR + 0x00008ab8,   /* DSPI mem map end */
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [2] = {
-+              .name = "spi-int-level",
-+              .start = MCF_MBAR + 0x740,               /* ICR start */
-+              .end = MCF_MBAR + 0x740 + ISC_DSPI_EOQF, /* ICR end */
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [3] = {
-+              .name = "spi-int-mask",
-+              .start = MCF_MBAR + 0x70c,      /* IMRL */
-+              .end = MCF_MBAR + 0x70c,        /* IMRL */
-+              .flags = IORESOURCE_MEM
-+      }
-+};
-+
-+static struct platform_device coldfire_spi = {
-+      .name = "spi_coldfire",
-+      .id = -1,
-+      .resource = coldfire_spi_resources,
-+      .num_resources = ARRAY_SIZE(coldfire_spi_resources),
-+      .dev = {
-+              .platform_data = &coldfire_master_info,
-+      }
-+};
-+
-+/**
-+ * m547x_8x_spi_init - Initialize SPI
-+ */
-+static int __init m547x_8x_spi_init(void)
-+{
-+      int retval;
-+
-+      /* initialize the DSPI PAR */
-+      MCF_GPIO_PAR_DSPI = (MCF_GPIO_PAR_DSPI_PAR_CS5 |
-+                           MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS |
-+                           MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS |
-+                           MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS |
-+                           MCF_GPIO_PAR_DSPI_PAR_SCK_SCK |
-+                           MCF_GPIO_PAR_DSPI_PAR_SIN_SIN |
-+                           MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT);
-+
-+      /* register device */
-+      retval = platform_device_register(&coldfire_spi);
-+      if (retval < 0) {
-+              goto out;
-+      }
-+
-+      /* register board info */
-+      if (ARRAY_SIZE(spi_board_info))
-+              retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-+
-+out:
-+      return retval;
-+}
-+#endif
-+
-+
-+/**
-+ * m547x_8x_init_devices - Initialize M547X_8X devices
-+ *
-+ * Returns 0 on success.
-+ */
-+static int __init m547x_8x_init_devices(void)
-+{
-+#ifdef CONFIG_SPI
-+      m547x_8x_spi_init();
-+#endif
-+
-+      return 0;
-+}
-+arch_initcall(m547x_8x_init_devices);
---- /dev/null
-+++ b/arch/m68k/coldfire/m547x_8x-dma.c
-@@ -0,0 +1,516 @@
-+/*
-+ * arch/m68k/coldfire/m547x_8x-dma.c
-+ *
-+ * Coldfire M547x/M548x DMA
-+ *
-+ * Copyright (c) 2008 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * This code is based on patches from the Freescale M547x_8x BSP
-+ * release mcf547x_8x-20070107-ltib.iso
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/dma.h>
-+#include <asm/coldfire.h>
-+#include <asm/m5485sram.h>
-+#include <asm/mcfsim.h>
-+
-+/*
-+ * This global keeps track of which initiators have been
-+ * used of the available assignments.  Initiators 0-15 are
-+ * hardwired.  Initiators 16-31 are multiplexed and controlled
-+ * via the Initiatior Mux Control Registe (IMCR).  The
-+ * assigned requestor is stored with the associated initiator
-+ * number.
-+ */
-+static int used_reqs[32] = {
-+      DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0,
-+      DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1,
-+      DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX,
-+      DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX,
-+      0, 0, 0, 0,
-+      0, 0, 0, 0,
-+      0, 0, 0, 0,
-+      0, 0, 0, 0
-+};
-+
-+/*
-+ * This global keeps track of which channels have been assigned
-+ * to tasks.  This methology assumes that no single initiator
-+ * will be tied to more than one task/channel
-+ */
-+static char used_channel[16] = {
-+      -1, -1, -1, -1, -1, -1, -1, -1,
-+      -1, -1, -1, -1, -1, -1, -1, -1
-+};
-+
-+unsigned int connected_channel[16] = {
-+      0, 0, 0, 0, 0, 0, 0, 0,
-+      0, 0, 0, 0, 0, 0, 0, 0
-+};
-+
-+/**
-+ * dma_set_initiator - enable initiator
-+ * @initiator: initiator identifier
-+ *
-+ * Returns 0 of successful, non-zero otherwise
-+ *
-+ * Attempt to enable the provided Initiator in the Initiator
-+ * Mux Control Register.
-+ */
-+int dma_set_initiator(int initiator)
-+{
-+      switch (initiator) {
-+      case DMA_ALWAYS:
-+      case DMA_DSPI_RX:
-+      case DMA_DSPI_TX:
-+      case DMA_DREQ0:
-+      case DMA_PSC0_RX:
-+      case DMA_PSC0_TX:
-+      case DMA_USBEP0:
-+      case DMA_USBEP1:
-+      case DMA_USBEP2:
-+      case DMA_USBEP3:
-+      case DMA_PCI_TX:
-+      case DMA_PCI_RX:
-+      case DMA_PSC1_RX:
-+      case DMA_PSC1_TX:
-+      case DMA_I2C_RX:
-+      case DMA_I2C_TX:
-+              /*
-+               * These initiators are always active
-+               */
-+              break;
-+
-+      case DMA_FEC0_RX:
-+              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3))
-+                  | MCF_DMA_IMCR_SRC16_FEC0RX;
-+              used_reqs[16] = DMA_FEC0_RX;
-+              break;
-+
-+      case DMA_FEC0_TX:
-+              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3))
-+                  | MCF_DMA_IMCR_SRC17_FEC0TX;
-+              used_reqs[17] = DMA_FEC0_TX;
-+              break;
-+
-+      case DMA_FEC1_RX:
-+              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3))
-+                  | MCF_DMA_IMCR_SRC20_FEC1RX;
-+              used_reqs[20] = DMA_FEC1_RX;
-+              break;
-+
-+      case DMA_FEC1_TX:
-+              if (used_reqs[21] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
-+                          | MCF_DMA_IMCR_SRC21_FEC1TX;
-+                      used_reqs[21] = DMA_FEC1_TX;
-+              } else if (used_reqs[25] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
-+                          | MCF_DMA_IMCR_SRC25_FEC1TX;
-+                      used_reqs[25] = DMA_FEC1_TX;
-+              } else if (used_reqs[31] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
-+                          | MCF_DMA_IMCR_SRC31_FEC1TX;
-+                      used_reqs[31] = DMA_FEC1_TX;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_DREQ1:
-+              if (used_reqs[29] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
-+                          | MCF_DMA_IMCR_SRC29_DREQ1;
-+                      used_reqs[29] = DMA_DREQ1;
-+              } else if (used_reqs[21] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
-+                          | MCF_DMA_IMCR_SRC21_DREQ1;
-+                      used_reqs[21] = DMA_DREQ1;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM0:
-+              if (used_reqs[24] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3))
-+                          | MCF_DMA_IMCR_SRC24_CTM0;
-+                      used_reqs[24] = DMA_CTM0;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM1:
-+              if (used_reqs[25] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
-+                          | MCF_DMA_IMCR_SRC25_CTM1;
-+                      used_reqs[25] = DMA_CTM1;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM2:
-+              if (used_reqs[26] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
-+                          | MCF_DMA_IMCR_SRC26_CTM2;
-+                      used_reqs[26] = DMA_CTM2;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM3:
-+              if (used_reqs[27] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
-+                          | MCF_DMA_IMCR_SRC27_CTM3;
-+                      used_reqs[27] = DMA_CTM3;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM4:
-+              if (used_reqs[28] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
-+                          | MCF_DMA_IMCR_SRC28_CTM4;
-+                      used_reqs[28] = DMA_CTM4;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM5:
-+              if (used_reqs[29] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
-+                          | MCF_DMA_IMCR_SRC29_CTM5;
-+                      used_reqs[29] = DMA_CTM5;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM6:
-+              if (used_reqs[30] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
-+                          | MCF_DMA_IMCR_SRC30_CTM6;
-+                      used_reqs[30] = DMA_CTM6;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_CTM7:
-+              if (used_reqs[31] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
-+                          | MCF_DMA_IMCR_SRC31_CTM7;
-+                      used_reqs[31] = DMA_CTM7;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_USBEP4:
-+              if (used_reqs[26] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
-+                          | MCF_DMA_IMCR_SRC26_USBEP4;
-+                      used_reqs[26] = DMA_USBEP4;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_USBEP5:
-+              if (used_reqs[27] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
-+                          | MCF_DMA_IMCR_SRC27_USBEP5;
-+                      used_reqs[27] = DMA_USBEP5;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_USBEP6:
-+              if (used_reqs[28] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
-+                          | MCF_DMA_IMCR_SRC28_USBEP6;
-+                      used_reqs[28] = DMA_USBEP6;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_PSC2_RX:
-+              if (used_reqs[28] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
-+                          | MCF_DMA_IMCR_SRC28_PSC2RX;
-+                      used_reqs[28] = DMA_PSC2_RX;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_PSC2_TX:
-+              if (used_reqs[29] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
-+                          | MCF_DMA_IMCR_SRC29_PSC2TX;
-+                      used_reqs[29] = DMA_PSC2_TX;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_PSC3_RX:
-+              if (used_reqs[30] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
-+                          | MCF_DMA_IMCR_SRC30_PSC3RX;
-+                      used_reqs[30] = DMA_PSC3_RX;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      case DMA_PSC3_TX:
-+              if (used_reqs[31] == 0) {
-+                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
-+                          | MCF_DMA_IMCR_SRC31_PSC3TX;
-+                      used_reqs[31] = DMA_PSC3_TX;
-+              } else          /* No empty slots */
-+                      return 1;
-+              break;
-+
-+      default:
-+              return 1;
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * dma_get_initiator - get the initiator for the given requestor
-+ * @requestor: initiator identifier
-+ *
-+ * Returns initiator number (0-31) if assigned or just 0
-+ */
-+unsigned int dma_get_initiator(int requestor)
-+{
-+      u32 i;
-+
-+      for (i = 0; i < sizeof(used_reqs); ++i) {
-+              if (used_reqs[i] == requestor)
-+                      return i;
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * dma_remove_initiator - remove the given initiator from active list
-+ * @requestor: requestor to remove
-+ */
-+void dma_remove_initiator(int requestor)
-+{
-+      u32 i;
-+
-+      for (i = 0; i < sizeof(used_reqs); ++i) {
-+              if (used_reqs[i] == requestor) {
-+                      used_reqs[i] = -1;
-+                      break;
-+              }
-+      }
-+}
-+
-+/**
-+ * dma_set_channel_fec: find available channel for fec and mark
-+ * @requestor: initiator/requestor identifier
-+ *
-+ * Returns first avaialble channel (0-5) or -1 if all occupied
-+ */
-+int dma_set_channel_fec(int requestor)
-+{
-+      u32 i, t;
-+
-+#ifdef CONFIG_FEC_548x_ENABLE_FEC2
-+      t = 4;
-+#else
-+      t = 2;
-+#endif
-+
-+      for (i = 0; i < t ; ++i) {
-+              if (used_channel[i] == -1) {
-+                      used_channel[i] = requestor;
-+                      return i;
-+              }
-+      }
-+      /* All channels taken */
-+      return -1;
-+}
-+
-+/**
-+ * dma_set_channel - find an available channel and mark as used
-+ * @requestor: initiator/requestor identifier
-+ *
-+ * Returns first available channel (6-15) or -1 if all occupied
-+ */
-+int dma_set_channel(int requestor)
-+{
-+      u32 i;
-+#ifdef CONFIG_NET_FEC2
-+      i = 4;
-+#else
-+      i = 2;
-+#endif
-+
-+      for (; i < 16; ++i)
-+              if (used_channel[i] == -1) {
-+                      used_channel[i] = requestor;
-+                      return i;
-+              }
-+
-+      /* All channels taken */
-+      return -1;
-+}
-+
-+/**
-+ * dma_get_channel - get the channel being initiated by the requestor
-+ * @requestor: initiator/requestor identifier
-+ *
-+ * Returns Initiator for requestor or -1 if not found
-+ */
-+int dma_get_channel(int requestor)
-+{
-+      u32 i;
-+
-+      for (i = 0; i < sizeof(used_channel); ++i) {
-+              if (used_channel[i] == requestor)
-+                      return i;
-+      }
-+      return -1;
-+}
-+
-+/**
-+ * dma_connect - connect a channel with reference on data
-+ * @channel: channel number
-+ * @address: reference address of data
-+ *
-+ * Returns 0 if success or -1 if invalid channel
-+ */
-+int dma_connect(int channel, int address)
-+{
-+      if ((channel < 16) && (channel >= 0)) {
-+              connected_channel[channel] = address;
-+              return 0;
-+      }
-+      return -1;
-+}
-+
-+/**
-+ * dma_disconnect - disconnect a channel
-+ * @channel: channel number
-+ *
-+ * Returns 0 if success or -1 if invalid channel
-+ */
-+int dma_disconnect(int channel)
-+{
-+      if ((channel < 16) && (channel >= 0)) {
-+              connected_channel[channel] = 0;
-+              return 0;
-+      }
-+      return -1;
-+}
-+
-+/**
-+ * dma_remove_channel - remove channel from the active list
-+ * @requestor: initiator/requestor identifier
-+ */
-+void dma_remove_channel(int requestor)
-+{
-+      u32 i;
-+
-+      for (i = 0; i < sizeof(used_channel); ++i) {
-+              if (used_channel[i] == requestor) {
-+                      used_channel[i] = -1;
-+                      break;
-+              }
-+      }
-+}
-+
-+/**
-+ * dma_interrupt_handler - dma interrupt handler
-+ * @irq: interrupt number
-+ * @dev_id: data
-+ *
-+ * Returns IRQ_HANDLED
-+ */
-+irqreturn_t dma_interrupt_handler(int irq, void *dev_id)
-+{
-+      u32 i, interrupts;
-+
-+      /*
-+       * Determine which interrupt(s) triggered by AND'ing the
-+       * pending interrupts with those that aren't masked.
-+       */
-+      interrupts = MCF_DMA_DIPR;
-+      MCF_DMA_DIPR = interrupts;
-+
-+      for (i = 0; i < 16; ++i, interrupts >>= 1) {
-+              if (interrupts & 0x1)
-+                      if (connected_channel[i] != 0)
-+                              ((void (*)(void)) (connected_channel[i])) ();
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+/**
-+ * dma_remove_channel_by_number - clear dma channel
-+ * @channel: channel number to clear
-+ */
-+void dma_remove_channel_by_number(int channel)
-+{
-+      if ((channel < sizeof(used_channel)) && (channel >= 0))
-+              used_channel[channel] = -1;
-+}
-+
-+/**
-+ * dma_init - initialize the dma subsystem
-+ *
-+ * Returns 0 if success non-zero if failure
-+ *
-+ * Handles the DMA initialization during device setup.
-+ */
-+int __devinit dma_init()
-+{
-+      int result;
-+      char *dma_version_str;
-+
-+      MCD_getVersion(&dma_version_str);
-+      printk(KERN_INFO "m547x_8x DMA: Initialize %s\n", dma_version_str);
-+
-+      /* attempt to setup dma interrupt handler */
-+      if (request_irq(64 + ISC_DMA, dma_interrupt_handler, IRQF_DISABLED,
-+                      "MCD-DMA", NULL)) {
-+              printk(KERN_ERR "MCD-DMA: Cannot allocate the DMA IRQ(48)\n");
-+              return 1;
-+      }
-+
-+      MCF_DMA_DIMR = 0;
-+      MCF_DMA_DIPR = 0xFFFFFFFF;
-+
-+      MCF_ICR(ISC_DMA) = ILP_DMA;
-+
-+      result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
-+                      (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
-+      if (result != MCD_OK) {
-+              printk(KERN_ERR "MCD-DMA: Cannot perform DMA initialization\n");
-+              free_irq(64 + ISC_DMA, NULL);
-+              return 1;
-+      }
-+
-+      return 0;
-+}
-+device_initcall(dma_init);
---- /dev/null
-+++ b/arch/m68k/coldfire/Makefile
-@@ -0,0 +1,20 @@
-+#
-+# Makefile for Linux arch/m68k/coldfire source directory
-+#
-+
-+obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o
-+ifdef CONFIG_M5445X
-+ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
-+      obj-y   += usb.o usb/
-+endif
-+endif
-+
-+ifdef CONFIG_M547X_8X
-+obj-$(CONFIG_PCI)       += mcf548x-pci.o
-+else
-+obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
-+endif
-+obj-$(CONFIG_M5445X)  += mcf5445x-devices.o
-+obj-$(CONFIG_M547X_8X)        += m547x_8x-devices.o
-+obj-$(CONFIG_M547X_8X)        += mcf548x-devices.o
-+obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
---- /dev/null
-+++ b/arch/m68k/coldfire/mcf5445x-devices.c
-@@ -0,0 +1,136 @@
-+/*
-+ * arch/m68k/coldfire/mcf5445x-devices.c
-+ *
-+ * Coldfire M5445x Platform Device Configuration
-+ *
-+ * Based on the Freescale MXC devices.c
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/platform_device.h>
-+#include <linux/fsl_devices.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+
-+/* ATA Interrupt */
-+#define IRQ_ATA               (64 + 64 + 54)
-+
-+/* ATA Base */
-+#define       BASE_IO_ATA     0x90000000
-+
-+#define ATA_IER               MCF_REG08(BASE_IO_ATA+0x2c)     /* int enable reg */
-+#define ATA_ICR               MCF_REG08(BASE_IO_ATA+0x30)     /* int clear reg */
-+
-+/*
-+ * On-chip PATA
-+ */
-+#if defined(CONFIG_PATA_FSL) || defined(CONFIG_PATA_FSL_MODULE)
-+static int ata_init(struct platform_device *pdev)
-+{
-+      /* clear ints */
-+      ATA_IER = 0x00;
-+      ATA_ICR = 0xff;
-+
-+      /* setup shared pins */
-+      MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & MCF_GPIO_PAR_FEC_FEC1_MASK) |
-+                         MCF_GPIO_PAR_FEC_FEC1_ATA;
-+
-+      MCF_GPIO_PAR_FECI2C = (MCF_GPIO_PAR_FECI2C &
-+                            (MCF_GPIO_PAR_FECI2C_MDC1_MASK &
-+                            MCF_GPIO_PAR_FECI2C_MDIO1_MASK)) |
-+                            MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR |
-+                            MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW;
-+
-+      MCF_GPIO_PAR_ATA = MCF_GPIO_PAR_ATA_BUFEN |
-+                         MCF_GPIO_PAR_ATA_CS1 |
-+                         MCF_GPIO_PAR_ATA_CS0 |
-+                         MCF_GPIO_PAR_ATA_DA2 |
-+                         MCF_GPIO_PAR_ATA_DA1 |
-+                         MCF_GPIO_PAR_ATA_DA0 |
-+                         MCF_GPIO_PAR_ATA_RESET_RESET |
-+                         MCF_GPIO_PAR_ATA_DMARQ_DMARQ |
-+                         MCF_GPIO_PAR_ATA_IORDY_IORDY;
-+
-+      MCF_GPIO_PAR_PCI = (MCF_GPIO_PAR_PCI &
-+                           (MCF_GPIO_PAR_PCI_GNT3_MASK &
-+                            MCF_GPIO_PAR_PCI_REQ3_MASK)) |
-+                         MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK |
-+                         MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ;
-+
-+      return 0;
-+}
-+
-+static void ata_exit(void)
-+{
-+      printk(KERN_INFO "** ata_exit\n");
-+}
-+
-+static int ata_get_clk_rate(void)
-+{
-+      return MCF_BUSCLK;
-+}
-+
-+/* JKM -- move these to a header file */
-+#define MCF_IDE_DMA_WATERMARK 32      /* DMA watermark level in bytes */
-+#define MCF_IDE_DMA_BD_NR     (512/3/4) /* number of BDs per channel */
-+
-+static struct fsl_ata_platform_data ata_data = {
-+      .init             = ata_init,
-+      .exit             = ata_exit,
-+      .get_clk_rate     = ata_get_clk_rate,
-+#ifdef CONFIG_PATA_FSL_USE_DMA
-+        .udma_mask        = 0x0F, /* the board handles up to UDMA3 */
-+        .fifo_alarm       = MCF_IDE_DMA_WATERMARK / 2,
-+        .max_sg           = MCF_IDE_DMA_BD_NR,
-+#endif
-+};
-+
-+static struct resource pata_fsl_resources[] = {
-+      [0] = {         /* I/O */
-+              .start          = BASE_IO_ATA,
-+              .end            = BASE_IO_ATA + 0x000000d8,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [2] = {         /* IRQ */
-+              .start          = IRQ_ATA,
-+              .end            = IRQ_ATA,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct platform_device pata_fsl_device = {
-+      .name                   = "pata_fsl",
-+      .id                     = -1,
-+      .num_resources          = ARRAY_SIZE(pata_fsl_resources),
-+      .resource               = pata_fsl_resources,
-+      .dev                    = {
-+              .platform_data  = &ata_data,
-+              .coherent_dma_mask = ~0,        /* $$$ REVISIT */
-+      },
-+};
-+
-+static inline void mcf5445x_init_pata(void)
-+{
-+      (void)platform_device_register(&pata_fsl_device);
-+}
-+#else
-+static inline void mcf5445x_init_pata(void)
-+{
-+}
-+#endif
-+
-+static int __init mcf5445x_init_devices(void)
-+{
-+      printk(KERN_INFO "MCF5445x INIT_DEVICES\n");
-+#if 0
-+      mcf5445x_init_pata();
-+#endif
-+
-+      return 0;
-+}
-+arch_initcall(mcf5445x_init_devices);
---- /dev/null
-+++ b/arch/m68k/coldfire/mcf5445x-pci.c
-@@ -0,0 +1,431 @@
-+/*
-+ * arch/m68k/coldfire/mcf5445x-pci.c
-+ *
-+ * Coldfire M5445x specific PCI implementation.
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+#include <linux/pci.h>
-+
-+#include <asm/mcfsim.h>
-+#include <asm/pci.h>
-+#include <asm/irq.h>
-+
-+/*
-+ * Layout MCF5445x to PCI memory mappings:
-+ *
-+ *    WIN         MCF5445x                    PCI            TYPE
-+ *    ---         --------                    ---            ----
-+ *    [0] 0xA0000000 -> 0xA7FFFFFF  0xA0000000 -> 0xA7FFFFFF  MEM
-+ *    [1] 0xA8000000 -> 0xABFFFFFF  0xA8000000 -> 0xABFFFFFF  MEM
-+ *    [2] 0xAC000000 -> 0xAFFFFFFF  0xAC000000 -> 0xAFFFFFFF  IO
-+ */
-+
-+#define MCF5445X_PCI_MEM_BASE         0xA0000000
-+#define MCF5445X_PCI_MEM_SIZE         0x0C000000
-+
-+#define MCF5445X_PCI_CONFIG_BASE      0xAC000000
-+#define MCF5445X_PCI_CONFIG_SIZE      0x04000000
-+
-+#define MCF5445X_PCI_IO_BASE          0xAC000000
-+#define MCF5445X_PCI_IO_SIZE          0x04000000
-+
-+/* PCI Bus memory resource block */
-+struct resource pci_iomem_resource = {
-+      .name = "PCI memory space",
-+      .start = MCF5445X_PCI_MEM_BASE,
-+      .flags = IORESOURCE_MEM,
-+      .end = MCF5445X_PCI_MEM_BASE + MCF5445X_PCI_MEM_SIZE - 1
-+};
-+
-+/* PCI Bus ioport resource block */
-+struct resource pci_ioport_resource = {
-+      .name = "PCI I/O space",
-+      .start = MCF5445X_PCI_IO_BASE,
-+      .flags = IORESOURCE_IO,
-+      .end = MCF5445X_PCI_IO_BASE + MCF5445X_PCI_IO_SIZE - 1
-+};
-+
-+/*
-+ * The M54455EVB multiplexes all the PCI interrupts via
-+ * the FPGA and routes them to a single interrupt.  The
-+ * PCI spec requires all PCI interrupt routines be smart
-+ * enough to sort out their own interrupts.
-+ * The interrupt source from the FPGA is configured
-+ * to EPORT 3.
-+ */
-+#define MCF5445X_PCI_IRQ              0x43
-+
-+#define PCI_SLOTS                     4
-+
-+/*
-+ * FPGA Info
-+ */
-+#define FPGA_PCI_IRQ_ENABLE           (u32 *)0x09000000
-+#define FPGA_PCI_IRQ_STATUS           (u32 *)0x09000004
-+#define FPGA_PCI_IRQ_ROUTE            (u32 *)0x0900000c
-+#define FPGA_SEVEN_LED                        (u32 *)0x09000014
-+
-+extern void set_fpga(u32 *addr, u32 val);
-+
-+#ifdef DEBUG
-+void mcf5445x_pci_dumpregs(void);
-+#endif
-+
-+/*
-+ * mcf5445x_conf_device(struct pci_dev *dev)
-+ *
-+ * Machine dependent Configure the given device.
-+ *
-+ * Parameters:
-+ *
-+ * dev                - the pci device.
-+ */
-+void
-+mcf5445x_conf_device(struct pci_dev *dev)
-+{
-+      set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f);
-+}
-+
-+/*
-+ * int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus,
-+ *                            unsigned int devfn, int reg,
-+ *                            u32 *value)
-+ *
-+ * Read from PCI configuration space.
-+ *
-+ */
-+int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus,
-+                           unsigned int devfn, int reg, int len, u32 *value)
-+{
-+      u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) |
-+                 MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) |
-+                 MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) |
-+                 MCF_PCI_PCICAR_DWORD(reg) |
-+                 MCF_PCI_PCICAR_E;
-+
-+      if ((bus > 255) || (devfn > 255) || (reg > 255)) {
-+              *value = -1;
-+              return -EINVAL;
-+      }
-+
-+      /* setup for config mode */
-+      MCF_PCI_PCICAR = addr;
-+      __asm__ __volatile__("nop");
-+
-+      switch (len) {
-+      case 1:
-+              *value = *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3));
-+              break;
-+      case 2:
-+              *value = le16_to_cpu(*(volatile u16 *)
-+                              (MCF5445X_PCI_CONFIG_BASE + (reg&2)));
-+              break;
-+      case 4:
-+              *value = le32_to_cpu(*(volatile u32 *)
-+                              (MCF5445X_PCI_CONFIG_BASE));
-+              break;
-+      }
-+
-+      /* clear config mode */
-+      MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E;
-+      __asm__ __volatile__("nop");
-+
-+      return 0;
-+}
-+
-+/*
-+ * int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus,
-+ *                             unsigned int devfn, int reg,
-+ *                             u32 *value)
-+ *
-+ * Write to PCI configuration space
-+ */
-+int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus,
-+                  unsigned int devfn, int reg, int len, u32 value)
-+{
-+      u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) |
-+                 MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) |
-+                 MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) |
-+                 MCF_PCI_PCICAR_DWORD(reg) |
-+                 MCF_PCI_PCICAR_E;
-+
-+      if ((bus > 255) || (devfn > 255) || (reg > 255))
-+              return -EINVAL;
-+
-+      /* setup for config mode */
-+      MCF_PCI_PCICAR = addr;
-+      __asm__ __volatile__("nop");
-+
-+      switch (len) {
-+      case 1:
-+              *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)) = (u8)value;
-+              break;
-+      case 2:
-+              *(volatile u16 *)(MCF5445X_PCI_CONFIG_BASE+(reg&2)) =
-+                              cpu_to_le16((u16)value);
-+              break;
-+      case 4:
-+              *(volatile u32 *)(MCF5445X_PCI_CONFIG_BASE) =
-+                              cpu_to_le32(value);
-+              break;
-+      }
-+
-+      /* clear config mode */
-+      MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E;
-+      __asm__ __volatile__("nop");
-+
-+      return 0;
-+}
-+
-+/* hardware operations */
-+static struct pci_raw_ops mcf5445x_pci_ops = {
-+      .read =         mcf5445x_pci_config_read,
-+      .write =        mcf5445x_pci_config_write,
-+};
-+
-+/*
-+ * irqreturn_t mcf5445x_pci_interrupt( int irq, void *dev)
-+ *
-+ * PCI controller interrupt handler.
-+ */
-+static irqreturn_t
-+mcf5445x_pci_interrupt(int irq, void *dev)
-+{
-+      u32 status = MCF_PCI_PCIGSCR;
-+#ifdef DEBUG
-+      printk(KERN_INFO "PCI: Controller irq status=0x%08x\n", status);
-+#endif
-+      /* clear */
-+      MCF_PCI_PCIGSCR = status;
-+
-+      return IRQ_HANDLED;
-+}
-+
-+/*
-+ * irqreturn_t mcf5445x_pci_arb_interrupt( int irq, void *dev)
-+ *
-+ * PCI Arbiter interrupt handler.
-+ */
-+static irqreturn_t
-+mcf5445x_pci_arb_interrupt(int irq, void *dev)
-+{
-+      u32 status = MCF_PCIARB_PASR;
-+#ifdef DEBUG
-+      printk(KERN_INFO "PCI: Arbiter irq status=0x%08x\n", status);
-+#endif
-+      /* clear */
-+      MCF_PCIARB_PASR = status;
-+      return IRQ_HANDLED;
-+}
-+
-+/*
-+ * struct pci_bus_info *init_mcf5445x_pci(void)
-+ *
-+ * Machine specific initialisation:
-+ *
-+ * - Allocate and initialise a 'pci_bus_info' structure
-+ * - Initialize hardware
-+ *
-+ * Result: pointer to 'pci_bus_info' structure.
-+ */
-+int __init
-+init_mcf5445x_pci(void)
-+{
-+      return 0;
-+#if 0
-+      /*
-+       * Initialize the PCI core
-+       */
-+
-+      /* arbitration controller */
-+      MCF_PCIARB_PACR = MCF_PCIARB_PACR_INTMPRI |
-+                        MCF_PCIARB_PACR_EXTMPRI(0x0f) |
-+                        MCF_PCIARB_PACR_INTMINTEN |
-+                        MCF_PCIARB_PACR_EXTMINTEN(0x0f);
-+
-+      /* pci pin assignment regs */
-+      MCF_GPIO_PAR_PCI = MCF_GPIO_PAR_PCI_GNT0 |
-+                         MCF_GPIO_PAR_PCI_GNT1 |
-+                         MCF_GPIO_PAR_PCI_GNT2 |
-+                         MCF_GPIO_PAR_PCI_GNT3_GNT3 |
-+                         MCF_GPIO_PAR_PCI_REQ0 |
-+                         MCF_GPIO_PAR_PCI_REQ1 |
-+                         MCF_GPIO_PAR_PCI_REQ2 |
-+                         MCF_GPIO_PAR_PCI_REQ3_REQ3;
-+
-+      /* target control reg */
-+      MCF_PCI_PCITCR = MCF_PCI_PCITCR_P |
-+                       MCF_PCI_PCITCR_WCT(8);
-+
-+      /* PCI MEM address */
-+      MCF_PCI_PCIIW0BTAR = 0xA007A000;
-+
-+      /* PCI MEM address */
-+      MCF_PCI_PCIIW1BTAR = 0xA803A800;
-+
-+      /* PCI IO address */
-+      MCF_PCI_PCIIW2BTAR = 0xAC03AC00;
-+
-+      /* window control */
-+      MCF_PCI_PCIIWCR = MCF_PCI_PCIIWCR_WINCTRL0_ENABLE |
-+                        MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD |
-+                        MCF_PCI_PCIIWCR_WINCTRL1_ENABLE |
-+                        MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD |
-+                        MCF_PCI_PCIIWCR_WINCTRL2_ENABLE |
-+                        MCF_PCI_PCIIWCR_WINCTRL2_IO;
-+
-+      /* initiator control reg */
-+      MCF_PCI_PCIICR = 0x00ff;
-+
-+      /* type 0 - command */
-+      MCF_PCI_PCISCR = MCF_PCI_PCISCR_MW |    /* mem write/inval */
-+                       MCF_PCI_PCISCR_B |     /* bus master enable */
-+                       MCF_PCI_PCISCR_M;      /* mem access enable */
-+
-+      /* type 0 - config reg */
-+      MCF_PCI_PCICR1 = MCF_PCI_PCICR1_CACHELINESIZE(8) |
-+                       MCF_PCI_PCICR1_LATTIMER(0xff);
-+
-+      /* type 0 - config 2 reg */
-+      MCF_PCI_PCICR2 = 0;
-+
-+      /* target control reg */
-+      MCF_PCI_PCITCR2 = MCF_PCI_PCITCR2_B0E |
-+                        MCF_PCI_PCITCR2_B4E;
-+
-+      /* translate addresses from PCI[0] to CF[SDRAM] */
-+      MCF_PCI_PCITBATR0 = MCF_RAMBAR1 | MCF_PCI_PCITBATR0_EN;
-+      MCF_PCI_PCITBATR4 = MCF_RAMBAR1 | MCF_PCI_PCITBATR4_EN;
-+
-+      /* setup controller interrupt handlers */
-+      if (request_irq(55+128, mcf5445x_pci_interrupt, IRQF_SHARED,
-+                      "PCI Controller", NULL))
-+              printk(KERN_ERR "PCI: Unable to register controller irq\n");
-+
-+      if (request_irq (56+128, mcf5445x_pci_arb_interrupt, IRQF_SHARED, "PCI Arbiter", NULL))
-+              printk(KERN_ERR "PCI: Unable to register arbiter irq\n");
-+
-+      /* global control - clear reset bit */
-+      MCF_PCI_PCIGSCR = MCF_PCI_PCIGSCR_SEE |
-+                        MCF_PCI_PCIGSCR_PEE;
-+
-+      /* let everything settle */
-+      udelay(1000);
-+
-+      /* allocate bus ioport resource */
-+      if (request_resource(&ioport_resource, &pci_ioport_resource) < 0)
-+              printk(KERN_ERR "PCI: Unable to alloc ioport resource\n");
-+
-+      /* allocate bus iomem resource */
-+      if (request_resource(&iomem_resource, &pci_iomem_resource) < 0)
-+              printk(KERN_ERR "PCI: Unable to alloc iomem resource\n");
-+
-+      /* setup FPGA to route PCI to IRQ3(67), SW7 to IRQ7, SW6 to IRQ4 */
-+      set_fpga(FPGA_PCI_IRQ_ENABLE, 0x00000000);
-+      set_fpga(FPGA_PCI_IRQ_ROUTE, 0x00000039);
-+      set_fpga(FPGA_SEVEN_LED, 0x000000FF);
-+
-+      raw_pci_ops = &mcf5445x_pci_ops;
-+
-+      return 0;
-+#endif
-+}
-+
-+/*
-+ * DEBUGGING
-+ */
-+
-+#ifdef DEBUG
-+struct regdump {
-+      u32 addr;
-+      char regname[16];
-+};
-+
-+struct regdump type0regs[] = {
-+      { 0xfc0a8000, "PCIIDR" },
-+      { 0xfc0a8004, "PCISCR" },
-+      { 0xfc0a8008, "PCICCRIR" },
-+      { 0xfc0a800c, "PCICR1" },
-+      { 0xfc0a8010, "PCIBAR0" },
-+      { 0xfc0a8014, "PCIBAR1" },
-+      { 0xfc0a8018, "PCIBAR2" },
-+      { 0xfc0a801c, "PCIBAR3" },
-+      { 0xfc0a8020, "PCIBAR4" },
-+      { 0xfc0a8024, "PCIBAR5" },
-+      { 0xfc0a8028, "PCICCPR" },
-+      { 0xfc0a802c, "PCISID" },
-+      { 0xfc0a8030, "PCIERBAR" },
-+      { 0xfc0a8034, "PCICPR" },
-+      { 0xfc0a803c, "PCICR2" },
-+      { 0, "" }
-+};
-+
-+struct regdump genregs[] = {
-+      { 0xfc0a8060, "PCIGSCR" },
-+      { 0xfc0a8064, "PCITBATR0" },
-+      { 0xfc0a8068, "PCITBATR1" },
-+      { 0xfc0a806c, "PCITCR1" },
-+      { 0xfc0a8070, "PCIIW0BTAR" },
-+      { 0xfc0a8074, "PCIIW1BTAR" },
-+      { 0xfc0a8078, "PCIIW2BTAR" },
-+      { 0xfc0a8080, "PCIIWCR" },
-+      { 0xfc0a8084, "PCIICR" },
-+      { 0xfc0a8088, "PCIISR" },
-+      { 0xfc0a808c, "PCITCR2" },
-+      { 0xfc0a8090, "PCITBATR0" },
-+      { 0xfc0a8094, "PCITBATR1" },
-+      { 0xfc0a8098, "PCITBATR2" },
-+      { 0xfc0a809c, "PCITBATR3" },
-+      { 0xfc0a80a0, "PCITBATR4" },
-+      { 0xfc0a80a4, "PCITBATR5" },
-+      { 0xfc0a80a8, "PCIINTR" },
-+      { 0xfc0a80f8, "PCICAR" },
-+      { 0, "" }
-+};
-+
-+struct regdump arbregs[] = {
-+      { 0xfc0ac000, "PACR" },
-+      { 0xfc0ac004, "PASR" }, /* documentation error */
-+      { 0, "" }
-+};
-+
-+/*
-+ * void mcf5445x_pci_dumpregs()
-+ *
-+ * Dump out all the PCI registers
-+ */
-+void
-+mcf5445x_pci_dumpregs(void)
-+{
-+      struct regdump *reg;
-+
-+      printk(KERN_INFO "*** MCF5445x PCI TARGET 0 REGISTERS ***\n");
-+
-+      reg = type0regs;
-+      while (reg->addr) {
-+              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
-+                      *((u32 *)reg->addr), reg->regname);
-+              reg++;
-+      }
-+
-+      printk(KERN_INFO "\n*** MCF5445x PCI GENERAL REGISTERS ***\n");
-+      reg = genregs;
-+      while (reg->addr) {
-+              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
-+                      *((u32 *)reg->addr), reg->regname);
-+              reg++;
-+      }
-+      printk(KERN_INFO "\n*** MCF5445x PCI ARBITER REGISTERS ***\n");
-+      reg = arbregs;
-+      while (reg->addr) {
-+              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
-+                      *((u32 *)reg->addr), reg->regname);
-+              reg++;
-+      }
-+}
-+#endif /* DEBUG */
---- /dev/null
-+++ b/arch/m68k/coldfire/mcf548x-devices.c
-@@ -0,0 +1,94 @@
-+/*
-+ * arch/m68k/coldfire/mcf5445x-devices.c
-+ *
-+ * Coldfire M5445x Platform Device Configuration
-+ *
-+ * Based on the Freescale MXC devices.c
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/mtd/physmap.h>
-+#include <linux/platform_device.h>
-+#include <linux/fsl_devices.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+
-+static struct resource coldfire_i2c_resources[] = {
-+      [0] = {         /* I/O */
-+              .start          = MCF_MBAR + 0x008F00,
-+              .end            = MCF_MBAR + 0x008F20,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [2] = {         /* IRQ */
-+              .start          = 40,
-+              .end            = 40,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct platform_device coldfire_i2c_device = {
-+      .name                   = "MCF548X-i2c",
-+      .id                     = -1,
-+      .num_resources          = ARRAY_SIZE(coldfire_i2c_resources),
-+      .resource               = coldfire_i2c_resources,
-+};
-+
-+static struct resource coldfire_sec_resources[] = {
-+      [0] = {         /* I/O */
-+              .start          = MCF_MBAR + 0x00020000,
-+              .end            = MCF_MBAR + 0x00033000,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [2] = {         /* IRQ */
-+              .start          = ISC_SEC,
-+              .end            = ISC_SEC,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct platform_device coldfire_sec_device = {
-+      .name                   = "fsl-sec1",
-+      .id                     = -1,
-+      .num_resources          = ARRAY_SIZE(coldfire_sec_resources),
-+      .resource               = coldfire_sec_resources,
-+};
-+
-+#if defined(CONFIG_MTD_PHYSMAP)
-+static struct physmap_flash_data mcf5485_flash_data = {
-+      .width          = 2,
-+};
-+
-+static struct resource mcf5485_flash_resource = {
-+      .start          = 0xf8000000,
-+      .end            = 0xf80fffff,
-+      .flags          = IORESOURCE_MEM,
-+};
-+
-+static struct platform_device mcf5485_flash_device = {
-+      .name           = "physmap-flash",
-+      .id             = 0,
-+      .dev            = {
-+              .platform_data  = &mcf5485_flash_data,
-+      },
-+      .num_resources  = 1,
-+      .resource       = &mcf5485_flash_resource,
-+};
-+#endif
-+
-+static int __init mcf5485_init_devices(void)
-+{
-+      printk(KERN_INFO "MCF5485x INIT_DEVICES\n");
-+
-+      platform_device_register(&coldfire_i2c_device);
-+      platform_device_register(&coldfire_sec_device);
-+/*#if defined(CONFIG_MTD_PHYSMAP)
-+      platform_device_register(&mcf5485_flash_device);
-+#endif*/
-+      return 0;
-+}
-+arch_initcall(mcf5485_init_devices);
---- /dev/null
-+++ b/arch/m68k/coldfire/mcf548x-pci.c
-@@ -0,0 +1,959 @@
-+/*
-+ *    ColdFire 547x/548x PCI Host Controller functions
-+ *
-+ * Copyright (c) 2005-2008 Freescale Semiconductor, Inc.
-+ *
-+ * This code is based on the 2.6.10 version of pci.c
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/pci.h>
-+#include <linux/ioport.h>
-+#include <linux/slab.h>
-+#include <linux/version.h>
-+#include <linux/interrupt.h>
-+
-+#include <linux/dma-mapping.h>
-+#include <asm/coldfire.h>
-+#include <asm/io.h>
-+#include <asm/m5485sim.h>
-+#include <asm/m5485pci.h>
-+#include <asm/irq.h>
-+#include <asm/pci.h>
-+#include <asm/virtconvert.h>
-+
-+
-+#undef DEBUG
-+//#define DEBUG
-+
-+#ifdef DEBUG
-+//#define DBG(x...) printk(KERN_DEBUG x)
-+#define DBG(x...) printk(x)
-+#else
-+#define DBG(x...)
-+#endif
-+
-+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,75))
-+# define irqreturn_t void
-+# define IRQ_HANDLED
-+# define IRQ_NONE
-+#endif
-+
-+/*
-+ *  Bridge configration dafaults
-+ */
-+#define PCI_RETRIES   0
-+#define PCI_CACHE_LINE        8
-+#define PCI_MINGNT    1
-+#define PCI_MAXLAT    42
-+
-+
-+/*
-+ *  Initiator windows setting
-+ */
-+#define HOST_MEM_BASE         0xD0000000      /* ColdFire Memory window base  */
-+#define PCI_MEM_BASE          0xD0000000      /* PCI Memory window base       */
-+#define PCI_MEM_SIZE          0x08000000      /* Memory window size (128M)    */
-+#define HOST_IO_BASE          0xD8000000      /* ColdFire I/O window base     */
-+#define PCI_IO_BASE_ADDR      0x00000000      /* PCI I/O window base          */
-+#define PCI_IO_SIZE           0x00010000      /* I/O window size (64K)        */
-+#define HOST_CFG_BASE         0xD8000000      /* ColdFire config window base  */
-+#define HOST_DMA_BASE          CONFIG_SDRAM_BASE      /* ColdFire PCI-DMA window base */
-+#define PCI_HDR_BASE          (MCF_MBAR+0xB00)/* ColdFire config registers    */
-+
-+#define PCI_MEM_MASK          (PCI_MEM_SIZE-1)
-+#define PCI_IO_MASK           (PCI_IO_SIZE-1)
-+
-+/* Macro to set initiator window */
-+#define WxBAR(host_address, pci_address, size)        \
-+      (((host_address)  & 0xff000000)      |  \
-+      ((((size)-1) & 0xff000000) >> 8)     |  \
-+      ((pci_address) & 0xff000000) >> 16)
-+
-+/*
-+ *  BIOS internal data
-+ */
-+static u8 revision;           /* controller revision */
-+
-+/*
-+ *    Board specific setting
-+ */
-+const unsigned int irq_lines[] = { 5, 7 };
-+
-+#define N_SLOTS       (sizeof(board_info) / sizeof(board_info[0]))
-+#define N_IRQS                (sizeof(irq_lines)  / sizeof(irq_lines[0]))
-+#define BRIDGE_SLOT   0
-+
-+const struct slotinfo {
-+      unsigned char idsel;    /* device number     */
-+      unsigned char irq;      /* external IRQ      */
-+      unsigned char req;      /* REQ line number   */
-+      unsigned char gnt;      /* GNT line number   */
-+} board_info[] = {
-+      {0,  0, 0, 0},          /* Bridge      */
-+      {17, 5, 1, 1},          /* Slot #1     */
-+      {18, 5, 2, 2},          /* Slot #2     */       
-+      {20, 7, 3, 3},          /* Slot #3     */
-+      {21, 7, 4, 4},          /* Slot #4     */
-+};
-+
-+/************************************************************************/
-+
-+/*
-+ * static int mk_conf_addr()
-+ *
-+ * Return type0 or type1 configuration address
-+ * by the means of device address and PCI dword location
-+ * 0 - for not existing slots
-+ */
-+static int mk_conf_addr(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where)
-+{
-+      int slot, func, address, idsel, dev_fn;
-+
-+      if (bus->number) {
-+              address = MCF_PCICAR_E | (bus->number << 16) |
-+                  (devfn << 8) | (where & 0xfc);
-+      } else {
-+              slot = PCI_SLOT(devfn);
-+              if (slot > N_SLOTS || slot == BRIDGE_SLOT)
-+                      return 0;
-+              else {
-+                      func = PCI_FUNC(devfn);
-+                      idsel = board_info[slot].idsel;
-+
-+                      dev_fn = PCI_DEVFN(idsel, func);
-+                      address = MCF_PCICAR_E | (bus->number << 16) |
-+                          (dev_fn << 8) | (where & 0xfc);
-+              }
-+      }
-+
-+      return (address);
-+}
-+
-+/*
-+ * static int read_config_byte()
-+ *
-+ * Read a byte from configuration space of specified device
-+ */
-+static int read_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 *value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      *value = 0xff;
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      slot = PCI_SLOT(devfn);
-+      if (slot == BRIDGE_SLOT) {
-+              if (where <= 0x40)
-+                      *value = *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3));
-+              else
-+                      *value = 0;
-+      } else {
-+              address = mk_conf_addr(bus, devfn, where);
-+              if (!address)
-+                      result = PCIBIOS_DEVICE_NOT_FOUND;
-+              else {
-+                      MCF_PCICAR = address;
-+                      *value = *(volatile u8 *) (HOST_CFG_BASE + (where & 3));
-+              }
-+      }
-+      __asm__ __volatile__("nop");
-+      __asm__ __volatile__("nop");
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: read_config_byte bus=%d, devfn=%d, addr=0x%02X, val=0x%02X, ret=%02X\n",
-+          bus->number, devfn, where, *value, result);
-+
-+      return (result);
-+}
-+
-+/*
-+ * static int read_config_word()
-+ *
-+ * Read a word from configuration space of specified device
-+ */
-+static int read_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 *value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      *value = 0xffff;
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      if (where & 0x1)
-+              result = PCIBIOS_BAD_REGISTER_NUMBER;
-+      else {
-+              slot = PCI_SLOT(devfn);
-+              if (slot == BRIDGE_SLOT) {
-+                      if (where <= 0x3f)
-+                              *value =
-+                                  *(volatile u16 *) (PCI_HDR_BASE +
-+                                                     (where ^ 2));
-+                      else
-+                              *value = 0;
-+              } else {
-+                      address = mk_conf_addr(bus, devfn, where);
-+                      if (!address)
-+                              result = PCIBIOS_DEVICE_NOT_FOUND;
-+                      else {
-+                              MCF_PCICAR = address;
-+                              *value = le16_to_cpu(*(volatile u16 *)
-+                                                   (HOST_CFG_BASE +
-+                                                    (where & 2)));
-+                      }
-+              }
-+      }
-+        __asm__ __volatile__("nop");
-+        __asm__ __volatile__("nop");
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: read_config_word bus=%d, devfn=%d, addr=0x%02X, val=0x%04X ret=%02X\n",
-+          bus->number, devfn, where, *value, result);
-+
-+      return (result);
-+}
-+
-+/*
-+ * static int read_config_dword()
-+ *
-+ * Read a long word from configuration space of specified device
-+ */
-+static int read_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 *value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      *value = 0xffffffff;
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      if (where & 0x3)
-+              result = PCIBIOS_BAD_REGISTER_NUMBER;
-+      else {
-+              slot = PCI_SLOT(devfn);
-+              if (slot == BRIDGE_SLOT) {
-+                      if (where <= 0x3d)
-+                              *value =
-+                                  *(volatile u32 *) (PCI_HDR_BASE + where);
-+                      else
-+                              *value = 0;
-+                      __asm__ __volatile__("nop");
-+                      __asm__ __volatile__("nop");
-+              } else {
-+                      address = mk_conf_addr(bus, devfn, where);
-+                      if (!address)
-+                              result = PCIBIOS_DEVICE_NOT_FOUND;
-+                      else {
-+                              MCF_PCICAR = address;
-+                              *value = le32_to_cpu(*(volatile u32 *)
-+                                                   (HOST_CFG_BASE));
-+                              __asm__ __volatile__("nop");
-+                              __asm__ __volatile__("nop");
-+                              if (bus->number != 0 && revision < 1) {
-+                                      volatile u32 temp;
-+
-+                                      MCF_PCICAR |= 0xff0000;
-+                                      temp = *(volatile u32 *) (HOST_CFG_BASE);
-+                              }
-+                      }
-+              }
-+      }
-+
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: read_config_dword bus=%d, devfn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
-+           bus->number, devfn, where, *value, result);
-+
-+      return (result);
-+}
-+
-+/*
-+ * static int write_config_byte()
-+ *
-+ * Write a byte to configuration space of specified device
-+ */
-+static int write_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      slot = PCI_SLOT(devfn);
-+      if (slot == BRIDGE_SLOT) {
-+              if (where <= 0x40)
-+                      *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)) = value;
-+      } else {
-+              address = mk_conf_addr(bus, devfn, where);
-+              if (!address)
-+                      result = PCIBIOS_DEVICE_NOT_FOUND;
-+              else {
-+                      MCF_PCICAR = address;
-+                      *(volatile u8 *) (HOST_CFG_BASE + (where & 3)) = value;
-+              }
-+      }
-+        __asm__ __volatile__("nop");
-+        __asm__ __volatile__("nop");
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: write_config_byte bus=%d, devfn=%d, addr=0x%02X, value=0x%02X ret=%02X\n",
-+           bus->number, devfn, where, value, result);
-+
-+      return (result);
-+}
-+
-+/*
-+ * static int write_config_word()
-+ *
-+ * Write a word to configuration space of specified device
-+ */
-+static int write_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      if (where & 0x1)
-+              result = PCIBIOS_BAD_REGISTER_NUMBER;
-+      else {
-+              slot = PCI_SLOT(devfn);
-+              if (slot == BRIDGE_SLOT) {
-+                      if (where <= 0x3f)
-+                              *(volatile u16 *) (PCI_HDR_BASE + (where ^ 2)) =
-+                                  value;
-+              } else {
-+                      address = mk_conf_addr(bus, devfn, where);
-+                      if (!address)
-+                              result = PCIBIOS_DEVICE_NOT_FOUND;
-+                      else {
-+                              MCF_PCICAR = address;
-+                              *(volatile u16 *) (HOST_CFG_BASE + (where & 2)) =
-+                                  cpu_to_le16(value);
-+                      }
-+              }
-+      }
-+      __asm__ __volatile__("nop");
-+        __asm__ __volatile__("nop");
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: write_config_word bus=%d, devfn=%d, addr=0x%02X, value=0x%04X ret=%02X\n",
-+           bus->number, devfn, where, value, result);
-+
-+      return (result);
-+}
-+
-+/*
-+ * static int write_config_dword()
-+ *
-+ * Write a long word to configuration space of specified device
-+ */
-+static int write_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 value)
-+{
-+      int slot;
-+      int address;
-+      int result;
-+
-+      result = PCIBIOS_SUCCESSFUL;
-+
-+      if (where & 0x3)
-+              result = PCIBIOS_BAD_REGISTER_NUMBER;
-+      else {
-+              slot = PCI_SLOT(devfn);
-+              if (slot == BRIDGE_SLOT) {
-+                      if (where <= 0x3d)
-+                              *(volatile u32 *) (PCI_HDR_BASE + where) =
-+                                  value;
-+              } else {
-+                      address = mk_conf_addr(bus, devfn, where);
-+                      if (!address)
-+                              result = PCIBIOS_DEVICE_NOT_FOUND;
-+                      else {
-+                              MCF_PCICAR = address;
-+                              *(volatile u32 *) (HOST_CFG_BASE) =
-+                                  cpu_to_le32(value);
-+                      }
-+              }
-+      }
-+      __asm__ __volatile__("nop");
-+        __asm__ __volatile__("nop");
-+      MCF_PCICAR &= ~MCF_PCICAR_E;
-+
-+      DBG("PCI: write_config_dword dev=%d, fn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
-+          PCI_SLOT(devfn), PCI_FUNC(devfn), where,  value, result);
-+
-+      return (result);
-+}
-+
-+static int config_read(struct pci_bus *bus, unsigned int devfn,
-+                     int where, int size, u32 * val)
-+{
-+      switch (size) {
-+      case 1:
-+              return read_config_byte(bus, devfn, where, (u8 *) val);
-+      case 2:
-+              return read_config_word(bus, devfn, where, (u16 *) val);
-+      default:
-+              return read_config_dword(bus, devfn, where, val);
-+      }
-+}
-+
-+static int config_write(struct pci_bus *bus, unsigned int devfn,
-+                      int where, int size, u32 val)
-+{
-+      switch (size) {
-+      case 1:
-+              return write_config_byte(bus, devfn, where, (u8) val);
-+      case 2:
-+              return write_config_word(bus, devfn, where, (u16) val);
-+      default:
-+              return write_config_dword(bus, devfn, where, val);
-+      }
-+}
-+
-+/*
-+ *  configuration routines entry points
-+ */
-+static struct pci_ops bus_ops = {
-+      read:           config_read,
-+      write:          config_write
-+};
-+
-+/************************************************************************/
-+
-+/*
-+ * u8 pci_inb()
-+ *
-+ * Read a byte at specified address from I/O space
-+ */
-+unsigned char pci_inb(long addr)
-+{
-+      char value;
-+
-+      value = *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      DBG("PCI: inb addr=0x%08X, value=0x%02X\n", addr, value);
-+
-+      return (unsigned char) value;
-+}
-+
-+
-+/*
-+ * u16 pci_inw()
-+ *
-+ * Read a word at specified address from I/O space
-+ */
-+unsigned short pci_inw(long addr)
-+{
-+      short value;
-+      volatile unsigned short *ptr;
-+
-+      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      value = le16_to_cpu(*ptr);
-+
-+      DBG("PCI: inw addr=0x%08X, value=0x%04X\n",  addr, value);
-+      return (unsigned short) value;
-+}
-+
-+/*
-+ * u16 pci_raw_inw()
-+ *
-+ * Read a raw word at specified address from I/O space
-+ */
-+unsigned short pci_raw_inw(long addr)
-+{
-+      short value;
-+      volatile unsigned short *ptr;
-+
-+      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      value = *ptr;
-+
-+      DBG("PCI: raw_inw addr=0x%08X, value=0x%04X\n",  addr, value);
-+      return (unsigned short) value;
-+}
-+
-+/*
-+ * u32 pci_inl()
-+ *
-+ * Read a dword at specified address from I/O space
-+ */
-+unsigned long pci_inl(long addr)
-+{
-+      long value;
-+      volatile unsigned long *ptr;
-+
-+      ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      value = le32_to_cpu(*ptr);
-+
-+      DBG("PCI: inl addr=0x%08X, value=0x%08X\n",  addr, value);
-+      return (unsigned long) value;
-+}
-+
-+/*
-+ * u32 pci_raw_inl()
-+ *
-+ * Read a raw dword at specified address from I/O space
-+ */
-+unsigned long pci_raw_inl(long addr)
-+{
-+      long value;
-+      volatile unsigned long *ptr;
-+
-+      ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      value = *ptr;
-+
-+      DBG("PCI: raw_inl addr=0x%08X, value=0x%08X\n",  addr, value);
-+      return (unsigned long) value;
-+}
-+
-+/*
-+ * void pci_outb()
-+ *
-+ * Write a byte value at specified address to I/O space
-+ */
-+void pci_outb( unsigned char value,  long addr)
-+{
-+
-+      *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)) = value;
-+      DBG("PCI: outb addr=0x%08X, value=0x%02X\n",  addr, value);
-+}
-+
-+
-+/*
-+ * void pci_outw()
-+ *
-+ * Write a word value at specified address to I/O space
-+ */
-+void pci_outw(volatile unsigned short value, volatile  long addr)
-+{
-+      volatile unsigned short *ptr;
-+
-+      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      *ptr = cpu_to_le16(value);
-+      DBG("PCI: outw addr=0x%08X, value=0x%04X\n",  addr, value);
-+}
-+
-+/*
-+ * void pci_raw_outw()
-+ *
-+ * Write a raw word value at specified address to I/O space
-+ */
-+void pci_raw_outw(volatile unsigned short value, volatile  long addr)
-+{
-+      volatile unsigned short *ptr;
-+
-+      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      *ptr = value;
-+      DBG("PCI: raw_outw addr=0x%08X, value=0x%04X\n",  addr, value);
-+}
-+
-+/*
-+ * void pci_outl()
-+ *
-+ * Write a long word value at specified address to I/O space
-+ */
-+void pci_outl(volatile unsigned long value, volatile long addr)
-+{
-+      volatile unsigned long *ptr;
-+
-+      ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      *ptr = cpu_to_le32(value);
-+      DBG("PCI: outl addr=0x%08X, value=0x%08X\n", addr, value);
-+}
-+
-+/*
-+ * void pci_raw_outl()
-+ *
-+ * Write a raw long word value at specified address to I/O space
-+ */
-+void pci_raw_outl(volatile unsigned long value, volatile long addr)
-+{
-+      volatile unsigned long *ptr;
-+
-+      ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
-+      *ptr = value;
-+      DBG("PCI: raw_outl addr=0x%08X, value=0x%08X\n", addr, value);
-+}
-+
-+/*
-+ * void pci_insb()
-+ *
-+ * Read several byte values from specified I/O port
-+ */
-+void pci_insb(volatile unsigned char *addr, unsigned char *buf, int len)
-+{
-+      for (; len--; buf++)
-+              *buf = pci_inb((unsigned long)addr);
-+      DBG("PCI: pci_insb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+
-+/*
-+ * void pci_insw()
-+ *
-+ * Read several word values from specified I/O port
-+ */
-+void pci_insw(volatile unsigned short *addr, unsigned short *buf, int len)
-+{
-+      for (; len--; buf++)
-+              *buf = pci_inw((unsigned long)addr);
-+      DBG("PCI: pci_insw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+/*
-+ * void pci_insl()
-+ *
-+ * Read several dword values from specified I/O port
-+ */
-+void pci_insl(volatile unsigned long *addr, unsigned long *buf, int len)
-+{
-+      for (; len--; buf++)
-+              *buf = pci_inl((unsigned long)addr);
-+      DBG("PCI: pci_insl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+/*
-+ * void pci_outsb()
-+ *
-+ * Write several byte values to specified I/O port
-+ */
-+void pci_outsb(volatile unsigned char *addr, const unsigned char *buf, int len)
-+{
-+      for (; len--; buf++)
-+              pci_outb((unsigned long)addr, *buf);
-+      DBG("PCI: pci_outsb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+/*
-+ * void pci_outsw()
-+ *
-+ * Write several word values to specified I/O port
-+ */
-+void pci_outsw(volatile unsigned short *addr, const unsigned short *buf, int len)
-+{
-+      for (; len--; buf++)
-+              pci_outw((unsigned long)addr, *buf);
-+      DBG("PCI: pci_outsw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+/*
-+ * void pci_outsl()
-+ *
-+ * Write several dword values to specified I/O port
-+ */
-+void pci_outsl(volatile unsigned long *addr, const unsigned long *buf, int len)
-+{
-+      for (; len--; buf++)
-+              pci_outl((unsigned long)addr, *buf);
-+      DBG("PCI: pci_outsl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
-+}
-+
-+/*
-+ * void pci_xlb_handler()
-+ *
-+ * PCI XLB interrupt handler
-+ */
-+irqreturn_t xlb_interrupt(int irq, void *dev)
-+{
-+      volatile int xlb_error = MCF_PCIISR;
-+
-+      /* Acknowlege interrupt */
-+      MCF_PCIISR = xlb_error;
-+
-+      /* Dump interrupt reason */
-+      if (xlb_error & MCF_PCIISR_RE)
-+              DBG("PCI: Retry Error Received\n");
-+              
-+      if (xlb_error & MCF_PCIISR_IA)
-+              DBG("PCI: Initiator Abort Received\n");
-+              
-+      if (xlb_error & MCF_PCIISR_TA)
-+              DBG("PCI: Target Abort Received\n");
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+/*
-+ * void pci_arbiter_handler()
-+ *
-+ * PCI arbiter interrupt handler
-+ */
-+irqreturn_t arb_interrupt(int irq, void *dev)
-+{
-+      volatile unsigned long arb_error = MCF_PCIARB_PASR;
-+
-+      /* Acknowlege interrupt */
-+      printk("%s\n",__FUNCTION__);
-+      MCF_PCIARB_PASR = arb_error;
-+
-+      if (arb_error & MCF_PCIARB_PASR_ITLMBK) {
-+              DBG("PCI: coldfire master time-out\n");                         
-+                              
-+              /* Set infinite  number of retries */                   
-+              MCF_PCIICR &= ~0xFF;                            
-+      }
-+              
-+      if (arb_error & MCF_PCIARB_PASR_EXTMBK(0x1F)) {
-+              arb_error >>= 17;
-+              DBG("PCI: external master time-out (mask = 0x%X)\n", arb_error);
-+              
-+              /* raise arbitration priority level */          
-+              MCF_PCIARB_PACR = MCF_PCIARB_PACR_EXTMPRI(arb_error);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+/*
-+ * void pci_eint_handler()
-+ *
-+ * Eport interrupt handler
-+ */
-+irqreturn_t eint_handler(int irq, void *dev)
-+{
-+      /* Just acknowlege interrupt and exit */
-+      MCF_EPFR = 0x1 << (irq - 64);
-+      return IRQ_HANDLED;
-+}
-+
-+
-+/*
-+ * void __init coldfire_fixup(int pci_modify)
-+ *
-+ * Assign IRQ numbers as used by Linux to the interrupt pins
-+ * of the PCI cards.
-+ */
-+static void __init coldfire_fixup(int pci_modify)
-+{
-+      struct pci_dev *dev;
-+      unsigned char slot, pin;
-+
-+      DBG("%s\n",__FUNCTION__);
-+#ifdef NL_ORIGINAL
-+      pci_for_each_dev(dev) {
-+#else
-+      dev = NULL;
-+      while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-+#endif
-+              if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) {
-+                      slot = PCI_SLOT(dev->devfn);
-+                      dev->irq = 64 + board_info[slot].irq;
-+
-+                      /* Check if device needs interrupt */
-+#ifdef NL_ORIGINAL
-+                      pcibios_read_config_byte(
-+                                  dev->bus->number, dev->devfn,
-+                                  PCI_INTERRUPT_PIN, &pin);
-+
-+                      if ( pin ) {
-+                              pcibios_write_config_byte(
-+                                      dev->bus->number, dev->devfn,
-+                                      PCI_INTERRUPT_LINE, dev->irq);
-+                      }
-+#else
-+                      pci_read_config_byte(dev,
-+                                  PCI_INTERRUPT_PIN, &pin);
-+
-+                      if ( pin ) {
-+                              pci_write_config_byte(dev,
-+                                      PCI_INTERRUPT_LINE, dev->irq);
-+                      }
-+#endif
-+              }
-+      }
-+}
-+
-+static void __init configure_device(struct pci_dev *dev)
-+{
-+      /* TODO: This should depend from disable_pci_burst setting */
-+      DBG("%s\n",__FUNCTION__);
-+#ifdef NL_ORIGINAL
-+      pcibios_write_config_byte(bus, devfn, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
-+#else
-+      pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
-+#endif
-+}
-+
-+struct pci_bus_info *__init init_coldfire_pci(void)
-+{
-+      static struct pci_bus_info bus;
-+      int i;
-+      int pci_mem_va;
-+      static char irq_name[N_IRQS][15];
-+
-+      /* Get controller revision */
-+      revision = MCF_PCICCRIR;
-+      printk("ColdFire PCI Host Bridge (Rev. %d) detected:"
-+              "MEMBase %x,MEMLen %x,IOBase %x,IOLen %x\n",
-+              revision, HOST_MEM_BASE, PCI_MEM_SIZE - 1, 0, PCI_IO_SIZE - 1);
-+
-+      /* Setup bus info structure. */
-+      memset(&bus, 0, sizeof (struct pci_bus_info));
-+
-+      /* Request intiator memory resource */
-+      bus.mem_space.start = PCI_MEM_BASE;//HOST_MEM_BASE;
-+      bus.mem_space.end = bus.mem_space.start + PCI_MEM_SIZE - 1;
-+      bus.mem_space.name = "PCI Bus #0";
-+      if (request_resource(&iomem_resource, &bus.mem_space) != 0)
-+      {
-+              printk("Failed to request bridge iomem resource\n");
-+              return NULL;
-+      }
-+
-+      /* Request intiator memory resource */
-+      bus.io_space.start = 0;
-+      bus.io_space.end = bus.io_space.start + PCI_IO_SIZE - 1;
-+      bus.io_space.name =  "PCI Bus #0";
-+      if (request_resource(&ioport_resource, &bus.io_space) != 0)
-+      {
-+              printk("Failed to request bridge ioport resource\n");
-+              return NULL;
-+      }
-+
-+      /* Must Reset!!! If bootloader has PCI enabled, it will cause
-+       * problem in linux when it tries to configure/find resources
-+       * for the pci devices.  Both registers need to be reset.
-+       */
-+      MCF_PCIGSCR = 0x1;
-+      MCF_PCITCR = 0x00000000;
-+
-+      /* Set up the arbiter */
-+      MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/
-+                      | MCF_PCIARB_PACR_INTMPRI 
-+                      | MCF_PCIARB_PACR_INTMINTEN 
-+                      | MCF_PCIARB_PACR_EXTMPRI(0x1F) 
-+                      | MCF_PCIARB_PACR_EXTMINTEN(0x1F);
-+
-+      /* GNT and REQ */
-+      MCF_PAR_PCIBG = 0x3FF;
-+      MCF_PAR_PCIBR = 0x3FF;
-+
-+      /* Enable bus mastering, memory access and MWI */
-+      MCF_PCISCR = MCF_PCISCR_B | MCF_PCISCR_M | MCF_PCISCR_MW;
-+
-+      /* Setup burst parameters */
-+      MCF_PCICR1 = MCF_PCICR1_LATTIMER(32) |
-+                   MCF_PCICR1_CACHELINESIZE(PCI_CACHE_LINE);
-+
-+      MCF_PCICR2 = 0;
-+      /*MCF_PCICR2_MINGNT(PCI_MINGNT) |
-+              MCF_PCICR2_MAXLAT(PCI_MAXLAT);
-+      */
-+      /* Turn on error signaling */
-+      MCF_PCIICR = MCF_PCIICR_TAE | MCF_PCIICR_IAE | PCI_RETRIES;
-+      MCF_PCIGSCR |= MCF_PCIGSCR_SEE;
-+      /*
-+       * Configure Initiator Windows
-+       * Window 0: 128M PCI Memory @ HOST_MEM_BASE, 1:1 mapping
-+       * Window 1: 64K  I/O Memory @ HOST_IO_BASE,  1:0 mapping
-+       */
-+      MCF_PCIIW0BTAR = WxBAR(HOST_MEM_BASE, PCI_MEM_BASE, PCI_MEM_SIZE);
-+      MCF_PCIIW1BTAR = WxBAR(HOST_IO_BASE,  PCI_IO_BASE_ADDR,  PCI_IO_SIZE);
-+
-+      MCF_PCIIWCR = MCF_PCIIWCR_WINCTRL1_IO |
-+                    MCF_PCIIWCR_WINCTRL0_MEMRDLINE;
-+
-+      /* Target PCI DMA Windows */
-+      MCF_PCIBAR1   = PCI_DMA_BASE;
-+      MCF_PCITBATR1 = HOST_DMA_BASE | MCF_PCITBATR1_EN;
-+        MCF_PCIBAR0   = MCF_RAMBAR0;;
-+        MCF_PCITBATR0 = MCF_RAMBAR0 | MCF_PCITBATR0_EN;
-+        DBG("PCI TCR %x,MCF_PCIBAR1 %x,MCF_PCITBATR1 %x."
-+              "MCF_PCIBAR0 %x,MCF_PCITBATR9 %x\n", MCF_PCITCR, MCF_PCIBAR1,
-+              MCF_PCITBATR1, MCF_PCIBAR0, MCF_PCITBATR0);
-+      /* Enable internal PCI controller interrupts */
-+      MCF_ICR(ISC_PCI_XLB) = ILP_PCI_XLB;
-+      /*request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
-+                      SA_INTERRUPT, "PCI XL Bus", (void*)-1);
-+      enable_irq (64+ISC_PCI_XLB);
-+      */
-+        if(request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
-+                         IRQF_DISABLED, "PCI XL Bus", (void*)-1)){
-+              printk("Cannot allocate ISC_PCI_XLB  IRQ\n");
-+                return (struct pci_bus_info *)-EBUSY;
-+      }
-+
-+      MCF_ICR(ISC_PCI_ARB) = ILP_PCI_ARB;
-+      /*request_irq(64+ISC_PCI_ARB, arb_interrupt, 
-+                      SA_INTERRUPT, "PCI Arbiter", (void*)-1);
-+      enable_irq (64+ISC_PCI_ARB);
-+      */
-+        if(request_irq(64+ISC_PCI_ARB, arb_interrupt,
-+                        IRQF_DISABLED, "PCI Arbiter", (void*)-1)){
-+                printk("Cannot allocate ISC_PCI_ARB  IRQ\n");
-+                return (struct pci_bus_info *)-EBUSY;
-+        }
-+
-+      /* Set slots interrupt setting */
-+      for (i = 0; i < N_IRQS; i++) 
-+      {       
-+              /* Set trailing edge for PCI interrupts */
-+              MCF_EPPAR &= ~MCF_EPPAR_EPPA(irq_lines[i], 0x3);
-+              if (irq_lines[i] == 5)
-+                      MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  MCF_EPPAR_EPPAx_FALLING);
-+              else
-+                        MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  0/*MCF_EPPAR_EPPAx_FALLING*/);
-+              /* Turn on irq line in eport */
-+              MCF_EPIER |= MCF_EPIER_EPIE(irq_lines[i]);
-+
-+              /* Enable irq in gpio */
-+              if (irq_lines[i] == 5)
-+                  MCF_PAR_FECI2CIRQ |= 1;
-+                  
-+              if (irq_lines[i] == 6)
-+                  MCF_PAR_FECI2CIRQ |= 2;   
-+
-+              /* Register external interrupt handlers */
-+              sprintf(irq_name[i], "PCI IRQ%d", irq_lines[i]);
-+              /*request_irq(64 + irq_lines[i], eint_handler, 
-+                          SA_SHIRQ, irq_name[i], (void*)-1);
-+              enable_irq(64 + irq_lines[i]);*/
-+              if(request_irq(64 + irq_lines[i], eint_handler, 
-+                              IRQF_SHARED, irq_name[i], (void*)-1)){
-+                      printk("Cannot allocate irq_lines[%d] IRQ\n", irq_lines[i]);
-+                      return (struct pci_bus_info *)-EBUSY;
-+              }
-+      }
-+
-+      /* Clear PCI Reset and wait for devices to reset */
-+      MCF_PCIGSCR &= ~MCF_PCIGSCR_PR;
-+      schedule_timeout((5 * HZ) / 10);
-+      /* Remap initiator windows (should be 1:1 to the physical memory) */
-+      pci_mem_va = (int) ioremap_nocache(HOST_MEM_BASE, PCI_MEM_SIZE + PCI_IO_SIZE);
-+#if 1
-+      printk("%s: MEMBase_phy %x, Virt %x, len %x\n",__FUNCTION__,
-+              HOST_MEM_BASE,pci_mem_va,PCI_MEM_SIZE + PCI_IO_SIZE);
-+#endif
-+      BUG_ON(pci_mem_va != HOST_MEM_BASE);
-+
-+      /* Setup bios32 and pci bus driver callbacks */
-+      bus.m68k_pci_ops = &bus_ops;
-+      bus.fixup = coldfire_fixup;
-+      bus.conf_device = configure_device;
-+
-+      return &bus;
-+}
-+
---- /dev/null
-+++ b/arch/m68k/coldfire/muldi3.S
-@@ -0,0 +1,64 @@
-+/*
-+ * Coldfire muldi3 assembly verion
-+ */
-+ 
-+#include <linux/linkage.h>
-+.globl __muldi3
-+
-+ENTRY(__muldi3)
-+      linkw   %fp,#0
-+      lea     %sp@(-32),%sp
-+      moveml  %d2-%d7/%a2-%a3,%sp@
-+      moveal  %fp@(8), %a2
-+      moveal  %fp@(12), %a3
-+      moveal  %fp@(16), %a0
-+      moveal  %fp@(20),%a1
-+      movel   %a3,%d2
-+      andil   #65535,%d2
-+      movel   %a3,%d3
-+      clrw    %d3
-+      swap    %d3
-+      movel   %a1,%d0
-+      andil   #65535,%d0
-+      movel   %a1,%d1
-+      clrw    %d1
-+      swap    %d1
-+      movel   %d2,%d7
-+      mulsl   %d0,%d7
-+      movel   %d2,%d4
-+      mulsl   %d1,%d4
-+      movel   %d3,%d2
-+      mulsl   %d0,%d2
-+      mulsl   %d1,%d3
-+      movel   %d7,%d0
-+      clrw    %d0
-+      swap    %d0
-+      addl    %d0,%d4
-+      addl    %d2,%d4
-+      cmpl    %d4,%d2
-+      blss    1f
-+      addil   #65536,%d3
-+1:
-+      movel   %d4,%d0
-+      clrw    %d0
-+      swap    %d0
-+      movel   %d3,%d5
-+      addl    %d0,%d5
-+      movew   %d4,%d6
-+      swap    %d6
-+      movew   %d7,%d6
-+      movel   %d5,%d0
-+      movel   %d6,%d1
-+      movel   %a3,%d2
-+      movel   %a0,%d3
-+      mulsl   %d3,%d2
-+      movel   %a2,%d3
-+      movel   %a1,%d4
-+      mulsl   %d4,%d3
-+      addl    %d3,%d2
-+      movel   %d2,%d0
-+      addl    %d5,%d0
-+      moveml  %sp@, %d2-%d7/%a2-%a3
-+      lea     %sp@(32),%sp
-+      unlk    %fp
-+      rts
---- /dev/null
-+++ b/arch/m68k/coldfire/pci.c
-@@ -0,0 +1,245 @@
-+/*
-+ * linux/arch/m68k/coldfire/pci.c
-+ *
-+ * PCI initialization for Coldfire architectures.
-+ *
-+ * Currently Supported:
-+ *    M5445x
-+ *
-+ * Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+
-+#include <asm/mcfsim.h>
-+#include <asm/pci.h>
-+
-+/* pci ops for reading/writing config */
-+struct pci_raw_ops *raw_pci_ops;
-+
-+/* pci debug flag */
-+static int debug_pci;
-+
-+#ifdef CONFIG_M54455
-+extern int init_mcf5445x_pci(void);
-+extern void mcf5445x_conf_device(struct pci_dev *dev);
-+extern void mcf5445x_pci_dumpregs(void);
-+
-+extern struct resource pci_ioport_resource;
-+extern struct resource pci_iomem_resource;
-+#endif
-+
-+static int
-+pci_read(struct pci_bus *bus, unsigned int devfn, int where,
-+       int size, u32 *value)
-+{
-+      return raw_pci_ops->read(0, bus->number, devfn, where, size, value);
-+}
-+
-+static int
-+pci_write(struct pci_bus *bus, unsigned int devfn, int where,
-+        int size, u32 value)
-+{
-+      return raw_pci_ops->write(0, bus->number, devfn, where, size, value);
-+}
-+
-+struct pci_ops pci_root_ops = {
-+      .read = pci_read,
-+      .write = pci_write,
-+};
-+
-+/*
-+ * pcibios_setup(char *)
-+ *
-+ * Initialize the pcibios based on cmd line params.
-+ */
-+char *
-+pcibios_setup(char *str)
-+{
-+      if (!strcmp(str, "debug")) {
-+              debug_pci = 1;
-+              return NULL;
-+      }
-+      return str;
-+}
-+
-+/*
-+ * We need to avoid collisions with `mirrored' VGA ports
-+ * and other strange ISA hardware, so we always want the
-+ * addresses to be allocated in the 0x000-0x0ff region
-+ * modulo 0x400.
-+ *
-+ * Why? Because some silly external IO cards only decode
-+ * the low 10 bits of the IO address. The 0x00-0xff region
-+ * is reserved for motherboard devices that decode all 16
-+ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
-+ * but we want to try to avoid allocating at 0x2900-0x2bff
-+ * which might have be mirrored at 0x0100-0x03ff..
-+ */
-+void
-+pcibios_align_resource(void *data, struct resource *res, resource_size_t size,
-+                     resource_size_t align)
-+{
-+      struct pci_dev *dev = data;
-+
-+      if (res->flags & IORESOURCE_IO) {
-+              resource_size_t start = res->start;
-+
-+              if (size > 0x100)
-+                      printk(KERN_ERR "PCI: I/O Region %s/%d too large"
-+                             " (%ld bytes)\n", pci_name(dev),
-+                             dev->resource - res, (long int)size);
-+
-+              if (start & 0x300) {
-+                      start = (start + 0x3ff) & ~0x3ff;
-+                      res->start = start;
-+              }
-+      }
-+}
-+
-+/*
-+ * Swizzle the device pin each time we cross a bridge
-+ * and return the slot number.
-+ */
-+static u8 __devinit
-+pcibios_swizzle(struct pci_dev *dev, u8 *pin)
-+{
-+      return 0;
-+}
-+
-+/*
-+ * Map a slot/pin to an IRQ.
-+ */
-+static int
-+pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+      return 0x43;
-+}
-+
-+/*
-+ * pcibios_update_irq(struct pci_dev *dev, int irq)
-+ *
-+ * Update a PCI interrupt.
-+ */
-+void
-+pcibios_update_irq(struct pci_dev *dev, int irq)
-+{
-+      pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
-+}
-+
-+/*
-+ * pcibios_enable_device(struct pci_dev *dev, int mask)
-+ *
-+ * Enable a device on the PCI bus.
-+ */
-+int
-+pcibios_enable_device(struct pci_dev *dev, int mask)
-+{
-+      u16 cmd, old_cmd;
-+      int idx;
-+      struct resource *r;
-+
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+      old_cmd = cmd;
-+      for (idx = 0; idx < 6; idx++) {
-+              r = &dev->resource[idx];
-+              if (!r->start && r->end) {
-+                      printk(KERN_ERR "PCI: Device %s not available because "
-+                             "of resource collisions\n", pci_name(dev));
-+                      return -EINVAL;
-+              }
-+              if (r->flags & IORESOURCE_IO)
-+                      cmd |= PCI_COMMAND_IO;
-+              if (r->flags & IORESOURCE_MEM)
-+                      cmd |= PCI_COMMAND_MEMORY;
-+      }
-+      if (cmd != old_cmd) {
-+              printk("PCI: Enabling device %s (%04x -> %04x)\n",
-+                     pci_name(dev), old_cmd, cmd);
-+              pci_write_config_word(dev, PCI_COMMAND, cmd);
-+#ifdef CONFIG_M54455
-+              mcf5445x_conf_device(dev);
-+#endif
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * pcibios_fixup_bus(struct pci_bus *bus)
-+ */
-+void
-+pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+      struct pci_dev *dev = bus->self;
-+
-+      if (!dev) {
-+              /* Root bus. */
-+#ifdef CONFIG_M54455
-+              bus->resource[0] = &pci_ioport_resource;
-+              bus->resource[1] = &pci_iomem_resource;
-+#endif
-+      }
-+}
-+
-+/*
-+ * pcibios_init(void)
-+ *
-+ * Allocate/initialize low level pci bus/devices.
-+ */
-+static int __init
-+pcibios_init(void)
-+{
-+      struct pci_bus *bus;
-+
-+      if (!raw_pci_ops) {
-+              printk(KERN_WARNING "PCIBIOS: FATAL: NO PCI Hardware found\n");
-+              return 0;
-+      }
-+
-+      /* allocate and scan the (only) bus */
-+      bus = pci_scan_bus_parented(NULL, 0, &pci_root_ops, NULL);
-+
-+      /* setup everything */
-+      if (bus) {
-+              /* compute the bridge window sizes */
-+              pci_bus_size_bridges(bus);
-+
-+              /* (re)assign device resources */
-+              pci_bus_assign_resources(bus);
-+
-+              /* add the bus to the system */
-+              pci_bus_add_devices(bus);
-+
-+              /* fixup irqs */
-+              pci_fixup_irqs(pcibios_swizzle, pcibios_map_irq);
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * pci_init(void)
-+ *
-+ * Initialize the PCI Hardware.
-+ */
-+static int __init
-+pci_init(void)
-+{
-+#if defined(CONFIG_M54455)
-+      init_mcf5445x_pci();
-+#endif
-+      if (!raw_pci_ops)
-+              printk(KERN_ERR "PCI: FATAL: NO PCI Detected\n");
-+
-+      return 0;
-+}
-+
-+/* low level hardware (first) */
-+arch_initcall(pci_init);
-+
-+/* basic bios init (second) */
-+subsys_initcall(pcibios_init);
---- /dev/null
-+++ b/arch/m68k/coldfire/signal.c
-@@ -0,0 +1,871 @@
-+/*
-+ *  linux/arch/m68k/kernel/signal.c
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file COPYING in the main directory of this archive
-+ * for more details.
-+ */
-+
-+/*
-+ * Derived from m68k/kernel/signal.c and the original authors are credited
-+ * there.
-+ *
-+ * Coldfire support by:
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ * Copyright Freescale Semiconductor, Inc 2007
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/kernel.h>
-+#include <linux/signal.h>
-+#include <linux/syscalls.h>
-+#include <linux/errno.h>
-+#include <linux/wait.h>
-+#include <linux/ptrace.h>
-+#include <linux/unistd.h>
-+#include <linux/stddef.h>
-+#include <linux/highuid.h>
-+#include <linux/personality.h>
-+#include <linux/tty.h>
-+#include <linux/binfmts.h>
-+
-+#include <asm/setup.h>
-+#include <asm/cf_uaccess.h>
-+#include <asm/cf_pgtable.h>
-+#include <asm/traps.h>
-+#include <asm/ucontext.h>
-+#include <asm/cacheflush.h>
-+
-+#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
-+
-+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
-+
-+const int frame_extra_sizes[16] = {
-+  [1] = -1,
-+  [2] = sizeof(((struct frame *)0)->un.fmt2),
-+  [3] = sizeof(((struct frame *)0)->un.fmt3),
-+  [4] = 0,
-+  [5] = -1,
-+  [6] = -1,
-+  [7] = sizeof(((struct frame *)0)->un.fmt7),
-+  [8] = -1,
-+  [9] = sizeof(((struct frame *)0)->un.fmt9),
-+  [10]        = sizeof(((struct frame *)0)->un.fmta),
-+  [11]        = sizeof(((struct frame *)0)->un.fmtb),
-+  [12]        = -1,
-+  [13]        = -1,
-+  [14]        = -1,
-+  [15]        = -1,
-+};
-+
-+/*
-+ * Atomically swap in the new signal mask, and wait for a signal.
-+ */
-+asmlinkage int do_sigsuspend(struct pt_regs *regs)
-+{
-+      old_sigset_t mask = regs->d3;
-+      sigset_t saveset;
-+
-+      mask &= _BLOCKABLE;
-+      spin_lock_irq(&current->sighand->siglock);
-+      saveset = current->blocked;
-+      siginitset(&current->blocked, mask);
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      regs->d0 = -EINTR;
-+      while (1) {
-+              current->state = TASK_INTERRUPTIBLE;
-+              schedule();
-+              if (do_signal(&saveset, regs))
-+                      return -EINTR;
-+      }
-+}
-+
-+asmlinkage int
-+do_rt_sigsuspend(struct pt_regs *regs)
-+{
-+      sigset_t __user *unewset = (sigset_t __user *)regs->d1;
-+      size_t sigsetsize = (size_t)regs->d2;
-+      sigset_t saveset, newset;
-+
-+      /* XXX: Don't preclude handling different sized sigset_t's.  */
-+      if (sigsetsize != sizeof(sigset_t))
-+              return -EINVAL;
-+
-+      if (copy_from_user(&newset, unewset, sizeof(newset)))
-+              return -EFAULT;
-+      sigdelsetmask(&newset, ~_BLOCKABLE);
-+
-+      spin_lock_irq(&current->sighand->siglock);
-+      saveset = current->blocked;
-+      current->blocked = newset;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      regs->d0 = -EINTR;
-+      while (1) {
-+              current->state = TASK_INTERRUPTIBLE;
-+              schedule();
-+              if (do_signal(&saveset, regs))
-+                      return -EINTR;
-+      }
-+}
-+
-+asmlinkage int
-+sys_sigaction(int sig, const struct old_sigaction __user *act,
-+            struct old_sigaction __user *oact)
-+{
-+      struct k_sigaction new_ka, old_ka;
-+      int ret;
-+
-+      if (act) {
-+              old_sigset_t mask;
-+              if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
-+                  __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
-+                  __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
-+                      return -EFAULT;
-+              __get_user(new_ka.sa.sa_flags, &act->sa_flags);
-+              __get_user(mask, &act->sa_mask);
-+              siginitset(&new_ka.sa.sa_mask, mask);
-+      }
-+
-+      ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
-+
-+      if (!ret && oact) {
-+              if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
-+                  __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
-+                  __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
-+                      return -EFAULT;
-+              __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
-+              __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
-+      }
-+
-+      return ret;
-+}
-+
-+asmlinkage int
-+sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
-+{
-+      return do_sigaltstack(uss, uoss, rdusp());
-+}
-+
-+
-+/*
-+ * Do a signal return; undo the signal stack.
-+ *
-+ * Keep the return code on the stack quadword aligned!
-+ * That makes the cache flush below easier.
-+ */
-+
-+struct sigframe
-+{
-+      char __user *pretcode;
-+      int sig;
-+      int code;
-+      struct sigcontext __user *psc;
-+      char retcode[16];
-+      unsigned long extramask[_NSIG_WORDS-1];
-+      struct sigcontext sc;
-+};
-+
-+struct rt_sigframe
-+{
-+      char __user *pretcode;
-+      int sig;
-+      struct siginfo __user *pinfo;
-+      void __user *puc;
-+      char retcode[16];
-+      struct siginfo info;
-+      struct ucontext uc;
-+};
-+
-+#define FPCONTEXT_SIZE        216
-+#define uc_fpstate    uc_filler[0]
-+#define uc_formatvec  uc_filler[FPCONTEXT_SIZE/4]
-+#define uc_extra      uc_filler[FPCONTEXT_SIZE/4+1]
-+
-+#ifdef CONFIG_FPU
-+static unsigned char fpu_version; /* version num of fpu, set by setup_frame */
-+
-+static inline int restore_fpu_state(struct sigcontext *sc)
-+{
-+      int err = 1;
-+
-+      if (FPU_IS_EMU) {
-+          /* restore registers */
-+          memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12);
-+          memcpy(current->thread.fp, sc->sc_fpregs, 24);
-+          return 0;
-+      }
-+
-+      if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
-+          /* Verify the frame format.  */
-+          if (!CPU_IS_060 && (sc->sc_fpstate[0] != fpu_version))
-+              goto out;
-+          if (CPU_IS_020_OR_030) {
-+              if (m68k_fputype & FPU_68881 &&
-+                  !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4))
-+                  goto out;
-+              if (m68k_fputype & FPU_68882 &&
-+                  !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4))
-+                  goto out;
-+          } else if (CPU_IS_040) {
-+              if (!(sc->sc_fpstate[1] == 0x00 ||
-+                    sc->sc_fpstate[1] == 0x28 ||
-+                    sc->sc_fpstate[1] == 0x60))
-+                  goto out;
-+          } else if (CPU_IS_060) {
-+              if (!(sc->sc_fpstate[3] == 0x00 ||
-+                    sc->sc_fpstate[3] == 0x60 ||
-+                    sc->sc_fpstate[3] == 0xe0))
-+                  goto out;
-+          } else
-+              goto out;
-+
-+      }
-+      err = 0;
-+
-+out:
-+      return err;
-+}
-+
-+static inline int rt_restore_fpu_state(struct ucontext __user *uc)
-+{
-+      unsigned char fpstate[FPCONTEXT_SIZE];
-+      int context_size = CPU_IS_060 ? 8 : 0;
-+      fpregset_t fpregs;
-+      int err = 1;
-+
-+      if (FPU_IS_EMU) {
-+              /* restore fpu control register */
-+              if (__copy_from_user(current->thread.fpcntl,
-+                              uc->uc_mcontext.fpregs.f_fpcntl, 12))
-+                      goto out;
-+              /* restore all other fpu register */
-+              if (__copy_from_user(current->thread.fp,
-+                              uc->uc_mcontext.fpregs.f_fpregs, 96))
-+                      goto out;
-+              return 0;
-+      }
-+
-+      if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate))
-+              goto out;
-+      if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
-+              if (!CPU_IS_060)
-+                      context_size = fpstate[1];
-+              /* Verify the frame format.  */
-+              if (!CPU_IS_060 && (fpstate[0] != fpu_version))
-+                      goto out;
-+              if (CPU_IS_020_OR_030) {
-+                      if (m68k_fputype & FPU_68881 &&
-+                          !(context_size == 0x18 || context_size == 0xb4))
-+                              goto out;
-+                      if (m68k_fputype & FPU_68882 &&
-+                          !(context_size == 0x38 || context_size == 0xd4))
-+                              goto out;
-+              } else if (CPU_IS_040) {
-+                      if (!(context_size == 0x00 ||
-+                            context_size == 0x28 ||
-+                            context_size == 0x60))
-+                              goto out;
-+              } else if (CPU_IS_060) {
-+                      if (!(fpstate[3] == 0x00 ||
-+                            fpstate[3] == 0x60 ||
-+                            fpstate[3] == 0xe0))
-+                              goto out;
-+              } else
-+                      goto out;
-+              if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs,
-+                                   sizeof(fpregs)))
-+                      goto out;
-+      }
-+      if (context_size &&
-+          __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1,
-+                           context_size))
-+              goto out;
-+      err = 0;
-+
-+out:
-+      return err;
-+}
-+#endif
-+
-+static inline int
-+restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc,
-+      void __user *fp, int *pd0)
-+{
-+      int fsize, formatvec;
-+      struct sigcontext context;
-+      int err = 0;
-+
-+      /* get previous context */
-+      if (copy_from_user(&context, usc, sizeof(context)))
-+              goto badframe;
-+
-+      /* restore passed registers */
-+      regs->d1 = context.sc_d1;
-+      regs->a0 = context.sc_a0;
-+      regs->a1 = context.sc_a1;
-+      regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff);
-+      regs->pc = context.sc_pc;
-+      regs->orig_d0 = -1;             /* disable syscall checks */
-+      wrusp(context.sc_usp);
-+      formatvec = context.sc_formatvec;
-+      regs->format = formatvec >> 12;
-+      regs->vector = formatvec & 0xfff;
-+
-+#ifdef CONFIG_FPU
-+      err = restore_fpu_state(&context);
-+#endif
-+
-+      fsize = frame_extra_sizes[regs->format];
-+      if (fsize < 0) {
-+              /*
-+               * user process trying to return with weird frame format
-+               */
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "user process returning with weird \
-+                      frame format\n");
-+#endif
-+              goto badframe;
-+      }
-+
-+      /* OK.  Make room on the supervisor stack for the extra junk,
-+       * if necessary.
-+       */
-+
-+      {
-+              struct switch_stack *sw = (struct switch_stack *)regs - 1;
-+              regs->d0 = context.sc_d0;
-+#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
-+              __asm__ __volatile__
-+                      ("   movel %0,%/sp\n\t"
-+                       "   bra ret_from_signal\n"
-+                       "4:\n"
-+                       ".section __ex_table,\"a\"\n"
-+                       "   .align 4\n"
-+                       "   .long 2b,4b\n"
-+                       ".previous"
-+                       : /* no outputs, it doesn't ever return */
-+                       : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
-+                         "n" (frame_offset), "a" (fp)
-+                       : "a0");
-+#undef frame_offset
-+              /*
-+               * If we ever get here an exception occurred while
-+               * building the above stack-frame.
-+               */
-+              goto badframe;
-+      }
-+
-+      *pd0 = context.sc_d0;
-+      return err;
-+
-+badframe:
-+      return 1;
-+}
-+
-+static inline int
-+rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
-+                  struct ucontext __user *uc, int *pd0)
-+{
-+      int fsize, temp;
-+      greg_t __user *gregs = uc->uc_mcontext.gregs;
-+      unsigned long usp;
-+      int err;
-+
-+      err = __get_user(temp, &uc->uc_mcontext.version);
-+      if (temp != MCONTEXT_VERSION)
-+              goto badframe;
-+      /* restore passed registers */
-+      err |= __get_user(regs->d0, &gregs[0]);
-+      err |= __get_user(regs->d1, &gregs[1]);
-+      err |= __get_user(regs->d2, &gregs[2]);
-+      err |= __get_user(regs->d3, &gregs[3]);
-+      err |= __get_user(regs->d4, &gregs[4]);
-+      err |= __get_user(regs->d5, &gregs[5]);
-+      err |= __get_user(sw->d6, &gregs[6]);
-+      err |= __get_user(sw->d7, &gregs[7]);
-+      err |= __get_user(regs->a0, &gregs[8]);
-+      err |= __get_user(regs->a1, &gregs[9]);
-+      err |= __get_user(regs->a2, &gregs[10]);
-+      err |= __get_user(sw->a3, &gregs[11]);
-+      err |= __get_user(sw->a4, &gregs[12]);
-+      err |= __get_user(sw->a5, &gregs[13]);
-+      err |= __get_user(sw->a6, &gregs[14]);
-+      err |= __get_user(usp, &gregs[15]);
-+      wrusp(usp);
-+      err |= __get_user(regs->pc, &gregs[16]);
-+      err |= __get_user(temp, &gregs[17]);
-+      regs->sr = (regs->sr & 0xff00) | (temp & 0xff);
-+      regs->orig_d0 = -1;             /* disable syscall checks */
-+      err |= __get_user(temp, &uc->uc_formatvec);
-+      regs->format = temp >> 12;
-+      regs->vector = temp & 0xfff;
-+
-+#ifdef CONFIG_FPU
-+      err |= rt_restore_fpu_state(uc);
-+#endif
-+
-+      if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
-+              goto badframe;
-+
-+      fsize = frame_extra_sizes[regs->format];
-+      if (fsize < 0) {
-+              /*
-+               * user process trying to return with weird frame format
-+               */
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "user process returning with weird \
-+                      frame format\n");
-+#endif
-+              goto badframe;
-+      }
-+
-+      /* OK.  Make room on the supervisor stack for the extra junk,
-+       * if necessary.
-+       */
-+
-+      {
-+#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
-+              __asm__ __volatile__
-+                      ("   movel %0,%/sp\n\t"
-+                       "   bra ret_from_signal\n"
-+                       "4:\n"
-+                       ".section __ex_table,\"a\"\n"
-+                       "   .align 4\n"
-+                       "   .long 2b,4b\n"
-+                       ".previous"
-+                       : /* no outputs, it doesn't ever return */
-+                       : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
-+                         "n" (frame_offset), "a" (&uc->uc_extra)
-+                       : "a0");
-+#undef frame_offset
-+              /*
-+               * If we ever get here an exception occurred while
-+               * building the above stack-frame.
-+               */
-+              goto badframe;
-+      }
-+
-+      *pd0 = regs->d0;
-+      return err;
-+
-+badframe:
-+      return 1;
-+}
-+
-+asmlinkage int do_sigreturn(unsigned long __unused)
-+{
-+      struct switch_stack *sw = (struct switch_stack *) &__unused;
-+      struct pt_regs *regs = (struct pt_regs *) (sw + 1);
-+      unsigned long usp = rdusp();
-+      struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
-+      sigset_t set;
-+      int d0;
-+
-+      if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
-+              goto badframe;
-+      if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
-+          (_NSIG_WORDS > 1 &&
-+           __copy_from_user(&set.sig[1], &frame->extramask,
-+                            sizeof(frame->extramask))))
-+              goto badframe;
-+
-+      sigdelsetmask(&set, ~_BLOCKABLE);
-+      spin_lock_irq(&current->sighand->siglock);
-+      current->blocked = set;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0))
-+              goto badframe;
-+      return d0;
-+
-+badframe:
-+      force_sig(SIGSEGV, current);
-+      return 0;
-+}
-+
-+asmlinkage int do_rt_sigreturn(unsigned long __unused)
-+{
-+      struct switch_stack *sw = (struct switch_stack *) &__unused;
-+      struct pt_regs *regs = (struct pt_regs *) (sw + 1);
-+      unsigned long usp = rdusp();
-+      struct rt_sigframe __user *frame =
-+              (struct rt_sigframe __user *)(usp - 4);
-+      sigset_t set;
-+      int d0;
-+
-+      if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
-+              goto badframe;
-+      if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
-+              goto badframe;
-+
-+      sigdelsetmask(&set, ~_BLOCKABLE);
-+      spin_lock_irq(&current->sighand->siglock);
-+      current->blocked = set;
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+
-+      if (rt_restore_ucontext(regs, sw, &frame->uc, &d0))
-+              goto badframe;
-+      return d0;
-+
-+badframe:
-+      force_sig(SIGSEGV, current);
-+      return 0;
-+}
-+
-+#ifdef CONFIG_FPU
-+/*
-+ * Set up a signal frame.
-+ */
-+
-+static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
-+{
-+      if (FPU_IS_EMU) {
-+              /* save registers */
-+              memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12);
-+              memcpy(sc->sc_fpregs, current->thread.fp, 24);
-+              return;
-+      }
-+}
-+
-+static inline int rt_save_fpu_state(struct ucontext __user *uc,
-+      struct pt_regs *regs)
-+{
-+      int err = 0;
-+
-+      if (FPU_IS_EMU) {
-+              /* save fpu control register */
-+              err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl,
-+                              current->thread.fpcntl, 12);
-+              /* save all other fpu register */
-+              err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs,
-+                              current->thread.fp, 96);
-+              return err;
-+      }
-+
-+      return err;
-+}
-+#endif
-+
-+static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
-+                           unsigned long mask)
-+{
-+      sc->sc_mask = mask;
-+      sc->sc_usp = rdusp();
-+      sc->sc_d0 = regs->d0;
-+      sc->sc_d1 = regs->d1;
-+      sc->sc_a0 = regs->a0;
-+      sc->sc_a1 = regs->a1;
-+      sc->sc_sr = regs->sr;
-+      sc->sc_pc = regs->pc;
-+      sc->sc_formatvec = regs->format << 12 | regs->vector;
-+#ifdef CONFIG_FPU
-+      save_fpu_state(sc, regs);
-+#endif
-+}
-+
-+static inline int rt_setup_ucontext(struct ucontext __user *uc,
-+      struct pt_regs *regs)
-+{
-+      struct switch_stack *sw = (struct switch_stack *)regs - 1;
-+      greg_t __user *gregs = uc->uc_mcontext.gregs;
-+      int err = 0;
-+
-+      err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
-+      err |= __put_user(regs->d0, &gregs[0]);
-+      err |= __put_user(regs->d1, &gregs[1]);
-+      err |= __put_user(regs->d2, &gregs[2]);
-+      err |= __put_user(regs->d3, &gregs[3]);
-+      err |= __put_user(regs->d4, &gregs[4]);
-+      err |= __put_user(regs->d5, &gregs[5]);
-+      err |= __put_user(sw->d6, &gregs[6]);
-+      err |= __put_user(sw->d7, &gregs[7]);
-+      err |= __put_user(regs->a0, &gregs[8]);
-+      err |= __put_user(regs->a1, &gregs[9]);
-+      err |= __put_user(regs->a2, &gregs[10]);
-+      err |= __put_user(sw->a3, &gregs[11]);
-+      err |= __put_user(sw->a4, &gregs[12]);
-+      err |= __put_user(sw->a5, &gregs[13]);
-+      err |= __put_user(sw->a6, &gregs[14]);
-+      err |= __put_user(rdusp(), &gregs[15]);
-+      err |= __put_user(regs->pc, &gregs[16]);
-+      err |= __put_user(regs->sr, &gregs[17]);
-+      err |= __put_user((regs->format << 12) | regs->vector,
-+                        &uc->uc_formatvec);
-+#ifdef CONFIG_FPU
-+      err |= rt_save_fpu_state(uc, regs);
-+#endif
-+      return err;
-+}
-+
-+static inline void push_cache(unsigned long vaddr)
-+{
-+#if 0 
-+// JKM -- need to add into the old cpushl cache stuff
-+      cf_cache_push(__pa(vaddr), 8);
-+#endif
-+}
-+
-+static inline void __user *
-+get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
-+{
-+      unsigned long usp;
-+
-+      /* Default to using normal stack.  */
-+      usp = rdusp();
-+
-+      /* This is the X/Open sanctioned signal stack switching.  */
-+      if (ka->sa.sa_flags & SA_ONSTACK) {
-+              if (!sas_ss_flags(usp))
-+                      usp = current->sas_ss_sp + current->sas_ss_size;
-+      }
-+      return (void __user *)((usp - frame_size) & -8UL);
-+}
-+
-+static void setup_frame(int sig, struct k_sigaction *ka,
-+                       sigset_t *set, struct pt_regs *regs)
-+{
-+      struct sigframe __user *frame;
-+      int fsize = frame_extra_sizes[regs->format];
-+      struct sigcontext context;
-+      int err = 0;
-+
-+      if (fsize < 0) {
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n",
-+                      regs->format);
-+#endif
-+              goto give_sigsegv;
-+      }
-+
-+      frame = get_sigframe(ka, regs, sizeof(*frame));
-+
-+      err |= __put_user((current_thread_info()->exec_domain
-+                      && current_thread_info()->exec_domain->signal_invmap
-+                      && sig < 32
-+                      ? current_thread_info()->exec_domain->signal_invmap[sig]
-+                      : sig),
-+                      &frame->sig);
-+
-+      err |= __put_user(regs->vector, &frame->code);
-+      err |= __put_user(&frame->sc, &frame->psc);
-+
-+      if (_NSIG_WORDS > 1)
-+              err |= copy_to_user(frame->extramask, &set->sig[1],
-+                                  sizeof(frame->extramask));
-+
-+      setup_sigcontext(&context, regs, set->sig[0]);
-+      err |= copy_to_user(&frame->sc, &context, sizeof(context));
-+
-+      /* Set up to return from userspace.  */
-+      err |= __put_user(frame->retcode, &frame->pretcode);
-+      /* moveq #,d0; trap #0 */
-+      err |= __put_user(0x70004e40 + (__NR_sigreturn << 16),
-+                        (long __user *)(frame->retcode));
-+
-+      if (err)
-+              goto give_sigsegv;
-+
-+      push_cache((unsigned long) &frame->retcode);
-+
-+      /* Set up registers for signal handler */
-+      wrusp((unsigned long) frame);
-+      regs->pc = (unsigned long) ka->sa.sa_handler;
-+
-+adjust_stack:
-+      /* Prepare to skip over the extra stuff in the exception frame.  */
-+      if (regs->stkadj) {
-+              struct pt_regs *tregs =
-+                      (struct pt_regs *)((ulong)regs + regs->stkadj);
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "Performing stackadjust=%04x\n",
-+                      regs->stkadj);
-+#endif
-+              /* This must be copied with decreasing addresses to
-+                 handle overlaps.  */
-+              tregs->vector = 0;
-+              tregs->format = 0;
-+              tregs->pc = regs->pc;
-+              tregs->sr = regs->sr;
-+      }
-+      return;
-+
-+give_sigsegv:
-+      force_sigsegv(sig, current);
-+      goto adjust_stack;
-+}
-+
-+static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
-+      sigset_t *set, struct pt_regs *regs)
-+{
-+      struct rt_sigframe __user *frame;
-+      int fsize = frame_extra_sizes[regs->format];
-+      int err = 0;
-+
-+      if (fsize < 0) {
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n",
-+                      regs->format);
-+#endif
-+              goto give_sigsegv;
-+      }
-+
-+      frame = get_sigframe(ka, regs, sizeof(*frame));
-+
-+      if (fsize) {
-+              err |= copy_to_user(&frame->uc.uc_extra, regs + 1, fsize);
-+              regs->stkadj = fsize;
-+      }
-+
-+      err |= __put_user((current_thread_info()->exec_domain
-+                      && current_thread_info()->exec_domain->signal_invmap
-+                      && sig < 32
-+                      ? current_thread_info()->exec_domain->signal_invmap[sig]
-+                      : sig),
-+                      &frame->sig);
-+      err |= __put_user(&frame->info, &frame->pinfo);
-+      err |= __put_user(&frame->uc, &frame->puc);
-+      err |= copy_siginfo_to_user(&frame->info, info);
-+
-+      /* Create the ucontext.  */
-+      err |= __put_user(0, &frame->uc.uc_flags);
-+      err |= __put_user(NULL, &frame->uc.uc_link);
-+      err |= __put_user((void __user *)current->sas_ss_sp,
-+                        &frame->uc.uc_stack.ss_sp);
-+      err |= __put_user(sas_ss_flags(rdusp()),
-+                        &frame->uc.uc_stack.ss_flags);
-+      err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
-+      err |= rt_setup_ucontext(&frame->uc, regs);
-+      err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
-+
-+      /* Set up to return from userspace.  */
-+      err |= __put_user(frame->retcode, &frame->pretcode);
-+
-+      /* moveq #,d0; andi.l #,D0; trap #0 */
-+      err |= __put_user(0x70AD0280, (long *)(frame->retcode + 0));
-+      err |= __put_user(0x000000ff, (long *)(frame->retcode + 4));
-+      err |= __put_user(0x4e400000, (long *)(frame->retcode + 8));
-+
-+      if (err)
-+              goto give_sigsegv;
-+
-+      push_cache((unsigned long) &frame->retcode);
-+
-+      /* Set up registers for signal handler */
-+      wrusp((unsigned long) frame);
-+      regs->pc = (unsigned long) ka->sa.sa_handler;
-+
-+adjust_stack:
-+      /* Prepare to skip over the extra stuff in the exception frame.  */
-+      if (regs->stkadj) {
-+              struct pt_regs *tregs =
-+                      (struct pt_regs *)((ulong)regs + regs->stkadj);
-+#ifdef DEBUG
-+              printk(KERN_DEBUG "Performing stackadjust=%04x\n",
-+                      regs->stkadj);
-+#endif
-+              /* This must be copied with decreasing addresses to
-+                 handle overlaps.  */
-+              tregs->vector = 0;
-+              tregs->format = 0;
-+              tregs->pc = regs->pc;
-+              tregs->sr = regs->sr;
-+      }
-+      return;
-+
-+give_sigsegv:
-+      force_sigsegv(sig, current);
-+      goto adjust_stack;
-+}
-+
-+static inline void
-+handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
-+{
-+      switch (regs->d0) {
-+      case -ERESTARTNOHAND:
-+              if (!has_handler)
-+                      goto do_restart;
-+              regs->d0 = -EINTR;
-+              break;
-+
-+      case -ERESTARTSYS:
-+              if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
-+                      regs->d0 = -EINTR;
-+                      break;
-+              }
-+      /* fallthrough */
-+      case -ERESTARTNOINTR:
-+do_restart:
-+              regs->d0 = regs->orig_d0;
-+              regs->pc -= 2;
-+              break;
-+      }
-+}
-+
-+/*
-+ * OK, we're invoking a handler
-+ */
-+static void
-+handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
-+            sigset_t *oldset, struct pt_regs *regs)
-+{
-+      /* are we from a system call? */
-+      if (regs->orig_d0 >= 0)
-+              /* If so, check system call restarting.. */
-+              handle_restart(regs, ka, 1);
-+
-+      /* set up the stack frame */
-+      if (ka->sa.sa_flags & SA_SIGINFO)
-+              setup_rt_frame(sig, ka, info, oldset, regs);
-+      else
-+              setup_frame(sig, ka, oldset, regs);
-+
-+      if (ka->sa.sa_flags & SA_ONESHOT)
-+              ka->sa.sa_handler = SIG_DFL;
-+
-+      spin_lock_irq(&current->sighand->siglock);
-+      sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
-+      if (!(ka->sa.sa_flags & SA_NODEFER))
-+              sigaddset(&current->blocked, sig);
-+      recalc_sigpending();
-+      spin_unlock_irq(&current->sighand->siglock);
-+}
-+
-+/*
-+ * Note that 'init' is a special process: it doesn't get signals it doesn't
-+ * want to handle. Thus you cannot kill init even with a SIGKILL even by
-+ * mistake.
-+ */
-+asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
-+{
-+      siginfo_t info;
-+      struct k_sigaction ka;
-+      int signr;
-+
-+      current->thread.esp0 = (unsigned long) regs;
-+
-+      if (!oldset)
-+              oldset = &current->blocked;
-+
-+      signr = get_signal_to_deliver(&info, &ka, regs, NULL);
-+      if (signr > 0) {
-+              /* Whee!  Actually deliver the signal.  */
-+              handle_signal(signr, &ka, &info, oldset, regs);
-+              return 1;
-+      }
-+
-+      /* Did we come from a system call? */
-+      if (regs->orig_d0 >= 0)
-+              /* Restart the system call - no handlers present */
-+              handle_restart(regs, NULL, 0);
-+
-+      return 0;
-+}
---- /dev/null
-+++ b/arch/m68k/coldfire/traps.c
-@@ -0,0 +1,455 @@
-+/*
-+ *  linux/arch/m68knommu/kernel/traps.c
-+ *
-+ *  Copyright (C) 1993, 1994 by Hamish Macdonald
-+ *
-+ *  68040 fixes by Michael Rausch
-+ *  68040 fixes by Martin Apel
-+ *  68060 fixes by Roman Hodek
-+ *  68060 fixes by Jesper Skov
-+ *  Coldfire fixes by Kurt Mahan
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file COPYING in the main directory of this archive
-+ * for more details.
-+ */
-+
-+/*
-+ * Sets up all exception vectors
-+ */
-+#include <linux/sched.h>
-+#include <linux/signal.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/a.out.h>
-+#include <linux/user.h>
-+#include <linux/string.h>
-+#include <linux/linkage.h>
-+#include <linux/init.h>
-+#include <linux/ptrace.h>
-+#include <linux/kallsyms.h>
-+
-+#include <asm/setup.h>
-+#include <asm/fpu.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/traps.h>
-+#include <asm/pgtable.h>
-+#include <asm/machdep.h>
-+#include <asm/siginfo.h>
-+
-+static char const * const vec_names[] = {
-+      "RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR",
-+      "ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc",
-+      "PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111",
-+      "UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION",
-+      "FORMAT ERROR", "UNINITIALIZED INTERRUPT",
-+      "UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17",
-+      "UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19",
-+      "UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21",
-+      "UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23",
-+      "SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT",
-+      "LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT",
-+      "SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3",
-+      "TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7",
-+      "TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11",
-+      "TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15",
-+      "FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW",
-+      "FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN",
-+      "FPCP UNSUPPORTED OPERATION",
-+      "MMU CONFIGURATION ERROR"
-+};
-+
-+asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
-+                           unsigned long error_code);
-+asmlinkage void trap_c(struct frame *fp);
-+extern void __init coldfire_trap_init(void);
-+
-+void __init trap_init(void)
-+{
-+      coldfire_trap_init();
-+}
-+
-+/* The following table converts the FS encoding of a ColdFire
-+   exception stack frame into the error_code value needed by
-+   do_fault. */
-+
-+static const unsigned char fs_err_code[] = {
-+      0,  /* 0000 */
-+      0,  /* 0001 */
-+      0,  /* 0010 */
-+      0,  /* 0011 */
-+      1,  /* 0100 */
-+      0,  /* 0101 */
-+      0,  /* 0110 */
-+      0,  /* 0111 */
-+      2,  /* 1000 */
-+      3,  /* 1001 */
-+      2,  /* 1010 */
-+      0,  /* 1011 */
-+      1,  /* 1100 */
-+      1,  /* 1101 */
-+      0,  /* 1110 */
-+      0   /* 1111 */
-+};
-+
-+#ifdef DEBUG
-+static const char *fs_err_msg[16] = {
-+      "Normal",
-+      "Reserved",
-+      "Interrupt during debug service routine",
-+      "Reserved",
-+      "X Protection",
-+      "TLB X miss (opword)",
-+      "TLB X miss (ext. word)",
-+      "IFP in emulator mode",
-+      "W Protection",
-+      "Write error",
-+      "TLB W miss",
-+      "Reserved",
-+      "R Protection",
-+      "R/RMW Protection",
-+      "TLB R miss",
-+      "OEP in emulator mode",
-+};
-+#endif
-+
-+static inline void access_errorCF(struct frame *fp)
-+{
-+      unsigned long int mmusr, complainingAddress;
-+      unsigned int err_code, fs;
-+      int need_page_fault;
-+
-+      mmusr = fp->ptregs.mmusr;
-+      complainingAddress = fp->ptregs.mmuar;
-+#ifdef DEBUG
-+      printk(KERN_DEBUG "pc %#lx, mmusr %#lx, complainingAddress %#lx\n", \
-+              fp->ptregs.pc, mmusr, complainingAddress);
-+#endif
-+
-+      /*
-+       * error_code:
-+       *      bit 0 == 0 means no page found, 1 means protection fault
-+       *      bit 1 == 0 means read, 1 means write
-+       */
-+
-+      fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1;
-+      switch (fs) {
-+      case  5:  /* 0101 TLB opword X miss */
-+              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 0);
-+              complainingAddress = fp->ptregs.pc;
-+              break;
-+      case  6:  /* 0110 TLB extension word X miss */
-+              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 1);
-+              complainingAddress = fp->ptregs.pc + sizeof(long);
-+              break;
-+      case 10:  /* 1010 TLB W miss */
-+              need_page_fault = cf_tlb_miss(&fp->ptregs, 1, 1, 0);
-+              break;
-+      case 14: /* 1110 TLB R miss */
-+              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 1, 0);
-+              break;
-+      default:
-+              /* 0000 Normal  */
-+              /* 0001 Reserved */
-+              /* 0010 Interrupt during debug service routine */
-+              /* 0011 Reserved */
-+              /* 0100 X Protection */
-+              /* 0111 IFP in emulator mode */
-+              /* 1000 W Protection*/
-+              /* 1001 Write error*/
-+              /* 1011 Reserved*/
-+              /* 1100 R Protection*/
-+              /* 1101 R Protection*/
-+              /* 1111 OEP in emulator mode*/
-+              need_page_fault = 1;
-+              break;
-+      }
-+
-+      if (need_page_fault) {
-+              err_code = fs_err_code[fs];
-+              if ((fs == 13) && (mmusr & MMUSR_WF)) /* rd-mod-wr access */
-+                      err_code |= 2; /* bit1 - write, bit0 - protection */
-+              do_page_fault(&fp->ptregs, complainingAddress, err_code);
-+      }
-+}
-+
-+void die_if_kernel(char *str, struct pt_regs *fp, int nr)
-+{
-+      if (!(fp->sr & PS_S))
-+              return;
-+
-+      console_verbose();
-+      printk(KERN_EMERG "%s: %08x\n", str, nr);
-+      printk(KERN_EMERG "PC: [<%08lx>]", fp->pc);
-+      print_symbol(" %s", fp->pc);
-+      printk(KERN_EMERG "\nSR: %04x  SP: %p  a2: %08lx\n",
-+             fp->sr, fp, fp->a2);
-+      printk(KERN_EMERG "d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
-+             fp->d0, fp->d1, fp->d2, fp->d3);
-+      printk(KERN_EMERG "d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
-+             fp->d4, fp->d5, fp->a0, fp->a1);
-+
-+      printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n",
-+              current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
-+      show_stack(NULL, (unsigned long *)fp);
-+      do_exit(SIGSEGV);
-+}
-+
-+asmlinkage void buserr_c(struct frame *fp)
-+{
-+      unsigned int fs;
-+
-+      /* Only set esp0 if coming from user mode */
-+      if (user_mode(&fp->ptregs))
-+              current->thread.esp0 = (unsigned long) fp;
-+
-+      fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1;
-+#if defined(DEBUG)
-+      printk(KERN_DEBUG "*** Bus Error *** (%x)%s\n", fs,
-+              fs_err_msg[fs & 0xf]);
-+#endif
-+      switch (fs) {
-+      case 0x5:
-+      case 0x6:
-+      case 0x7:
-+      case 0x9:
-+      case 0xa:
-+      case 0xd:
-+      case 0xe:
-+      case 0xf:
-+              access_errorCF(fp);
-+              break;
-+      default:
-+              die_if_kernel("bad frame format", &fp->ptregs, 0);
-+#if defined(DEBUG)
-+              printk(KERN_DEBUG "Unknown SIGSEGV - 4\n");
-+#endif
-+              force_sig(SIGSEGV, current);
-+      }
-+}
-+
-+
-+int kstack_depth_to_print = 48;
-+
-+void show_stack(struct task_struct *task, unsigned long *stack)
-+{
-+      unsigned long *endstack, addr, symaddr;
-+      extern char _start, _etext;
-+      int i;
-+
-+      if (!stack) {
-+              if (task)
-+                      stack = (unsigned long *)task->thread.ksp;
-+              else
-+                      stack = (unsigned long *)&stack;
-+      }
-+
-+      addr = (unsigned long) stack;
-+      endstack = (unsigned long *) PAGE_ALIGN(addr);
-+
-+      printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack);
-+      for (i = 0; i < kstack_depth_to_print; i++) {
-+              if (stack + 1 > endstack)
-+                      break;
-+              if (i % 8 == 0)
-+                      printk("\n" KERN_EMERG "       ");
-+              symaddr = *stack;
-+              printk(KERN_EMERG " %08lx", *stack++);
-+              if ((symaddr >= 0xc0000000) && (symaddr < 0xc1000000))
-+                      print_symbol("(%s)", symaddr);
-+      }
-+      printk("\n");
-+
-+      printk(KERN_EMERG "Call Trace:");
-+      i = 0;
-+      while (stack + 1 <= endstack) {
-+              addr = *stack++;
-+              /*
-+               * If the address is either in the text segment of the
-+               * kernel, or in the region which contains vmalloc'ed
-+               * memory, it *may* be the address of a calling
-+               * routine; if so, print it so that someone tracing
-+               * down the cause of the crash will be able to figure
-+               * out the call path that was taken.
-+               */
-+              if (((addr >= (unsigned long) &_start) &&
-+                   (addr <= (unsigned long) &_etext))) {
-+                      if (i % 4 == 0)
-+                              printk("\n" KERN_EMERG "       ");
-+                      printk(KERN_EMERG " [<%08lx>]", addr);
-+                      i++;
-+              }
-+      }
-+      printk("\n");
-+}
-+
-+void bad_super_trap(struct frame *fp)
-+{
-+      console_verbose();
-+      if (fp->ptregs.vector < sizeof(vec_names)/sizeof(vec_names[0]))
-+              printk(KERN_WARNING "*** %s ***   FORMAT=%X\n",
-+                      vec_names[fp->ptregs.vector],
-+                      fp->ptregs.format);
-+      else
-+              printk(KERN_WARNING "*** Exception %d ***   FORMAT=%X\n",
-+                      fp->ptregs.vector,
-+                      fp->ptregs.format);
-+      printk(KERN_WARNING "Current process id is %d\n", current->pid);
-+      die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
-+}
-+
-+asmlinkage void trap_c(struct frame *fp)
-+{
-+      int sig;
-+      siginfo_t info;
-+
-+      if (fp->ptregs.sr & PS_S) {
-+              if (fp->ptregs.vector == VEC_TRACE) {
-+                      /* traced a trapping instruction */
-+                      current->ptrace |= PT_DTRACE;
-+              } else
-+                      bad_super_trap(fp);
-+              return;
-+      }
-+
-+      /* send the appropriate signal to the user program */
-+      switch (fp->ptregs.vector) {
-+      case VEC_ADDRERR:
-+              info.si_code = BUS_ADRALN;
-+              sig = SIGBUS;
-+              break;
-+      case VEC_ILLEGAL:
-+      case VEC_LINE10:
-+      case VEC_LINE11:
-+              info.si_code = ILL_ILLOPC;
-+              sig = SIGILL;
-+              break;
-+      case VEC_PRIV:
-+              info.si_code = ILL_PRVOPC;
-+              sig = SIGILL;
-+              break;
-+      case VEC_COPROC:
-+              info.si_code = ILL_COPROC;
-+              sig = SIGILL;
-+              break;
-+      case VEC_TRAP1: /* gdbserver breakpoint */
-+              fp->ptregs.pc -= 2;
-+              info.si_code = TRAP_TRACE;
-+              sig = SIGTRAP;
-+              break;
-+      case VEC_TRAP2:
-+      case VEC_TRAP3:
-+      case VEC_TRAP4:
-+      case VEC_TRAP5:
-+      case VEC_TRAP6:
-+      case VEC_TRAP7:
-+      case VEC_TRAP8:
-+      case VEC_TRAP9:
-+      case VEC_TRAP10:
-+      case VEC_TRAP11:
-+      case VEC_TRAP12:
-+      case VEC_TRAP13:
-+      case VEC_TRAP14:
-+              info.si_code = ILL_ILLTRP;
-+              sig = SIGILL;
-+              break;
-+      case VEC_FPBRUC:
-+      case VEC_FPOE:
-+      case VEC_FPNAN:
-+              info.si_code = FPE_FLTINV;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_FPIR:
-+              info.si_code = FPE_FLTRES;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_FPDIVZ:
-+              info.si_code = FPE_FLTDIV;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_FPUNDER:
-+              info.si_code = FPE_FLTUND;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_FPOVER:
-+              info.si_code = FPE_FLTOVF;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_ZERODIV:
-+              info.si_code = FPE_INTDIV;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_CHK:
-+      case VEC_TRAP:
-+              info.si_code = FPE_INTOVF;
-+              sig = SIGFPE;
-+              break;
-+      case VEC_TRACE:         /* ptrace single step */
-+              info.si_code = TRAP_TRACE;
-+              sig = SIGTRAP;
-+              break;
-+      case VEC_TRAP15:                /* breakpoint */
-+              info.si_code = TRAP_BRKPT;
-+              sig = SIGTRAP;
-+              break;
-+      default:
-+              info.si_code = ILL_ILLOPC;
-+              sig = SIGILL;
-+              break;
-+      }
-+      info.si_signo = sig;
-+      info.si_errno = 0;
-+      switch (fp->ptregs.format) {
-+      default:
-+              info.si_addr = (void *) fp->ptregs.pc;
-+              break;
-+      case 2:
-+              info.si_addr = (void *) fp->un.fmt2.iaddr;
-+              break;
-+      case 7:
-+              info.si_addr = (void *) fp->un.fmt7.effaddr;
-+              break;
-+      case 9:
-+              info.si_addr = (void *) fp->un.fmt9.iaddr;
-+              break;
-+      case 10:
-+              info.si_addr = (void *) fp->un.fmta.daddr;
-+              break;
-+      case 11:
-+              info.si_addr = (void *) fp->un.fmtb.daddr;
-+              break;
-+      }
-+      force_sig_info(sig, &info, current);
-+}
-+
-+asmlinkage void set_esp0(unsigned long ssp)
-+{
-+      current->thread.esp0 = ssp;
-+}
-+
-+/*
-+ * The architecture-independent backtrace generator
-+ */
-+void dump_stack(void)
-+{
-+      unsigned long stack;
-+
-+      show_stack(current, &stack);
-+}
-+EXPORT_SYMBOL(dump_stack);
-+
-+#ifdef CONFIG_M68KFPU_EMU
-+asmlinkage void fpemu_signal(int signal, int code, void *addr)
-+{
-+      siginfo_t info;
-+
-+      info.si_signo = signal;
-+      info.si_errno = 0;
-+      info.si_code = code;
-+      info.si_addr = addr;
-+      force_sig_info(signal, &info, current);
-+}
-+#endif
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/Makefile
-@@ -0,0 +1,28 @@
-+#
-+# Makefile for the linux kernel.
-+#
-+
-+# Object file lists.
-+
-+ifneq ($(CONFIG_USB_EHCI_HCD),)
-+      obj-y   += otg_host.o
-+endif
-+
-+ifneq ($(CONFIG_USB_GADGET_MCF5445X),)
-+      obj-y   += otg_device.o
-+endif
-+
-+ifneq ($(strip $(CONFIG_USB_GADGET_MCF5445X) $(CONFIG_USB_EHCI_HCD)),)
-+      obj-y   += otg_cmn.o
-+endif
-+
-+ifneq ($(CONFIG_USB_OTG),)
-+      obj-y   += otg_otg.o
-+endif
-+
-+
-+# USB Transceiver driver:
-+ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
-+      obj-y   += xcvr.o
-+endif
-+
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/otg_cmn.c
-@@ -0,0 +1,106 @@
-+/*
-+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/err.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/irq.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+
-+#include <asm/system.h>
-+#include <asm/coldfire.h>
-+
-+extern void fsl_usb_enable_clk(void);
-+extern void fsl_usb_disable_clk(void);
-+extern int fsl_usb_mem_init(struct platform_device *pdev);
-+
-+extern struct fsl_xcvr_ops *xc_ops[];
-+
-+static int otg_used;
-+
-+int usbotg_init(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata;
-+      struct fsl_xcvr_ops *xops = xc_ops[USB_CTRLR_OTG];
-+      int rc;
-+
-+      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
-+
-+      pr_debug("%s: pdev=0x%p  pdata=0x%p\n", __FUNCTION__, pdev, pdata);
-+
-+      if (!xops) {
-+              printk(KERN_ERR "OTG transceiver ops missing\n");
-+              return -EINVAL;
-+      }
-+      pdata->xcvr_ops = xops;
-+      pdata->xcvr_type = xops->xcvr_type;
-+
-+      if (!otg_used) {
-+              /* request_mem_region and ioremap registers */
-+              rc = fsl_usb_mem_init(pdev);
-+              if (rc)
-+                      return rc;
-+
-+              fsl_usb_enable_clk();
-+
-+              if (xops->init)
-+                      xops->init(pdev);
-+      }
-+
-+      otg_used++;
-+      pr_debug("%s: success\n", __FUNCTION__);
-+      return 0;
-+}
-+
-+void usbotg_uninit(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata;
-+      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
-+
-+      pr_debug("%s\n", __FUNCTION__);
-+
-+      otg_used--;
-+      if (!otg_used) {
-+              if (pdata->xcvr_ops && pdata->xcvr_ops->uninit)
-+                      pdata->xcvr_ops->uninit(pdev);
-+
-+              iounmap(pdata->regs);
-+              release_mem_region(pdata->r_start, pdata->r_len);
-+
-+              pdata->regs = NULL;
-+              pdata->r_start = pdata->r_len = 0;
-+
-+              fsl_usb_disable_clk();
-+      }
-+}
-+
-+struct fsl_usb2_platform_data mxc_otg_config = {
-+      .name            = "OTG",
-+      .platform_init   = usbotg_init,
-+      .platform_uninit = usbotg_uninit,
-+      .es              = 1,
-+      .big_endian_mmio = 1,
-+      .big_endian_desc = 1,
-+      .le_setup_buf    = 1,
-+      .does_otg        = 1,
-+      .power_budget    = 500,         /* 500 mA max power */
-+      .max_ep_nr       = 4,           /* DDD read from a register ? */
-+      .phy_mode        = FSL_USB2_PHY_ULPI, /* DDD redundant with xcvr_type */
-+};
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/otg_device.c
-@@ -0,0 +1,89 @@
-+/*
-+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/irq.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/usb/otg.h>
-+#include <linux/delay.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+
-+#include <asm/system.h>
-+#include <asm/coldfire.h>
-+
-+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
-+#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
-+#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
-+
-+extern int usbotg_init(struct platform_device *pdev);
-+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
-+extern struct fsl_usb2_platform_data mxc_otg_config;
-+
-+struct platform_device otg_udc_device;
-+
-+/*!
-+ * OTG Gadget device
-+ */
-+
-+static void usb_release(struct device *dev)
-+{
-+      /* normally not freed */
-+}
-+
-+static u64 udc_dmamask = ~(u32) 0;
-+static struct resource otg_udc_resources[] = {
-+      [0] = {
-+              .start = (u32) (&USB_OTGREGS_BASE),
-+              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
-+              .flags = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start = INT_USB,
-+              .flags = IORESOURCE_IRQ,
-+      },
-+};
-+
-+
-+struct platform_device otg_udc_device = {
-+      .name = "fsl-usb2-udc",
-+      .id   = -1,
-+      .dev  = {
-+              .release           = usb_release,
-+              .dma_mask          = &udc_dmamask,
-+              .coherent_dma_mask = 0xffffffff,
-+              .platform_data     = &mxc_otg_config,
-+              },
-+      .resource = otg_udc_resources,
-+      .num_resources = ARRAY_SIZE(otg_udc_resources),
-+};
-+
-+static int __init udc_init(void)
-+{
-+      int rc __attribute((unused));
-+
-+      rc = platform_device_register(&otg_udc_device);
-+      if (rc)
-+              printk(KERN_ERR "usb: can't register OTG Gadget, rc=%d\n", rc);
-+      else
-+              printk(KERN_INFO "usb: OTG Gadget registered\n");
-+      return rc;
-+}
-+
-+subsys_initcall(udc_init);
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/otg_host.c
-@@ -0,0 +1,68 @@
-+/*
-+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/irq.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+
-+#include <asm/system.h>
-+#include <asm/mcfsim.h>
-+
-+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
-+#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
-+#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
-+
-+struct platform_device *otg_host_device;
-+
-+extern struct platform_device *host_pdev_register(struct resource *res,
-+                                                int n_res,
-+                                                struct fsl_usb2_platform_data
-+                                                *config);
-+
-+extern int usbotg_init(struct platform_device *pdev);
-+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
-+extern struct fsl_usb2_platform_data mxc_otg_config;
-+
-+/*!
-+ * OTG host config
-+ */
-+static struct resource otg_host_resources[] = {
-+      [0] = {
-+              .start = (u32) (&USB_OTGREGS_BASE),
-+              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
-+              .flags = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start = INT_USB,
-+              .flags = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static int __init otg_host_init(void)
-+{
-+      otg_host_device = host_pdev_register(otg_host_resources,
-+                                           ARRAY_SIZE(otg_host_resources),
-+                                           &mxc_otg_config);
-+      return 0;
-+}
-+
-+subsys_initcall(otg_host_init);
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/otg_otg.c
-@@ -0,0 +1,96 @@
-+/*
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/*
-+ * platform_device registration for ULPI OTG device
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/fsl_devices.h>
-+
-+#include <asm/mcfsim.h>
-+
-+#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
-+#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
-+#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
-+
-+extern int usbotg_init(struct platform_device *pdev);
-+extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
-+extern struct fsl_usb2_platform_data mxc_otg_config;
-+
-+static void otg_otg_release(struct device *dev)
-+{
-+      /* normally not freed */
-+}
-+
-+/* *INDENT-OFF* */
-+static struct resource otg_otg_resources[] = {
-+      [0] = {
-+              .start = (u32) (&USB_OTGREGS_BASE),
-+              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
-+              .flags = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start = INT_USB,
-+              .flags = IORESOURCE_IRQ,
-+      },
-+};
-+
-+/*!
-+ * OTG device
-+ */
-+static u64 otg_otg_dmamask = ~(u32) 0;
-+static struct platform_device otg_otg_device = {
-+      .name = "fsl-usb2-otg",
-+      .id   = -1,
-+      .dev  = {
-+              .release           = otg_otg_release,
-+              .dma_mask          = &otg_otg_dmamask,
-+              .coherent_dma_mask = 0xffffffff,
-+              .platform_data     = &mxc_otg_config,
-+      },
-+      .resource = otg_otg_resources,
-+      .num_resources = ARRAY_SIZE(otg_otg_resources),
-+};
-+/* *INDENT-ON* */
-+
-+static int __init mx31_otg_otg_init(void)
-+{
-+      int rc = 0;
-+
-+      pr_debug("register OTG otg res=0x%p, size=%d\n",
-+               otg_otg_device.resource, otg_otg_device.num_resources);
-+
-+      rc = platform_device_register(&otg_otg_device);
-+      if (rc) {
-+              pr_debug("can't register ULPI OTG dvc, %d\n", rc);
-+      } else {
-+              printk(KERN_INFO "usb: OTG ULPI transceiver registered\n");
-+              pr_debug("otg_otg_device=0x%p  resources=0x%p.\n",
-+                       &otg_otg_device, otg_otg_device.resource);
-+      }
-+
-+      return rc;
-+}
-+
-+subsys_initcall(mx31_otg_otg_init);
-+
-+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
-+MODULE_DESCRIPTION("ULPI OTG device registration");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/arch/m68k/coldfire/usb/xcvr.c
-@@ -0,0 +1,156 @@
-+/*
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/delay.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+#include <linux/usb/fsl_usb2.h>
-+
-+#include <asm/mcfsim.h>
-+
-+extern void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops);
-+extern void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr);
-+
-+#define MCF_SCM_BCR           MCF_REG32(0xFC040024)
-+#define MCF_SCM_BCR_GBR               (1 << 9)        /* global bursts for read */
-+#define MCF_SCM_BCR_GBW               (1 << 8)        /* global bursts for write */
-+#define MCF_SCM_BCR_SBE_ALL   (0xff << 0)     /* slave burst enable */
-+
-+
-+#ifdef ULPI_DEBUG
-+void print_ulpi_regs(void)
-+{
-+      pr_debug("MCF_SCM_BCR=0x%08lx  MCF_CCM_MISCCR=0x%08x  "
-+               "MCF_GPIO_PAR_DMA=0x%08x  MCF_GPIO_PAR_USB=08%08x  "
-+               "MCF_GPIO_PAR_FEC=08%08x\n",
-+               MCF_SCM_BCR, MCF_CCM_MISCCR, MCF_GPIO_PAR_DMA,
-+               MCF_GPIO_PAR_USB, MCF_GPIO_PAR_FEC);
-+}
-+EXPORT_SYMBOL(print_ulpi_regs);
-+#endif
-+
-+
-+static void xcvr_init(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      struct fsl_xcvr_ops *this = pdata->xcvr_ops;
-+      struct fsl_usb_host_regs *regs = pdata->regs;
-+
-+      pr_debug("%s: ctrlr=%d  pdata=0x%p  regs=0x%p\n", __FUNCTION__,
-+               this->ctrlr, pdata, pdata->regs);
-+
-+      /* enable USB read, write and slave bursts */
-+      MCF_SCM_BCR = MCF_SCM_BCR_GBR | MCF_SCM_BCR_GBW | MCF_SCM_BCR_SBE_ALL;
-+
-+      /* Use external clock source if PLL isn't a multiple of 60MHz */
-+      MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_USBSRC;
-+
-+      /* Initialize the USB Clock: use USB input clock */
-+      MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & MCF_GPIO_PAR_DMA_DREQ1_MASK) |
-+                         MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN;
-+
-+      switch (this->xcvr_type) {
-+      case PORTSCX_PTS_ULPI:
-+              /* Enable the required ULPI signals */
-+              MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA &
-+                                  MCF_GPIO_PAR_DMA_DACK1_MASK) |
-+                                  MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR;
-+
-+              MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT |
-+                                 MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP;
-+
-+              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
-+                                  MCF_GPIO_PAR_FEC_FEC0_MASK) |
-+                                  MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI;
-+              break;
-+      case PORTSCX_PTS_ONCHIP:
-+              /* Enable VBUS_EN and VBUS_OC signals */
-+              MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_VBUSEN |
-+                                 MCF_GPIO_PAR_USB_VBUSOC_VBUSOC;
-+
-+              /* Setup USB_VBUS_OC signal to be active-low */
-+              MCF_CCM_MISCCR |= MCF_CCM_MISCCR_USBOC;
-+
-+              break;
-+      }
-+
-+      pr_debug("&regs->portsc1=0x%p  old portsc1=0x%x \n", &regs->portsc1,
-+               regs->portsc1);
-+
-+      regs->portsc1 &= ~PORTSCX_PTS_MASK;
-+      regs->portsc1 |= this->xcvr_type;
-+
-+      /*
-+       * need to reset the controller here so that the ID pin
-+       * is correctly detected.
-+       */
-+      regs->usbcmd |= USB_CMD_CTRL_RESET;
-+
-+      /*
-+       * allow controller to reset, and leave time for
-+       * the ULPI transceiver to reset too.
-+       */
-+      mdelay(10);
-+
-+      pr_debug("DDD %s: done.  portsc1=0x%x\n", __FUNCTION__, regs->portsc1);
-+}
-+
-+static void xcvr_uninit(struct platform_device *pdev)
-+{
-+      pr_debug("%s: pdev=0x%p\n", __FUNCTION__, pdev);
-+}
-+
-+
-+struct fsl_xcvr_ops xcvr_ops_otg = {
-+      .ctrlr          = USB_CTRLR_OTG,
-+      .init           = xcvr_init,
-+      .uninit         = xcvr_uninit,
-+
-+#ifdef CONFIG_USB_M5445X_ULPI
-+      .xcvr_type      = PORTSCX_PTS_ULPI,
-+#elif defined CONFIG_USB_M5445X_FSLS
-+      .xcvr_type      = PORTSCX_PTS_ONCHIP,
-+#else
-+#error "Invalid USB transceiver selection."
-+#endif
-+};
-+
-+static int __init usb_xcvr_init(void)
-+{
-+      pr_debug("%s\n", __FUNCTION__);
-+
-+      fsl_usb_xcvr_register(&xcvr_ops_otg);
-+
-+      pr_debug("%s done\n", __FUNCTION__);
-+      return 0;
-+}
-+
-+static void __exit usb_xcvr_exit(void)
-+{
-+      fsl_usb_xcvr_unregister(USB_CTRLR_OTG);
-+}
-+
-+module_init(usb_xcvr_init);
-+module_exit(usb_xcvr_exit);
-+
-+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
-+MODULE_DESCRIPTION("External ULPI xcvr driver");
-+MODULE_LICENSE("GPL");
-+
---- /dev/null
-+++ b/arch/m68k/coldfire/usb.c
-@@ -0,0 +1,182 @@
-+/*
-+ *
-+ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ *
-+ *    otg_{get,set}_transceiver() are from arm/plat-omap/usb.c.
-+ *    which is Copyright (C) 2004 Texas Instruments, Inc.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/err.h>
-+#include <linux/platform_device.h>
-+#include <linux/usb/otg.h>
-+#include <linux/delay.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+
-+
-+/* The dmamask must be set for EHCI to work */
-+static u64 ehci_dmamask = ~(u32) 0;
-+
-+struct fsl_xcvr_ops *xc_ops[3] = { NULL };
-+
-+void fsl_usb_enable_clk(void)
-+{
-+}
-+EXPORT_SYMBOL(fsl_usb_enable_clk);
-+
-+void fsl_usb_disable_clk(void)
-+{
-+}
-+EXPORT_SYMBOL(fsl_usb_disable_clk);
-+
-+void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops)
-+{
-+      pr_debug("%s ctrlr=%d\n", __FUNCTION__, xcvr_ops->ctrlr);
-+      xc_ops[xcvr_ops->ctrlr] = xcvr_ops;
-+
-+}
-+EXPORT_SYMBOL(fsl_usb_xcvr_register);
-+
-+void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr)
-+{
-+      pr_debug("%s ctrlr=%d\n", __FUNCTION__, ctrlr);
-+      xc_ops[ctrlr] = NULL;
-+}
-+EXPORT_SYMBOL(fsl_usb_xcvr_unregister);
-+
-+/*!
-+ * Register an instance of a USB host platform device.
-+ *
-+ * @param     res:    resource pointer
-+ * @param       n_res:        number of resources
-+ * @param       config: config pointer
-+ *
-+ * @return      newly-registered platform_device
-+ *
-+ * DDD fix this comment:
-+ * The USB controller supports 3 host interfaces, and the
-+ * kernel can be configured to support some number of them.
-+ * Each supported host interface is registered as an instance
-+ * of the "fsl-ehci" device.  Call this function multiple times
-+ * to register each host interface.
-+ */
-+static int instance_id;
-+struct platform_device *host_pdev_register(struct resource *res, int n_res,
-+                                        struct fsl_usb2_platform_data *config)
-+{
-+      struct platform_device *pdev;
-+
-+      pr_debug("register host res=0x%p, size=%d\n", res, n_res);
-+
-+      pdev = platform_device_register_simple("fsl-ehci",
-+                                             instance_id, res, n_res);
-+      if (IS_ERR(pdev)) {
-+              printk(KERN_ERR "usb: can't register %s Host, %ld\n",
-+                     config->name, PTR_ERR(pdev));
-+              return NULL;
-+      }
-+
-+      pdev->dev.coherent_dma_mask = 0xffffffff;
-+      pdev->dev.dma_mask = &ehci_dmamask;
-+
-+      /*
-+       * platform_device_add_data() makes a copy of
-+       * the platform_data passed in.  That makes it
-+       * impossible to share the same config struct for
-+       * all OTG devices (host,gadget,otg).  So, just
-+       * set the platform_data pointer ourselves.
-+       */
-+      pdev->dev.platform_data = config;
-+
-+      printk(KERN_INFO "usb: %s Host registered\n", config->name);
-+      pr_debug("pdev=0x%p  dev=0x%p  resources=0x%p  pdata=0x%p\n",
-+               pdev, &pdev->dev, pdev->resource, pdev->dev.platform_data);
-+
-+      instance_id++;
-+
-+      return pdev;
-+}
-+
-+
-+int fsl_usb_mem_init(struct platform_device *pdev)
-+{
-+      struct resource *res;
-+      struct fsl_usb2_platform_data *pdata;
-+
-+      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
-+
-+      pr_debug("%s: pdev=0x%p  pdata=0x%p\n", __FUNCTION__, pdev, pdata);
-+
-+      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      if (!res) {
-+              dev_err(&pdev->dev, "no MEM resource.\n");
-+              return -ENODEV;
-+      }
-+
-+      pdata->r_start = res->start;
-+      pdata->r_len = res->end - res->start + 1;
-+      pr_debug("%s: MEM resource start=0x%x  len=0x%x\n", pdata->name,
-+               res->start, pdata->r_len);
-+
-+      if (!request_mem_region(pdata->r_start, pdata->r_len, "OTG")) {
-+              dev_err(&pdev->dev, "request_mem_region failed\n");
-+              return -EBUSY;
-+      }
-+      pdata->regs = ioremap(pdata->r_start, pdata->r_len);
-+      pr_debug("ioremapped to 0x%p\n", pdata->regs);
-+
-+      if (pdata->regs == NULL) {
-+              dev_err(&pdev->dev, "ioremap failed\n");
-+              release_mem_region(pdata->r_start, pdata->r_len);
-+              return -EFAULT;
-+      }
-+
-+      pr_debug("%s: success\n", __FUNCTION__);
-+      return 0;
-+}
-+
-+
-+#if defined(CONFIG_USB_OTG)
-+static struct otg_transceiver *xceiv;
-+
-+/**
-+ * otg_get_transceiver - find the (single) OTG transceiver driver
-+ *
-+ * Returns the transceiver driver, after getting a refcount to it; or
-+ * null if there is no such transceiver.  The caller is responsible for
-+ * releasing that count.
-+ */
-+struct otg_transceiver *otg_get_transceiver(void)
-+{
-+      pr_debug("%s xceiv=0x%p\n", __FUNCTION__, xceiv);
-+      if (xceiv)
-+              get_device(xceiv->dev);
-+      return xceiv;
-+}
-+EXPORT_SYMBOL(otg_get_transceiver);
-+
-+int otg_set_transceiver(struct otg_transceiver *x)
-+{
-+      pr_debug("%s xceiv=0x%p  x=0x%p\n", __FUNCTION__, xceiv, x);
-+      if (xceiv && x)
-+              return -EBUSY;
-+      xceiv = x;
-+      return 0;
-+}
-+EXPORT_SYMBOL(otg_set_transceiver);
-+#endif
---- /dev/null
-+++ b/arch/m68k/coldfire/vmlinux-cf.lds
-@@ -0,0 +1,130 @@
-+/* ld script to make m68k Coldfire Linux kernel
-+ *
-+ * Derived from arch/m68k/kernel/vmlinux-std.lds
-+ *
-+ * Updated 11/26/2007 for new CodeSourcery toolset
-+ *     by Kurt Mahan <kmahan@freescale.com>
-+ */
-+
-+#define       LOAD_OFFSET     0x00000000
-+
-+#include <asm-generic/vmlinux.lds.h>
-+#include <asm/page_offset.h>
-+
-+#define       START_OFFSET    0x00020000
-+#define       IMAGE_START     PAGE_OFFSET_RAW + START_OFFSET
-+
-+OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
-+OUTPUT_ARCH(m68k)
-+ENTRY(_stext)
-+jiffies = jiffies_64 + 4;
-+
-+SECTIONS
-+{
-+  . = IMAGE_START;
-+  .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {
-+      _text = .;                      /* Text and read-only data */
-+      *(.text.head)
-+  } :text = 0x4e75
-+
-+  .text : AT(ADDR(.text) - LOAD_OFFSET) {
-+      TEXT_TEXT
-+      SCHED_TEXT
-+      LOCK_TEXT
-+      *(.fixup)
-+      *(.gnu.warning)
-+  } :text = 0x4e75
-+  _etext = .;                 /* End of text section */
-+
-+  . = ALIGN(16);
-+  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
-+      __start___ex_table = .;
-+      *(__ex_table)
-+      __stop___ex_table = .;
-+  }
-+
-+  RODATA
-+
-+  . = ALIGN(8192);
-+  .data : AT(ADDR(.data) - LOAD_OFFSET) {     /* Data */
-+      DATA_DATA
-+      CONSTRUCTORS
-+  } :data
-+
-+
-+  . = ALIGN(16);
-+  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) {
-+      *(.data.cacheline_aligned)
-+  } :data
-+
-+  _edata = .;                 /* End of data section */
-+
-+  NOTES                               /* support ld --build-id */
-+
-+  . = ALIGN(8192);            /* Initrd */
-+  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
-+      __init_begin = .;
-+      _sinittext = .;
-+      *(.init.text)
-+      _einittext = .;
-+  }
-+
-+  .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
-+      *(.init.data)
-+  }
-+
-+  . = ALIGN(16);
-+  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
-+      __setup_start = .;
-+      *(.init.setup)
-+      __setup_end = .;
-+  }
-+
-+  .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
-+      __initcall_start = .;
-+      INITCALLS
-+      __initcall_end = .;
-+  }
-+
-+  .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
-+      __con_initcall_start = .;
-+      *(.con_initcall.init)
-+      __con_initcall_end = .;
-+  }
-+
-+  SECURITY_INIT
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+  . = ALIGN(8192);
-+  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
-+      __initramfs_start = .;
-+      *(.init.ramfs)
-+      __initramfs_end = .;
-+  }
-+#endif
-+
-+  . = ALIGN(8192);
-+  __init_end = .;
-+
-+  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
-+      *(.data.init_task)      /* The initial task and kernel stack */
-+  }
-+
-+  _sbss = .;
-+  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {               /* BSS */
-+      *(.bss)
-+  }
-+  _ebss = .;
-+
-+  _end = . ;
-+
-+  /* Sections to be discarded */
-+  /DISCARD/ : {
-+      *(.exit.text)
-+      *(.exit.data)
-+      *(.exitcall.exit)
-+  }
-+
-+  /* Stabs debugging sections.  */
-+  STABS_DEBUG
-+}
---- /dev/null
-+++ b/arch/m68k/configs/55_defconfig
-@@ -0,0 +1,830 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25
-+# Thu Jun 26 16:17:41 2008
-+#
-+CONFIG_M68K=y
-+CONFIG_MMU=y
-+# CONFIG_GENERIC_TIME is not set
-+# CONFIG_GENERIC_CLOCKEVENTS is not set
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_TIME_LOW_RES=y
-+CONFIG_GENERIC_IOMAP=y
-+# CONFIG_NO_IOPORT is not set
-+# CONFIG_NO_DMA is not set
-+CONFIG_ARCH_SUPPORTS_AOUT=y
-+CONFIG_HZ=100
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=17
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+CONFIG_NAMESPACES=y
-+# CONFIG_UTS_NS is not set
-+# CONFIG_IPC_NS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_UID16=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+# CONFIG_HAVE_OPROFILE is not set
-+# CONFIG_HAVE_KPROBES is not set
-+# CONFIG_HAVE_KRETPROBES is not set
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform dependent setup
-+#
-+# CONFIG_SUN3 is not set
-+CONFIG_COLDFIRE=y
-+CONFIG_CFV4E=y
-+# CONFIG_AMIGA is not set
-+# CONFIG_ATARI is not set
-+# CONFIG_PCI is not set
-+# CONFIG_MAC is not set
-+# CONFIG_APOLLO is not set
-+# CONFIG_VME is not set
-+# CONFIG_HP300 is not set
-+# CONFIG_SUN3X is not set
-+# CONFIG_Q40 is not set
-+
-+#
-+# Processor type
-+#
-+# CONFIG_M68020 is not set
-+# CONFIG_M68030 is not set
-+# CONFIG_M68040 is not set
-+# CONFIG_M68060 is not set
-+CONFIG_M5445X=y
-+# CONFIG_M54451 is not set
-+CONFIG_M54455=y
-+# CONFIG_M54451EVB is not set
-+CONFIG_M54455EVB=y
-+# CONFIG_M547X_8X is not set
-+CONFIG_MCFCLK=266666666
-+# CONFIG_MCF_USER_HALT is not set
-+CONFIG_MMU_CFV4E=y
-+CONFIG_SDRAM_BASE=0x40000000
-+CONFIG_SDRAM_SIZE=0x10000000
-+CONFIG_NOR_FLASH_BASE=0x00000000
-+# CONFIG_M68KFPU_EMU is not set
-+CONFIG_ADVANCED=y
-+# CONFIG_RMW_INSNS is not set
-+CONFIG_SINGLE_MEMORY_CHUNK=y
-+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_PROC_HARDWARE=y
-+CONFIG_ZONE_DMA=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=y
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+# CONFIG_IP_MULTIPLE_TABLES is not set
-+# CONFIG_IP_ROUTE_MULTIPATH is not set
-+# CONFIG_IP_ROUTE_VERBOSE is not set
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+CONFIG_INET_AH=y
-+CONFIG_INET_ESP=y
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=64000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_COLDFIRE_SEC is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+CONFIG_FEC=y
-+# CONFIG_FEC2 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_COLDFIRE=y
-+# CONFIG_SERIAL_MCF is not set
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+CONFIG_I2C_CHARDEV=y
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+# CONFIG_I2C_MCF548x is not set
-+CONFIG_I2C_MCF=y
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+# CONFIG_SPI is not set
-+# CONFIG_COLDFIRE_EDMA is not set
-+# CONFIG_SPI_MASTER is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+# CONFIG_HID_SUPPORT is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_SERIAL_CONSOLE is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+CONFIG_MINIX_FS=y
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+CONFIG_DEBUG_SLAB=y
-+# CONFIG_DEBUG_SLAB_LEAK is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_FRAME_POINTER is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_BOOTPARAM=y
-+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_AEAD=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_TEST=m
-+CONFIG_CRYPTO_AUTHENC=y
-+# CONFIG_CRYPTO_LZO is not set
-+CONFIG_CRYPTO_HW=y
-+# CONFIG_CRYPTO_DEV_MCFCAU is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=y
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
---- /dev/null
-+++ b/arch/m68k/configs/m54455evb_defconfig
-@@ -0,0 +1,1037 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.23
-+# Thu Dec  6 12:14:18 2007
-+#
-+CONFIG_M68K=y
-+CONFIG_MMU=y
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_TIME_LOW_RES=y
-+CONFIG_GENERIC_IOMAP=y
-+CONFIG_NO_IOPORT=y
-+# CONFIG_NO_DMA is not set
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=17
-+CONFIG_SYSFS_DEPRECATED=y
-+# CONFIG_RELAY is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_UID16=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+
-+#
-+# Platform dependent setup
-+#
-+# CONFIG_SUN3 is not set
-+CONFIG_COLDFIRE=y
-+CONFIG_CFV4E=y
-+# CONFIG_AMIGA is not set
-+# CONFIG_ATARI is not set
-+# CONFIG_MAC is not set
-+# CONFIG_APOLLO is not set
-+# CONFIG_VME is not set
-+# CONFIG_HP300 is not set
-+# CONFIG_SUN3X is not set
-+# CONFIG_Q40 is not set
-+
-+#
-+# Processor type
-+#
-+# CONFIG_M68020 is not set
-+# CONFIG_M68030 is not set
-+# CONFIG_M68040 is not set
-+# CONFIG_M68060 is not set
-+CONFIG_M54455=y
-+CONFIG_MCFCLK=266666666
-+# CONFIG_MCF_USER_HALT is not set
-+CONFIG_MMU_CFV4E=y
-+CONFIG_SDRAM_BASE=0x40000000
-+CONFIG_SDRAM_SIZE=0x0FFFFFFF
-+CONFIG_NOR_FLASH_BASE=0x00000000
-+# CONFIG_M68KFPU_EMU is not set
-+CONFIG_ADVANCED=y
-+# CONFIG_RMW_INSNS is not set
-+CONFIG_SINGLE_MEMORY_CHUNK=y
-+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_PROC_HARDWARE=y
-+CONFIG_ZONE_DMA=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+CONFIG_NET_KEY=y
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+# CONFIG_IP_MULTIPLE_TABLES is not set
-+# CONFIG_IP_ROUTE_MULTIPATH is not set
-+# CONFIG_IP_ROUTE_VERBOSE is not set
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+CONFIG_INET_AH=y
-+CONFIG_INET_ESP=y
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+
-+#
-+# QoS and/or fair queueing
-+#
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+CONFIG_MTD_DEBUG=y
-+CONFIG_MTD_DEBUG_VERBOSE=0
-+CONFIG_MTD_CONCAT=y
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+CONFIG_MTD_CHAR=y
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+CONFIG_MTD_CFI=y
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_GEN_PROBE=y
-+CONFIG_MTD_CFI_ADV_OPTIONS=y
-+CONFIG_MTD_CFI_NOSWAP=y
-+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
-+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
-+CONFIG_MTD_CFI_GEOMETRY=y
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+# CONFIG_MTD_CFI_I2 is not set
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+# CONFIG_MTD_OTP is not set
-+CONFIG_MTD_CFI_INTELEXT=y
-+# CONFIG_MTD_CFI_AMDSTD is not set
-+# CONFIG_MTD_CFI_STAA is not set
-+CONFIG_MTD_CFI_UTIL=y
-+# CONFIG_MTD_RAM is not set
-+# CONFIG_MTD_ROM is not set
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+CONFIG_MTD_PHYSMAP=y
-+CONFIG_MTD_PHYSMAP_START=0x00000000
-+CONFIG_MTD_PHYSMAP_LEN=0x1000000
-+CONFIG_MTD_PHYSMAP_BANKWIDTH=1
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_UB is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=64000
-+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+CONFIG_SCSI_LOWLEVEL=y
-+# CONFIG_ISCSI_TCP is not set
-+# CONFIG_SCSI_DEBUG is not set
-+CONFIG_ATA=m
-+# CONFIG_ATA_NONSTANDARD is not set
-+CONFIG_PATA_FSL=m
-+# CONFIG_MD is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_FEC=y
-+# CONFIG_FEC2 is not set
-+CONFIG_NETDEV_1000=y
-+CONFIG_NETDEV_10000=y
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+
-+#
-+# USB Network Adapters
-+#
-+# CONFIG_USB_CATC is not set
-+# CONFIG_USB_KAWETH is not set
-+CONFIG_USB_PEGASUS=m
-+CONFIG_USB_RTL8150=m
-+CONFIG_USB_USBNET_MII=m
-+CONFIG_USB_USBNET=m
-+CONFIG_USB_NET_AX8817X=m
-+CONFIG_USB_NET_CDCETHER=m
-+# CONFIG_USB_NET_DM9601 is not set
-+# CONFIG_USB_NET_GL620A is not set
-+# CONFIG_USB_NET_NET1080 is not set
-+# CONFIG_USB_NET_PLUSB is not set
-+# CONFIG_USB_NET_MCS7830 is not set
-+# CONFIG_USB_NET_RNDIS_HOST is not set
-+# CONFIG_USB_NET_CDC_SUBSET is not set
-+# CONFIG_USB_NET_ZAURUS is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_SHAPER is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+# CONFIG_INPUT_TSDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_COLDFIRE=y
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_WATCHDOG is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+# CONFIG_SPI_DEBUG is not set
-+CONFIG_COLDFIRE_EDMA=y
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+# CONFIG_SPI_BITBANG is not set
-+CONFIG_SPI_COLDFIRE=y
-+CONFIG_SPI_COLDFIRE_DSPI_EDMA=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+CONFIG_SPI_COLDFIRE_SSI_AUDIO=y
-+# CONFIG_SSIAUDIO_USE_EDMA is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+# CONFIG_USB_DABUSB is not set
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+CONFIG_HID_DEBUG=y
-+
-+#
-+# USB Input Devices
-+#
-+CONFIG_USB_HID=y
-+# CONFIG_USB_HIDINPUT_POWERBOOK is not set
-+# CONFIG_HID_FF is not set
-+# CONFIG_USB_HIDDEV is not set
-+CONFIG_USB_SUPPORT=y
-+CONFIG_USB_ARCH_HAS_HCD=y
-+# CONFIG_USB_ARCH_HAS_OHCI is not set
-+CONFIG_USB_ARCH_HAS_EHCI=y
-+CONFIG_USB=y
-+# CONFIG_USB_DEBUG is not set
-+
-+#
-+# Miscellaneous USB options
-+#
-+CONFIG_USB_DEVICEFS=y
-+# CONFIG_USB_DEVICE_CLASS is not set
-+# CONFIG_USB_DYNAMIC_MINORS is not set
-+# CONFIG_USB_OTG is not set
-+
-+#
-+# USB Host Controller Drivers
-+#
-+CONFIG_USB_EHCI_HCD=m
-+CONFIG_USB_EHCI_SPLIT_ISO=y
-+CONFIG_USB_EHCI_ROOT_HUB_TT=y
-+# CONFIG_USB_EHCI_TT_NEWSCHED is not set
-+CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
-+CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y
-+# CONFIG_USB_ISP116X_HCD is not set
-+# CONFIG_USB_SL811_HCD is not set
-+# CONFIG_USB_R8A66597_HCD is not set
-+CONFIG_USB_M5445X_ULPI=y
-+# CONFIG_USB_M5445X_FSLS is not set
-+
-+#
-+# USB Device Class drivers
-+#
-+# CONFIG_USB_ACM is not set
-+# CONFIG_USB_PRINTER is not set
-+
-+#
-+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
-+#
-+
-+#
-+# may also be needed; see USB_STORAGE Help for more information
-+#
-+CONFIG_USB_STORAGE=y
-+# CONFIG_USB_STORAGE_DEBUG is not set
-+# CONFIG_USB_STORAGE_DATAFAB is not set
-+# CONFIG_USB_STORAGE_FREECOM is not set
-+# CONFIG_USB_STORAGE_DPCM is not set
-+# CONFIG_USB_STORAGE_USBAT is not set
-+# CONFIG_USB_STORAGE_SDDR09 is not set
-+# CONFIG_USB_STORAGE_SDDR55 is not set
-+# CONFIG_USB_STORAGE_JUMPSHOT is not set
-+# CONFIG_USB_STORAGE_ALAUDA is not set
-+# CONFIG_USB_STORAGE_ONETOUCH is not set
-+# CONFIG_USB_STORAGE_KARMA is not set
-+# CONFIG_USB_LIBUSUAL is not set
-+
-+#
-+# USB Imaging devices
-+#
-+# CONFIG_USB_MDC800 is not set
-+# CONFIG_USB_MICROTEK is not set
-+# CONFIG_USB_MON is not set
-+
-+#
-+# USB port drivers
-+#
-+
-+#
-+# USB Serial Converter support
-+#
-+# CONFIG_USB_SERIAL is not set
-+
-+#
-+# USB Miscellaneous drivers
-+#
-+# CONFIG_USB_EMI62 is not set
-+# CONFIG_USB_EMI26 is not set
-+# CONFIG_USB_ADUTUX is not set
-+# CONFIG_USB_AUERSWALD is not set
-+# CONFIG_USB_RIO500 is not set
-+# CONFIG_USB_LEGOTOWER is not set
-+# CONFIG_USB_LCD is not set
-+# CONFIG_USB_BERRY_CHARGE is not set
-+# CONFIG_USB_LED is not set
-+# CONFIG_USB_CYPRESS_CY7C63 is not set
-+# CONFIG_USB_CYTHERM is not set
-+# CONFIG_USB_PHIDGET is not set
-+# CONFIG_USB_IDMOUSE is not set
-+# CONFIG_USB_FTDI_ELAN is not set
-+# CONFIG_USB_APPLEDISPLAY is not set
-+# CONFIG_USB_SISUSBVGA is not set
-+# CONFIG_USB_LD is not set
-+# CONFIG_USB_TRANCEVIBRATOR is not set
-+# CONFIG_USB_IOWARRIOR is not set
-+# CONFIG_USB_TEST is not set
-+
-+#
-+# USB DSL modem support
-+#
-+
-+#
-+# USB Gadget Support
-+#
-+CONFIG_USB_GADGET=m
-+# CONFIG_USB_GADGET_DEBUG is not set
-+# CONFIG_USB_GADGET_DEBUG_FILES is not set
-+CONFIG_USB_GADGET_SELECTED=y
-+# CONFIG_USB_GADGET_AMD5536UDC is not set
-+# CONFIG_USB_GADGET_FSL_USB2 is not set
-+# CONFIG_USB_GADGET_NET2280 is not set
-+# CONFIG_USB_GADGET_PXA2XX is not set
-+# CONFIG_USB_GADGET_M66592 is not set
-+CONFIG_USB_GADGET_MCF5445X=y
-+CONFIG_USB_MCF5445X=m
-+# CONFIG_USB_GADGET_GOKU is not set
-+# CONFIG_USB_GADGET_LH7A40X is not set
-+# CONFIG_USB_GADGET_OMAP is not set
-+# CONFIG_USB_GADGET_S3C2410 is not set
-+# CONFIG_USB_GADGET_AT91 is not set
-+# CONFIG_USB_GADGET_DUMMY_HCD is not set
-+CONFIG_USB_GADGET_DUALSPEED=y
-+# CONFIG_USB_ZERO is not set
-+CONFIG_USB_ETH=m
-+CONFIG_USB_ETH_RNDIS=y
-+CONFIG_USB_GADGETFS=m
-+CONFIG_USB_FILE_STORAGE=m
-+# CONFIG_USB_FILE_STORAGE_TEST is not set
-+# CONFIG_USB_G_SERIAL is not set
-+# CONFIG_USB_MIDI_GADGET is not set
-+# CONFIG_MMC is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# DMA Engine support
-+#
-+# CONFIG_DMA_ENGINE is not set
-+
-+#
-+# DMA Clients
-+#
-+
-+#
-+# DMA Devices
-+#
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_SERIAL_CONSOLE is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+# CONFIG_JBD_DEBUG is not set
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_MINIX_FS=y
-+# CONFIG_ROMFS_FS is not set
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+CONFIG_RAMFS=y
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+CONFIG_JFFS2_FS=y
-+CONFIG_JFFS2_FS_DEBUG=0
-+CONFIG_JFFS2_FS_WRITEBUFFER=y
-+# CONFIG_JFFS2_SUMMARY is not set
-+# CONFIG_JFFS2_FS_XATTR is not set
-+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-+CONFIG_JFFS2_ZLIB=y
-+CONFIG_JFFS2_RTIME=y
-+# CONFIG_JFFS2_RUBIN is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+
-+#
-+# Network File Systems
-+#
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+
-+#
-+# Native Language Support
-+#
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+
-+#
-+# Distributed Lock Manager
-+#
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+CONFIG_DEBUG_SLAB=y
-+# CONFIG_DEBUG_SLAB_LEAK is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_FRAME_POINTER is not set
-+CONFIG_FORCED_INLINING=y
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+CONFIG_BOOTPARAM=y
-+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
-+
-+#
-+# CodeTEST Setup
-+#
-+# CONFIG_CODETEST is not set
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+CONFIG_CRYPTO_ECB=y
-+CONFIG_CRYPTO_CBC=y
-+CONFIG_CRYPTO_PCBC=m
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_TEST=m
-+CONFIG_CRYPTO_HW=y
-+CONFIG_CRYPTO_DEV_MCFCAU=y
-+CONFIG_CRYPTO_DEV_MCFCAU_DES=y
-+CONFIG_CRYPTO_DEV_MCFCAU_AES=y
-+CONFIG_CRYPTO_DEV_MCFCAU_MD5=y
-+CONFIG_CRYPTO_DEV_MCFCAU_SHA1=y
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=y
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=y
-+CONFIG_ZLIB_INFLATE=y
-+CONFIG_ZLIB_DEFLATE=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_DMA=y
---- /dev/null
-+++ b/arch/m68k/configs/m5475evb_defconfig
-@@ -0,0 +1,954 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25
-+# Wed Jul  9 16:09:19 2008
-+#
-+CONFIG_M68K=y
-+CONFIG_MMU=y
-+# CONFIG_GENERIC_TIME is not set
-+# CONFIG_GENERIC_CLOCKEVENTS is not set
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_TIME_LOW_RES=y
-+CONFIG_GENERIC_IOMAP=y
-+# CONFIG_NO_IOPORT is not set
-+# CONFIG_NO_DMA is not set
-+CONFIG_ARCH_SUPPORTS_AOUT=y
-+CONFIG_HZ=100
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=17
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+CONFIG_NAMESPACES=y
-+# CONFIG_UTS_NS is not set
-+# CONFIG_IPC_NS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_UID16=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+# CONFIG_HAVE_OPROFILE is not set
-+# CONFIG_HAVE_KPROBES is not set
-+# CONFIG_HAVE_KRETPROBES is not set
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform dependent setup
-+#
-+# CONFIG_SUN3 is not set
-+CONFIG_COLDFIRE=y
-+CONFIG_CFV4E=y
-+CONFIG_MCD_DMA=y
-+# CONFIG_AMIGA is not set
-+# CONFIG_ATARI is not set
-+CONFIG_PCI=y
-+# CONFIG_MAC is not set
-+# CONFIG_APOLLO is not set
-+# CONFIG_VME is not set
-+# CONFIG_HP300 is not set
-+# CONFIG_SUN3X is not set
-+# CONFIG_Q40 is not set
-+
-+#
-+# Processor type
-+#
-+# CONFIG_M68020 is not set
-+# CONFIG_M68030 is not set
-+# CONFIG_M68040 is not set
-+# CONFIG_M68060 is not set
-+# CONFIG_M5445X is not set
-+CONFIG_M547X_8X=y
-+CONFIG_M547X=y
-+# CONFIG_M548X is not set
-+# CONFIG_M5475AFE is not set
-+# CONFIG_M5475BFE is not set
-+CONFIG_M5475CFE=y
-+# CONFIG_M5475DFE is not set
-+# CONFIG_M5475EFE is not set
-+# CONFIG_M5475FFE is not set
-+# CONFIG_M5485AFE is not set
-+# CONFIG_M5485BFE is not set
-+# CONFIG_M5485CFE is not set
-+# CONFIG_M5485DFE is not set
-+# CONFIG_M5485EFE is not set
-+# CONFIG_M5485FFE is not set
-+CONFIG_MCFCLK=266000000
-+# CONFIG_MCF_USER_HALT is not set
-+CONFIG_MMU_CFV4E=y
-+CONFIG_SDRAM_BASE=0x00000000
-+CONFIG_SDRAM_SIZE=0x04000000
-+CONFIG_NOR_FLASH_BASE=0xE0000000
-+# CONFIG_M68KFPU_EMU is not set
-+CONFIG_ADVANCED=y
-+# CONFIG_RMW_INSNS is not set
-+CONFIG_SINGLE_MEMORY_CHUNK=y
-+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_PROC_HARDWARE=y
-+CONFIG_ZONE_DMA=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+CONFIG_PCI_LEGACY=y
-+# CONFIG_PCI_DEBUG is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=y
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+# CONFIG_IP_MULTIPLE_TABLES is not set
-+# CONFIG_IP_ROUTE_MULTIPATH is not set
-+# CONFIG_IP_ROUTE_VERBOSE is not set
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+CONFIG_INET_AH=y
-+CONFIG_INET_ESP=y
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+CONFIG_CAN=y
-+CONFIG_CAN_RAW=y
-+# CONFIG_CAN_BCM is not set
-+
-+#
-+# CAN Device Drivers
-+#
-+# CONFIG_CAN_VCAN is not set
-+CONFIG_CAN_FLEXCAN=y
-+CONFIG_CAN_MCF547X_8X=y
-+# CONFIG_CAN_DEBUG_DEVICES is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+CONFIG_MTD=y
-+# CONFIG_MTD_DEBUG is not set
-+# CONFIG_MTD_CONCAT is not set
-+CONFIG_MTD_PARTITIONS=y
-+# CONFIG_MTD_REDBOOT_PARTS is not set
-+CONFIG_MTD_CMDLINE_PARTS=y
-+
-+#
-+# User Modules And Translation Layers
-+#
-+# CONFIG_MTD_CHAR is not set
-+CONFIG_MTD_BLKDEVS=y
-+CONFIG_MTD_BLOCK=y
-+# CONFIG_FTL is not set
-+# CONFIG_NFTL is not set
-+# CONFIG_INFTL is not set
-+# CONFIG_RFD_FTL is not set
-+# CONFIG_SSFDC is not set
-+# CONFIG_MTD_OOPS is not set
-+
-+#
-+# RAM/ROM/Flash chip drivers
-+#
-+# CONFIG_MTD_CFI is not set
-+# CONFIG_MTD_JEDECPROBE is not set
-+CONFIG_MTD_MAP_BANK_WIDTH_1=y
-+CONFIG_MTD_MAP_BANK_WIDTH_2=y
-+CONFIG_MTD_MAP_BANK_WIDTH_4=y
-+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
-+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
-+CONFIG_MTD_CFI_I1=y
-+CONFIG_MTD_CFI_I2=y
-+# CONFIG_MTD_CFI_I4 is not set
-+# CONFIG_MTD_CFI_I8 is not set
-+CONFIG_MTD_RAM=y
-+CONFIG_MTD_ROM=y
-+# CONFIG_MTD_ABSENT is not set
-+
-+#
-+# Mapping drivers for chip access
-+#
-+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
-+# CONFIG_MTD_PHYSMAP is not set
-+# CONFIG_MTD_INTEL_VR_NOR is not set
-+# CONFIG_MTD_PLATRAM is not set
-+
-+#
-+# Self-contained MTD device drivers
-+#
-+# CONFIG_MTD_PMC551 is not set
-+# CONFIG_MTD_DATAFLASH is not set
-+# CONFIG_MTD_M25P80 is not set
-+# CONFIG_MTD_SLRAM is not set
-+# CONFIG_MTD_PHRAM is not set
-+# CONFIG_MTD_MTDRAM is not set
-+# CONFIG_MTD_BLOCK2MTD is not set
-+
-+#
-+# Disk-On-Chip Device Drivers
-+#
-+# CONFIG_MTD_DOC2000 is not set
-+# CONFIG_MTD_DOC2001 is not set
-+# CONFIG_MTD_DOC2001PLUS is not set
-+# CONFIG_MTD_NAND is not set
-+# CONFIG_MTD_ONENAND is not set
-+
-+#
-+# UBI - Unsorted block images
-+#
-+# CONFIG_MTD_UBI is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_CPQ_DA is not set
-+# CONFIG_BLK_CPQ_CISS_DA is not set
-+# CONFIG_BLK_DEV_DAC960 is not set
-+# CONFIG_BLK_DEV_UMEM is not set
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+# CONFIG_BLK_DEV_SX8 is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=64000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+CONFIG_COLDFIRE_SEC=y
-+CONFIG_SEC_DEVICE=y
-+# CONFIG_PHANTOM is not set
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_SGI_IOC4 is not set
-+# CONFIG_TIFM_CORE is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+# CONFIG_FUSION is not set
-+
-+#
-+# IEEE 1394 (FireWire) support
-+#
-+# CONFIG_FIREWIRE is not set
-+# CONFIG_IEEE1394 is not set
-+# CONFIG_I2O is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_ARCNET is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_FEC_548x=y
-+CONFIG_FEC_548x_AUTO_NEGOTIATION=y
-+# CONFIG_FEC_548x_ENABLE_FEC2 is not set
-+# CONFIG_HAPPYMEAL is not set
-+# CONFIG_SUNGEM is not set
-+# CONFIG_CASSINI is not set
-+# CONFIG_NET_VENDOR_3COM is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_NET_TULIP is not set
-+# CONFIG_HP100 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_NET_PCI is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+# CONFIG_TR is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_FDDI is not set
-+# CONFIG_HIPPI is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NET_FC is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_PCIPS2 is not set
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+# CONFIG_NOZOMI is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_COLDFIRE=y
-+CONFIG_SERIAL_COLDFIRE_IRDA=y
-+# CONFIG_SERIAL_MCF is not set
-+# CONFIG_SERIAL_JSM is not set
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_APPLICOM is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+# CONFIG_I2C is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+CONFIG_SPI_DEBUG=y
-+# CONFIG_COLDFIRE_EDMA is not set
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+# CONFIG_SPI_BITBANG is not set
-+CONFIG_SPI_COLDFIRE=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+CONFIG_WATCHDOG=y
-+# CONFIG_WATCHDOG_NOWAYOUT is not set
-+
-+#
-+# Watchdog Device Drivers
-+#
-+# CONFIG_SOFT_WATCHDOG is not set
-+CONFIG_COLDFIRE_WATCHDOG=m
-+
-+#
-+# PCI-based Watchdog Cards
-+#
-+# CONFIG_PCIPCWATCHDOG is not set
-+# CONFIG_WDTPCI is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_DRM is not set
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+CONFIG_HID_DEBUG=y
-+# CONFIG_HIDRAW is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_INFINIBAND is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_SERIAL_CONSOLE is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_JFFS2_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+CONFIG_MINIX_FS=y
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+CONFIG_ROMFS_FS=y
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+CONFIG_DEBUG_SLAB=y
-+# CONFIG_DEBUG_SLAB_LEAK is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_FRAME_POINTER is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_BOOTPARAM=y
-+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_AEAD=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_TEST=m
-+CONFIG_CRYPTO_AUTHENC=y
-+# CONFIG_CRYPTO_LZO is not set
-+# CONFIG_CRYPTO_HW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=y
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
---- /dev/null
-+++ b/arch/m68k/configs/m5485evb_defconfig
-@@ -0,0 +1,859 @@
-+#
-+# Automatically generated make config: don't edit
-+# Linux kernel version: 2.6.25
-+# Thu Jul 10 16:12:53 2008
-+#
-+CONFIG_M68K=y
-+CONFIG_MMU=y
-+# CONFIG_GENERIC_TIME is not set
-+# CONFIG_GENERIC_CLOCKEVENTS is not set
-+CONFIG_RWSEM_GENERIC_SPINLOCK=y
-+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
-+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
-+CONFIG_GENERIC_HWEIGHT=y
-+CONFIG_GENERIC_CALIBRATE_DELAY=y
-+CONFIG_TIME_LOW_RES=y
-+CONFIG_GENERIC_IOMAP=y
-+# CONFIG_NO_IOPORT is not set
-+# CONFIG_NO_DMA is not set
-+CONFIG_ARCH_SUPPORTS_AOUT=y
-+CONFIG_HZ=100
-+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
-+
-+#
-+# General setup
-+#
-+CONFIG_EXPERIMENTAL=y
-+CONFIG_BROKEN_ON_SMP=y
-+CONFIG_INIT_ENV_ARG_LIMIT=32
-+CONFIG_LOCALVERSION=""
-+CONFIG_LOCALVERSION_AUTO=y
-+CONFIG_SWAP=y
-+CONFIG_SYSVIPC=y
-+CONFIG_SYSVIPC_SYSCTL=y
-+# CONFIG_POSIX_MQUEUE is not set
-+# CONFIG_BSD_PROCESS_ACCT is not set
-+# CONFIG_TASKSTATS is not set
-+# CONFIG_AUDIT is not set
-+CONFIG_IKCONFIG=y
-+CONFIG_IKCONFIG_PROC=y
-+CONFIG_LOG_BUF_SHIFT=17
-+# CONFIG_CGROUPS is not set
-+CONFIG_GROUP_SCHED=y
-+CONFIG_FAIR_GROUP_SCHED=y
-+# CONFIG_RT_GROUP_SCHED is not set
-+CONFIG_USER_SCHED=y
-+# CONFIG_CGROUP_SCHED is not set
-+CONFIG_SYSFS_DEPRECATED=y
-+CONFIG_SYSFS_DEPRECATED_V2=y
-+# CONFIG_RELAY is not set
-+CONFIG_NAMESPACES=y
-+# CONFIG_UTS_NS is not set
-+# CONFIG_IPC_NS is not set
-+# CONFIG_USER_NS is not set
-+# CONFIG_PID_NS is not set
-+# CONFIG_BLK_DEV_INITRD is not set
-+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
-+CONFIG_SYSCTL=y
-+# CONFIG_EMBEDDED is not set
-+CONFIG_UID16=y
-+CONFIG_SYSCTL_SYSCALL=y
-+CONFIG_KALLSYMS=y
-+# CONFIG_KALLSYMS_ALL is not set
-+# CONFIG_KALLSYMS_EXTRA_PASS is not set
-+CONFIG_HOTPLUG=y
-+CONFIG_PRINTK=y
-+CONFIG_BUG=y
-+CONFIG_ELF_CORE=y
-+CONFIG_COMPAT_BRK=y
-+CONFIG_BASE_FULL=y
-+CONFIG_FUTEX=y
-+CONFIG_ANON_INODES=y
-+CONFIG_EPOLL=y
-+CONFIG_SIGNALFD=y
-+CONFIG_TIMERFD=y
-+CONFIG_EVENTFD=y
-+CONFIG_SHMEM=y
-+CONFIG_VM_EVENT_COUNTERS=y
-+CONFIG_SLAB=y
-+# CONFIG_SLUB is not set
-+# CONFIG_SLOB is not set
-+# CONFIG_PROFILING is not set
-+# CONFIG_MARKERS is not set
-+# CONFIG_HAVE_OPROFILE is not set
-+# CONFIG_HAVE_KPROBES is not set
-+# CONFIG_HAVE_KRETPROBES is not set
-+CONFIG_PROC_PAGE_MONITOR=y
-+CONFIG_SLABINFO=y
-+CONFIG_RT_MUTEXES=y
-+# CONFIG_TINY_SHMEM is not set
-+CONFIG_BASE_SMALL=0
-+CONFIG_MODULES=y
-+CONFIG_MODULE_UNLOAD=y
-+CONFIG_MODULE_FORCE_UNLOAD=y
-+# CONFIG_MODVERSIONS is not set
-+# CONFIG_MODULE_SRCVERSION_ALL is not set
-+# CONFIG_KMOD is not set
-+CONFIG_BLOCK=y
-+CONFIG_LBD=y
-+# CONFIG_BLK_DEV_IO_TRACE is not set
-+# CONFIG_LSF is not set
-+# CONFIG_BLK_DEV_BSG is not set
-+
-+#
-+# IO Schedulers
-+#
-+CONFIG_IOSCHED_NOOP=y
-+CONFIG_IOSCHED_AS=y
-+CONFIG_IOSCHED_DEADLINE=y
-+CONFIG_IOSCHED_CFQ=y
-+# CONFIG_DEFAULT_AS is not set
-+# CONFIG_DEFAULT_DEADLINE is not set
-+CONFIG_DEFAULT_CFQ=y
-+# CONFIG_DEFAULT_NOOP is not set
-+CONFIG_DEFAULT_IOSCHED="cfq"
-+CONFIG_CLASSIC_RCU=y
-+
-+#
-+# Platform dependent setup
-+#
-+# CONFIG_SUN3 is not set
-+CONFIG_COLDFIRE=y
-+CONFIG_CFV4E=y
-+CONFIG_MCD_DMA=y
-+# CONFIG_AMIGA is not set
-+# CONFIG_ATARI is not set
-+# CONFIG_MAC is not set
-+# CONFIG_APOLLO is not set
-+# CONFIG_VME is not set
-+# CONFIG_HP300 is not set
-+# CONFIG_SUN3X is not set
-+# CONFIG_Q40 is not set
-+
-+#
-+# Processor type
-+#
-+# CONFIG_M68020 is not set
-+# CONFIG_M68030 is not set
-+# CONFIG_M68040 is not set
-+# CONFIG_M68060 is not set
-+# CONFIG_M5445X is not set
-+CONFIG_M547X_8X=y
-+# CONFIG_M547X is not set
-+CONFIG_M548X=y
-+# CONFIG_M5475AFE is not set
-+# CONFIG_M5475BFE is not set
-+# CONFIG_M5475CFE is not set
-+# CONFIG_M5475DFE is not set
-+# CONFIG_M5475EFE is not set
-+# CONFIG_M5475FFE is not set
-+# CONFIG_M5485AFE is not set
-+# CONFIG_M5485BFE is not set
-+CONFIG_M5485CFE=y
-+# CONFIG_M5485DFE is not set
-+# CONFIG_M5485EFE is not set
-+# CONFIG_M5485FFE is not set
-+CONFIG_MCFCLK=200000000
-+# CONFIG_MCF_USER_HALT is not set
-+CONFIG_MMU_CFV4E=y
-+CONFIG_SDRAM_BASE=0x00000000
-+CONFIG_SDRAM_SIZE=0x04000000
-+CONFIG_NOR_FLASH_BASE=0xE0000000
-+# CONFIG_M68KFPU_EMU is not set
-+CONFIG_ADVANCED=y
-+# CONFIG_RMW_INSNS is not set
-+CONFIG_SINGLE_MEMORY_CHUNK=y
-+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
-+CONFIG_SELECT_MEMORY_MODEL=y
-+CONFIG_FLATMEM_MANUAL=y
-+# CONFIG_DISCONTIGMEM_MANUAL is not set
-+# CONFIG_SPARSEMEM_MANUAL is not set
-+CONFIG_FLATMEM=y
-+CONFIG_FLAT_NODE_MEM_MAP=y
-+CONFIG_NEED_MULTIPLE_NODES=y
-+# CONFIG_SPARSEMEM_STATIC is not set
-+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
-+CONFIG_SPLIT_PTLOCK_CPUS=4
-+# CONFIG_RESOURCES_64BIT is not set
-+CONFIG_ZONE_DMA_FLAG=1
-+CONFIG_BOUNCE=y
-+CONFIG_VIRT_TO_BUS=y
-+
-+#
-+# General setup
-+#
-+CONFIG_BINFMT_ELF=y
-+# CONFIG_BINFMT_AOUT is not set
-+# CONFIG_BINFMT_MISC is not set
-+CONFIG_PROC_HARDWARE=y
-+CONFIG_ZONE_DMA=y
-+# CONFIG_ARCH_SUPPORTS_MSI is not set
-+
-+#
-+# Power management options
-+#
-+# CONFIG_PM is not set
-+
-+#
-+# Networking
-+#
-+CONFIG_NET=y
-+
-+#
-+# Networking options
-+#
-+CONFIG_PACKET=y
-+# CONFIG_PACKET_MMAP is not set
-+CONFIG_UNIX=y
-+CONFIG_XFRM=y
-+# CONFIG_XFRM_USER is not set
-+# CONFIG_XFRM_SUB_POLICY is not set
-+# CONFIG_XFRM_MIGRATE is not set
-+# CONFIG_XFRM_STATISTICS is not set
-+CONFIG_NET_KEY=y
-+# CONFIG_NET_KEY_MIGRATE is not set
-+CONFIG_INET=y
-+# CONFIG_IP_MULTICAST is not set
-+CONFIG_IP_ADVANCED_ROUTER=y
-+CONFIG_ASK_IP_FIB_HASH=y
-+# CONFIG_IP_FIB_TRIE is not set
-+CONFIG_IP_FIB_HASH=y
-+# CONFIG_IP_MULTIPLE_TABLES is not set
-+# CONFIG_IP_ROUTE_MULTIPATH is not set
-+# CONFIG_IP_ROUTE_VERBOSE is not set
-+CONFIG_IP_PNP=y
-+# CONFIG_IP_PNP_DHCP is not set
-+# CONFIG_IP_PNP_BOOTP is not set
-+# CONFIG_IP_PNP_RARP is not set
-+# CONFIG_NET_IPIP is not set
-+# CONFIG_NET_IPGRE is not set
-+# CONFIG_ARPD is not set
-+# CONFIG_SYN_COOKIES is not set
-+CONFIG_INET_AH=y
-+CONFIG_INET_ESP=y
-+# CONFIG_INET_IPCOMP is not set
-+# CONFIG_INET_XFRM_TUNNEL is not set
-+# CONFIG_INET_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
-+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
-+# CONFIG_INET_XFRM_MODE_BEET is not set
-+# CONFIG_INET_LRO is not set
-+CONFIG_INET_DIAG=y
-+CONFIG_INET_TCP_DIAG=y
-+# CONFIG_TCP_CONG_ADVANCED is not set
-+CONFIG_TCP_CONG_CUBIC=y
-+CONFIG_DEFAULT_TCP_CONG="cubic"
-+# CONFIG_TCP_MD5SIG is not set
-+# CONFIG_IPV6 is not set
-+# CONFIG_INET6_XFRM_TUNNEL is not set
-+# CONFIG_INET6_TUNNEL is not set
-+# CONFIG_NETWORK_SECMARK is not set
-+# CONFIG_NETFILTER is not set
-+# CONFIG_IP_DCCP is not set
-+# CONFIG_IP_SCTP is not set
-+# CONFIG_TIPC is not set
-+# CONFIG_ATM is not set
-+# CONFIG_BRIDGE is not set
-+# CONFIG_VLAN_8021Q is not set
-+# CONFIG_DECNET is not set
-+# CONFIG_LLC2 is not set
-+# CONFIG_IPX is not set
-+# CONFIG_ATALK is not set
-+# CONFIG_X25 is not set
-+# CONFIG_LAPB is not set
-+# CONFIG_ECONET is not set
-+# CONFIG_WAN_ROUTER is not set
-+# CONFIG_NET_SCHED is not set
-+
-+#
-+# Network testing
-+#
-+# CONFIG_NET_PKTGEN is not set
-+# CONFIG_HAMRADIO is not set
-+# CONFIG_CAN is not set
-+# CONFIG_IRDA is not set
-+# CONFIG_BT is not set
-+# CONFIG_AF_RXRPC is not set
-+
-+#
-+# Wireless
-+#
-+# CONFIG_CFG80211 is not set
-+# CONFIG_WIRELESS_EXT is not set
-+# CONFIG_MAC80211 is not set
-+# CONFIG_IEEE80211 is not set
-+# CONFIG_RFKILL is not set
-+# CONFIG_NET_9P is not set
-+
-+#
-+# Device Drivers
-+#
-+
-+#
-+# Generic Driver Options
-+#
-+CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
-+# CONFIG_STANDALONE is not set
-+CONFIG_PREVENT_FIRMWARE_BUILD=y
-+CONFIG_FW_LOADER=y
-+# CONFIG_DEBUG_DRIVER is not set
-+# CONFIG_DEBUG_DEVRES is not set
-+# CONFIG_SYS_HYPERVISOR is not set
-+# CONFIG_CONNECTOR is not set
-+# CONFIG_MTD is not set
-+# CONFIG_PARPORT is not set
-+CONFIG_BLK_DEV=y
-+# CONFIG_BLK_DEV_COW_COMMON is not set
-+CONFIG_BLK_DEV_LOOP=y
-+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
-+# CONFIG_BLK_DEV_NBD is not set
-+CONFIG_BLK_DEV_RAM=y
-+CONFIG_BLK_DEV_RAM_COUNT=16
-+CONFIG_BLK_DEV_RAM_SIZE=64000
-+# CONFIG_BLK_DEV_XIP is not set
-+# CONFIG_CDROM_PKTCDVD is not set
-+# CONFIG_ATA_OVER_ETH is not set
-+CONFIG_MISC_DEVICES=y
-+CONFIG_COLDFIRE_SEC=y
-+CONFIG_SEC_DEVICE=y
-+# CONFIG_EEPROM_93CX6 is not set
-+# CONFIG_ENCLOSURE_SERVICES is not set
-+CONFIG_HAVE_IDE=y
-+# CONFIG_IDE is not set
-+
-+#
-+# SCSI device support
-+#
-+# CONFIG_RAID_ATTRS is not set
-+CONFIG_SCSI=y
-+CONFIG_SCSI_DMA=y
-+# CONFIG_SCSI_TGT is not set
-+# CONFIG_SCSI_NETLINK is not set
-+CONFIG_SCSI_PROC_FS=y
-+
-+#
-+# SCSI support type (disk, tape, CD-ROM)
-+#
-+CONFIG_BLK_DEV_SD=y
-+# CONFIG_CHR_DEV_ST is not set
-+# CONFIG_CHR_DEV_OSST is not set
-+# CONFIG_BLK_DEV_SR is not set
-+# CONFIG_CHR_DEV_SG is not set
-+# CONFIG_CHR_DEV_SCH is not set
-+
-+#
-+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
-+#
-+CONFIG_SCSI_MULTI_LUN=y
-+# CONFIG_SCSI_CONSTANTS is not set
-+# CONFIG_SCSI_LOGGING is not set
-+# CONFIG_SCSI_SCAN_ASYNC is not set
-+CONFIG_SCSI_WAIT_SCAN=m
-+
-+#
-+# SCSI Transports
-+#
-+# CONFIG_SCSI_SPI_ATTRS is not set
-+# CONFIG_SCSI_FC_ATTRS is not set
-+# CONFIG_SCSI_ISCSI_ATTRS is not set
-+# CONFIG_SCSI_SAS_LIBSAS is not set
-+# CONFIG_SCSI_SRP_ATTRS is not set
-+# CONFIG_SCSI_LOWLEVEL is not set
-+# CONFIG_ATA is not set
-+# CONFIG_MD is not set
-+CONFIG_NETDEVICES=y
-+# CONFIG_NETDEVICES_MULTIQUEUE is not set
-+# CONFIG_DUMMY is not set
-+# CONFIG_BONDING is not set
-+# CONFIG_MACVLAN is not set
-+# CONFIG_EQUALIZER is not set
-+# CONFIG_TUN is not set
-+# CONFIG_VETH is not set
-+# CONFIG_PHYLIB is not set
-+CONFIG_NET_ETHERNET=y
-+CONFIG_MII=y
-+CONFIG_FEC_548x=y
-+CONFIG_FEC_548x_AUTO_NEGOTIATION=y
-+# CONFIG_FEC_548x_ENABLE_FEC2 is not set
-+# CONFIG_ENC28J60 is not set
-+# CONFIG_IBM_NEW_EMAC_ZMII is not set
-+# CONFIG_IBM_NEW_EMAC_RGMII is not set
-+# CONFIG_IBM_NEW_EMAC_TAH is not set
-+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-+# CONFIG_B44 is not set
-+# CONFIG_NETDEV_1000 is not set
-+# CONFIG_NETDEV_10000 is not set
-+
-+#
-+# Wireless LAN
-+#
-+# CONFIG_WLAN_PRE80211 is not set
-+# CONFIG_WLAN_80211 is not set
-+# CONFIG_WAN is not set
-+# CONFIG_PPP is not set
-+# CONFIG_SLIP is not set
-+# CONFIG_NETCONSOLE is not set
-+# CONFIG_NETPOLL is not set
-+# CONFIG_NET_POLL_CONTROLLER is not set
-+# CONFIG_ISDN is not set
-+# CONFIG_PHONE is not set
-+
-+#
-+# Input device support
-+#
-+CONFIG_INPUT=y
-+# CONFIG_INPUT_FF_MEMLESS is not set
-+# CONFIG_INPUT_POLLDEV is not set
-+
-+#
-+# Userland interfaces
-+#
-+CONFIG_INPUT_MOUSEDEV=y
-+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
-+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
-+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-+# CONFIG_INPUT_JOYDEV is not set
-+CONFIG_INPUT_EVDEV=y
-+# CONFIG_INPUT_EVBUG is not set
-+
-+#
-+# Input Device Drivers
-+#
-+CONFIG_INPUT_KEYBOARD=y
-+# CONFIG_KEYBOARD_ATKBD is not set
-+# CONFIG_KEYBOARD_SUNKBD is not set
-+# CONFIG_KEYBOARD_LKKBD is not set
-+# CONFIG_KEYBOARD_XTKBD is not set
-+# CONFIG_KEYBOARD_NEWTON is not set
-+# CONFIG_KEYBOARD_STOWAWAY is not set
-+# CONFIG_INPUT_MOUSE is not set
-+# CONFIG_INPUT_JOYSTICK is not set
-+# CONFIG_INPUT_TABLET is not set
-+# CONFIG_INPUT_TOUCHSCREEN is not set
-+# CONFIG_INPUT_MISC is not set
-+
-+#
-+# Hardware I/O ports
-+#
-+CONFIG_SERIO=y
-+CONFIG_SERIO_SERPORT=y
-+# CONFIG_SERIO_RAW is not set
-+# CONFIG_GAMEPORT is not set
-+
-+#
-+# Character devices
-+#
-+CONFIG_VT=y
-+CONFIG_VT_CONSOLE=y
-+CONFIG_HW_CONSOLE=y
-+# CONFIG_VT_HW_CONSOLE_BINDING is not set
-+# CONFIG_SERIAL_NONSTANDARD is not set
-+
-+#
-+# Serial drivers
-+#
-+# CONFIG_SERIAL_8250 is not set
-+
-+#
-+# Non-8250 serial port support
-+#
-+CONFIG_SERIAL_COLDFIRE=y
-+# CONFIG_SERIAL_COLDFIRE_IRDA is not set
-+# CONFIG_SERIAL_MCF is not set
-+CONFIG_UNIX98_PTYS=y
-+# CONFIG_LEGACY_PTYS is not set
-+# CONFIG_IPMI_HANDLER is not set
-+# CONFIG_HW_RANDOM is not set
-+# CONFIG_GEN_RTC is not set
-+# CONFIG_R3964 is not set
-+# CONFIG_RAW_DRIVER is not set
-+# CONFIG_TCG_TPM is not set
-+CONFIG_I2C=y
-+CONFIG_I2C_BOARDINFO=y
-+# CONFIG_I2C_CHARDEV is not set
-+
-+#
-+# I2C Algorithms
-+#
-+# CONFIG_I2C_ALGOBIT is not set
-+# CONFIG_I2C_ALGOPCF is not set
-+# CONFIG_I2C_ALGOPCA is not set
-+
-+#
-+# I2C Hardware Bus support
-+#
-+CONFIG_I2C_MCF548x=y
-+# CONFIG_I2C_MCF is not set
-+# CONFIG_I2C_OCORES is not set
-+# CONFIG_I2C_PARPORT_LIGHT is not set
-+# CONFIG_I2C_SIMTEC is not set
-+# CONFIG_I2C_TAOS_EVM is not set
-+# CONFIG_I2C_STUB is not set
-+
-+#
-+# Miscellaneous I2C Chip support
-+#
-+# CONFIG_DS1682 is not set
-+# CONFIG_SENSORS_EEPROM is not set
-+# CONFIG_SENSORS_PCF8574 is not set
-+# CONFIG_PCF8575 is not set
-+# CONFIG_SENSORS_PCF8591 is not set
-+# CONFIG_TPS65010 is not set
-+# CONFIG_SENSORS_MAX6875 is not set
-+# CONFIG_SENSORS_TSL2550 is not set
-+# CONFIG_I2C_DEBUG_CORE is not set
-+# CONFIG_I2C_DEBUG_ALGO is not set
-+# CONFIG_I2C_DEBUG_BUS is not set
-+# CONFIG_I2C_DEBUG_CHIP is not set
-+
-+#
-+# SPI support
-+#
-+CONFIG_SPI=y
-+CONFIG_SPI_DEBUG=y
-+# CONFIG_COLDFIRE_EDMA is not set
-+CONFIG_SPI_MASTER=y
-+
-+#
-+# SPI Master Controller Drivers
-+#
-+# CONFIG_SPI_BITBANG is not set
-+CONFIG_SPI_COLDFIRE=y
-+
-+#
-+# SPI Protocol Masters
-+#
-+# CONFIG_SPI_AT25 is not set
-+# CONFIG_SPI_SPIDEV is not set
-+# CONFIG_SPI_TLE62X0 is not set
-+# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set
-+# CONFIG_W1 is not set
-+# CONFIG_POWER_SUPPLY is not set
-+# CONFIG_HWMON is not set
-+# CONFIG_THERMAL is not set
-+# CONFIG_WATCHDOG is not set
-+
-+#
-+# Sonics Silicon Backplane
-+#
-+CONFIG_SSB_POSSIBLE=y
-+# CONFIG_SSB is not set
-+
-+#
-+# Multifunction device drivers
-+#
-+# CONFIG_MFD_SM501 is not set
-+
-+#
-+# Multimedia devices
-+#
-+# CONFIG_VIDEO_DEV is not set
-+# CONFIG_DVB_CORE is not set
-+CONFIG_DAB=y
-+
-+#
-+# Graphics support
-+#
-+# CONFIG_VGASTATE is not set
-+CONFIG_VIDEO_OUTPUT_CONTROL=m
-+# CONFIG_FB is not set
-+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
-+
-+#
-+# Display device support
-+#
-+# CONFIG_DISPLAY_SUPPORT is not set
-+
-+#
-+# Console display driver support
-+#
-+CONFIG_DUMMY_CONSOLE=y
-+
-+#
-+# Sound
-+#
-+# CONFIG_SOUND is not set
-+CONFIG_HID_SUPPORT=y
-+CONFIG_HID=y
-+CONFIG_HID_DEBUG=y
-+# CONFIG_HIDRAW is not set
-+# CONFIG_USB_SUPPORT is not set
-+# CONFIG_MMC is not set
-+# CONFIG_MEMSTICK is not set
-+# CONFIG_NEW_LEDS is not set
-+# CONFIG_RTC_CLASS is not set
-+
-+#
-+# Userspace I/O
-+#
-+# CONFIG_UIO is not set
-+
-+#
-+# Character devices
-+#
-+# CONFIG_SERIAL_CONSOLE is not set
-+
-+#
-+# File systems
-+#
-+CONFIG_EXT2_FS=y
-+# CONFIG_EXT2_FS_XATTR is not set
-+# CONFIG_EXT2_FS_XIP is not set
-+CONFIG_EXT3_FS=y
-+CONFIG_EXT3_FS_XATTR=y
-+# CONFIG_EXT3_FS_POSIX_ACL is not set
-+# CONFIG_EXT3_FS_SECURITY is not set
-+# CONFIG_EXT4DEV_FS is not set
-+CONFIG_JBD=y
-+CONFIG_FS_MBCACHE=y
-+# CONFIG_REISERFS_FS is not set
-+# CONFIG_JFS_FS is not set
-+# CONFIG_FS_POSIX_ACL is not set
-+# CONFIG_XFS_FS is not set
-+# CONFIG_GFS2_FS is not set
-+# CONFIG_OCFS2_FS is not set
-+CONFIG_DNOTIFY=y
-+# CONFIG_INOTIFY is not set
-+# CONFIG_QUOTA is not set
-+# CONFIG_AUTOFS_FS is not set
-+# CONFIG_AUTOFS4_FS is not set
-+# CONFIG_FUSE_FS is not set
-+
-+#
-+# CD-ROM/DVD Filesystems
-+#
-+# CONFIG_ISO9660_FS is not set
-+# CONFIG_UDF_FS is not set
-+
-+#
-+# DOS/FAT/NT Filesystems
-+#
-+CONFIG_FAT_FS=y
-+CONFIG_MSDOS_FS=y
-+CONFIG_VFAT_FS=y
-+CONFIG_FAT_DEFAULT_CODEPAGE=437
-+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
-+CONFIG_NTFS_FS=y
-+# CONFIG_NTFS_DEBUG is not set
-+CONFIG_NTFS_RW=y
-+
-+#
-+# Pseudo filesystems
-+#
-+CONFIG_PROC_FS=y
-+# CONFIG_PROC_KCORE is not set
-+CONFIG_PROC_SYSCTL=y
-+CONFIG_SYSFS=y
-+CONFIG_TMPFS=y
-+# CONFIG_TMPFS_POSIX_ACL is not set
-+# CONFIG_HUGETLB_PAGE is not set
-+# CONFIG_CONFIGFS_FS is not set
-+
-+#
-+# Miscellaneous filesystems
-+#
-+# CONFIG_ADFS_FS is not set
-+# CONFIG_AFFS_FS is not set
-+# CONFIG_HFS_FS is not set
-+# CONFIG_HFSPLUS_FS is not set
-+# CONFIG_BEFS_FS is not set
-+# CONFIG_BFS_FS is not set
-+# CONFIG_EFS_FS is not set
-+# CONFIG_CRAMFS is not set
-+# CONFIG_VXFS_FS is not set
-+CONFIG_MINIX_FS=y
-+# CONFIG_HPFS_FS is not set
-+# CONFIG_QNX4FS_FS is not set
-+CONFIG_ROMFS_FS=y
-+# CONFIG_SYSV_FS is not set
-+# CONFIG_UFS_FS is not set
-+CONFIG_NETWORK_FILESYSTEMS=y
-+CONFIG_NFS_FS=y
-+# CONFIG_NFS_V3 is not set
-+# CONFIG_NFS_V4 is not set
-+# CONFIG_NFS_DIRECTIO is not set
-+# CONFIG_NFSD is not set
-+CONFIG_ROOT_NFS=y
-+CONFIG_LOCKD=y
-+CONFIG_NFS_COMMON=y
-+CONFIG_SUNRPC=y
-+# CONFIG_SUNRPC_BIND34 is not set
-+# CONFIG_RPCSEC_GSS_KRB5 is not set
-+# CONFIG_RPCSEC_GSS_SPKM3 is not set
-+# CONFIG_SMB_FS is not set
-+# CONFIG_CIFS is not set
-+# CONFIG_NCP_FS is not set
-+# CONFIG_CODA_FS is not set
-+# CONFIG_AFS_FS is not set
-+
-+#
-+# Partition Types
-+#
-+CONFIG_PARTITION_ADVANCED=y
-+# CONFIG_ACORN_PARTITION is not set
-+# CONFIG_OSF_PARTITION is not set
-+# CONFIG_AMIGA_PARTITION is not set
-+# CONFIG_ATARI_PARTITION is not set
-+# CONFIG_MAC_PARTITION is not set
-+CONFIG_MSDOS_PARTITION=y
-+# CONFIG_BSD_DISKLABEL is not set
-+# CONFIG_MINIX_SUBPARTITION is not set
-+# CONFIG_SOLARIS_X86_PARTITION is not set
-+# CONFIG_UNIXWARE_DISKLABEL is not set
-+# CONFIG_LDM_PARTITION is not set
-+# CONFIG_SGI_PARTITION is not set
-+# CONFIG_ULTRIX_PARTITION is not set
-+# CONFIG_SUN_PARTITION is not set
-+# CONFIG_KARMA_PARTITION is not set
-+# CONFIG_EFI_PARTITION is not set
-+# CONFIG_SYSV68_PARTITION is not set
-+CONFIG_NLS=y
-+CONFIG_NLS_DEFAULT="iso8859-1"
-+CONFIG_NLS_CODEPAGE_437=y
-+# CONFIG_NLS_CODEPAGE_737 is not set
-+# CONFIG_NLS_CODEPAGE_775 is not set
-+# CONFIG_NLS_CODEPAGE_850 is not set
-+# CONFIG_NLS_CODEPAGE_852 is not set
-+# CONFIG_NLS_CODEPAGE_855 is not set
-+# CONFIG_NLS_CODEPAGE_857 is not set
-+# CONFIG_NLS_CODEPAGE_860 is not set
-+# CONFIG_NLS_CODEPAGE_861 is not set
-+# CONFIG_NLS_CODEPAGE_862 is not set
-+# CONFIG_NLS_CODEPAGE_863 is not set
-+# CONFIG_NLS_CODEPAGE_864 is not set
-+# CONFIG_NLS_CODEPAGE_865 is not set
-+# CONFIG_NLS_CODEPAGE_866 is not set
-+# CONFIG_NLS_CODEPAGE_869 is not set
-+# CONFIG_NLS_CODEPAGE_936 is not set
-+# CONFIG_NLS_CODEPAGE_950 is not set
-+# CONFIG_NLS_CODEPAGE_932 is not set
-+# CONFIG_NLS_CODEPAGE_949 is not set
-+# CONFIG_NLS_CODEPAGE_874 is not set
-+# CONFIG_NLS_ISO8859_8 is not set
-+# CONFIG_NLS_CODEPAGE_1250 is not set
-+# CONFIG_NLS_CODEPAGE_1251 is not set
-+# CONFIG_NLS_ASCII is not set
-+CONFIG_NLS_ISO8859_1=y
-+# CONFIG_NLS_ISO8859_2 is not set
-+# CONFIG_NLS_ISO8859_3 is not set
-+# CONFIG_NLS_ISO8859_4 is not set
-+# CONFIG_NLS_ISO8859_5 is not set
-+# CONFIG_NLS_ISO8859_6 is not set
-+# CONFIG_NLS_ISO8859_7 is not set
-+# CONFIG_NLS_ISO8859_9 is not set
-+# CONFIG_NLS_ISO8859_13 is not set
-+# CONFIG_NLS_ISO8859_14 is not set
-+# CONFIG_NLS_ISO8859_15 is not set
-+# CONFIG_NLS_KOI8_R is not set
-+# CONFIG_NLS_KOI8_U is not set
-+CONFIG_NLS_UTF8=y
-+# CONFIG_DLM is not set
-+
-+#
-+# Kernel hacking
-+#
-+# CONFIG_PRINTK_TIME is not set
-+CONFIG_ENABLE_WARN_DEPRECATED=y
-+# CONFIG_ENABLE_MUST_CHECK is not set
-+# CONFIG_MAGIC_SYSRQ is not set
-+# CONFIG_UNUSED_SYMBOLS is not set
-+# CONFIG_DEBUG_FS is not set
-+# CONFIG_HEADERS_CHECK is not set
-+CONFIG_DEBUG_KERNEL=y
-+CONFIG_DETECT_SOFTLOCKUP=y
-+CONFIG_SCHED_DEBUG=y
-+# CONFIG_SCHEDSTATS is not set
-+# CONFIG_TIMER_STATS is not set
-+CONFIG_DEBUG_SLAB=y
-+# CONFIG_DEBUG_SLAB_LEAK is not set
-+# CONFIG_DEBUG_RT_MUTEXES is not set
-+# CONFIG_RT_MUTEX_TESTER is not set
-+# CONFIG_DEBUG_SPINLOCK is not set
-+# CONFIG_DEBUG_MUTEXES is not set
-+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
-+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
-+# CONFIG_DEBUG_KOBJECT is not set
-+CONFIG_DEBUG_BUGVERBOSE=y
-+CONFIG_DEBUG_INFO=y
-+# CONFIG_DEBUG_VM is not set
-+# CONFIG_DEBUG_LIST is not set
-+# CONFIG_DEBUG_SG is not set
-+# CONFIG_FRAME_POINTER is not set
-+# CONFIG_BOOT_PRINTK_DELAY is not set
-+# CONFIG_RCU_TORTURE_TEST is not set
-+# CONFIG_BACKTRACE_SELF_TEST is not set
-+# CONFIG_FAULT_INJECTION is not set
-+# CONFIG_SAMPLES is not set
-+CONFIG_BOOTPARAM=y
-+CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
-+
-+#
-+# Security options
-+#
-+# CONFIG_KEYS is not set
-+# CONFIG_SECURITY is not set
-+# CONFIG_SECURITY_FILE_CAPABILITIES is not set
-+CONFIG_CRYPTO=y
-+CONFIG_CRYPTO_ALGAPI=y
-+CONFIG_CRYPTO_AEAD=y
-+CONFIG_CRYPTO_BLKCIPHER=y
-+# CONFIG_CRYPTO_SEQIV is not set
-+CONFIG_CRYPTO_HASH=y
-+CONFIG_CRYPTO_MANAGER=y
-+CONFIG_CRYPTO_HMAC=y
-+# CONFIG_CRYPTO_XCBC is not set
-+# CONFIG_CRYPTO_NULL is not set
-+# CONFIG_CRYPTO_MD4 is not set
-+CONFIG_CRYPTO_MD5=y
-+CONFIG_CRYPTO_SHA1=y
-+# CONFIG_CRYPTO_SHA256 is not set
-+# CONFIG_CRYPTO_SHA512 is not set
-+# CONFIG_CRYPTO_WP512 is not set
-+# CONFIG_CRYPTO_TGR192 is not set
-+# CONFIG_CRYPTO_GF128MUL is not set
-+# CONFIG_CRYPTO_ECB is not set
-+CONFIG_CRYPTO_CBC=y
-+# CONFIG_CRYPTO_PCBC is not set
-+# CONFIG_CRYPTO_LRW is not set
-+# CONFIG_CRYPTO_XTS is not set
-+# CONFIG_CRYPTO_CTR is not set
-+# CONFIG_CRYPTO_GCM is not set
-+# CONFIG_CRYPTO_CCM is not set
-+# CONFIG_CRYPTO_CRYPTD is not set
-+CONFIG_CRYPTO_DES=y
-+# CONFIG_CRYPTO_FCRYPT is not set
-+# CONFIG_CRYPTO_BLOWFISH is not set
-+# CONFIG_CRYPTO_TWOFISH is not set
-+# CONFIG_CRYPTO_SERPENT is not set
-+# CONFIG_CRYPTO_AES is not set
-+# CONFIG_CRYPTO_CAST5 is not set
-+# CONFIG_CRYPTO_CAST6 is not set
-+# CONFIG_CRYPTO_TEA is not set
-+# CONFIG_CRYPTO_ARC4 is not set
-+# CONFIG_CRYPTO_KHAZAD is not set
-+# CONFIG_CRYPTO_ANUBIS is not set
-+# CONFIG_CRYPTO_SEED is not set
-+# CONFIG_CRYPTO_SALSA20 is not set
-+# CONFIG_CRYPTO_DEFLATE is not set
-+# CONFIG_CRYPTO_MICHAEL_MIC is not set
-+# CONFIG_CRYPTO_CRC32C is not set
-+# CONFIG_CRYPTO_CAMELLIA is not set
-+CONFIG_CRYPTO_TEST=m
-+CONFIG_CRYPTO_AUTHENC=y
-+# CONFIG_CRYPTO_LZO is not set
-+# CONFIG_CRYPTO_HW is not set
-+
-+#
-+# Library routines
-+#
-+CONFIG_BITREVERSE=y
-+CONFIG_CRC_CCITT=y
-+CONFIG_CRC16=y
-+# CONFIG_CRC_ITU_T is not set
-+CONFIG_CRC32=y
-+# CONFIG_CRC7 is not set
-+CONFIG_LIBCRC32C=y
-+CONFIG_PLIST=y
-+CONFIG_HAS_IOMEM=y
-+CONFIG_HAS_IOPORT=y
-+CONFIG_HAS_DMA=y
---- a/arch/m68k/Kconfig
-+++ b/arch/m68k/Kconfig
-@@ -11,6 +11,14 @@ config MMU
-       bool
-       default y
-+config GENERIC_TIME
-+        bool
-+        default n
-+
-+config GENERIC_CLOCKEVENTS
-+        bool
-+        default n
-+
- config RWSEM_GENERIC_SPINLOCK
-       bool
-       default y
-@@ -48,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC
-       default y
- config NO_IOPORT
--      def_bool y
-+      def_bool !(M5445X || M547X_8X)
- config NO_DMA
-       def_bool SUN3
-@@ -119,6 +127,29 @@ config SUN3
-         If you don't want to compile a kernel exclusively for a Sun 3, say N.
-+config COLDFIRE
-+      bool "ColdFire V4e support"
-+      default y
-+      select CFV4E
-+      help
-+        Say Y if you want to build a kernel to run on one of the ColdFire
-+        V4e boards.
-+
-+config CFV4E
-+      bool
-+      depends on COLDFIRE
-+      select MMU_CFV4E if MMU
-+      default y
-+
-+config MCD_DMA
-+      bool "ColdFire MCD DMA support"
-+      depends on M547X_8X
-+      default y
-+      help
-+        This enables support for the ColdFire 547x/548x family
-+        multichannel DMA support.  Many drivers need it.
-+        If you want it, say Y
-+
- config AMIGA
-       bool "Amiga support"
-       depends on !MMU_SUN3
-@@ -144,9 +175,9 @@ config HADES
-         to use this kernel on a Hades, say Y here; otherwise say N.
- config PCI
--      bool
--      depends on HADES
--      default y
-+      bool "PCI bus support"
-+      depends on HADES || M54455 || M547X_8X
-+      default n
-       help
-         Find out whether you have a PCI motherboard. PCI is the name of a
-         bus system, i.e. the way the CPU talks to the other stuff inside
-@@ -294,14 +325,142 @@ config M68060
-         If you anticipate running this kernel on a computer with a MC68060
-         processor, say Y. Otherwise, say N.
-+config M5445X
-+      bool "MCF5445x support"
-+      depends on COLDFIRE
-+      help
-+          This option will add support for the MCF5445 processor with mmu.
-+
-+config M54451
-+      bool
-+      depends on M5445X
-+      default n
-+
-+config M54455
-+      bool
-+      depends on M5445X
-+      default n
-+
-+choice
-+      prompt "Model"
-+      depends on M5445X
-+      default M54451EVB
-+      config M54451EVB
-+              bool "M54451EVB"
-+              select M54451
-+      config M54455EVB
-+              bool "M54455EVB"
-+              select M54455
-+endchoice
-+
-+
-+config M547X_8X
-+      bool "MCF547x/MCF548x support"
-+      depends on COLDFIRE
-+      help
-+          This option will add support for the MCF547x/MCF548x processor with mmu.
-+
-+config M547X
-+      bool
-+      depends on M547X_8X
-+      default n
-+
-+config M548X
-+      bool
-+      depends on M547X_8X
-+      default n
-+
-+choice
-+      prompt "Model"
-+      depends on M547X_8X
-+      default M5485CFE
-+      config M5475AFE
-+              bool "MCF5475AFE"
-+              select M547X
-+      config M5475BFE
-+              bool "MCF5475BFE"
-+              select M547X
-+      config M5475CFE
-+              bool "MCF5475CFE"
-+              select M547X
-+      config M5475DFE
-+              bool "MCF5475DFE"
-+              select M547X
-+      config M5475EFE
-+              bool "MCF5475EFE"
-+              select M547X
-+      config M5475FFE
-+              bool "MCF5475FFE"
-+              select M547X
-+
-+      config M5485AFE
-+              bool "MCF5485AFE"
-+              select M548X
-+      config M5485BFE
-+              bool "MCF5485BFE"
-+              select M548X
-+      config M5485CFE
-+              bool "MCF5485CFE"
-+              select M548X
-+      config M5485DFE
-+              bool "MCF5485DFE"
-+              select M548X
-+      config M5485EFE
-+              bool "MCF5485EFE"
-+              select M548X
-+      config M5485FFE
-+              bool "MCF5485FFE"
-+              select M548X
-+
-+endchoice
-+
-+config MCFCLK
-+      int
-+      default 266666666 if M54455EVB
-+      default 240000000 if M54451EVB
-+      default 266000000 if M547X
-+      default 200000000 if M548X
-+      help
-+        Coldfire System clock.
-+
-+config MCF_USER_HALT
-+      bool "Coldfire User Halt Enable"
-+      depends on M5445X || M547X_8X
-+      default n
-+      help
-+        Enables the HALT instruction in User Mode.
-+
- config MMU_MOTOROLA
-       bool
--      depends on MMU && !MMU_SUN3
-+      depends on MMU && !MMU_SUN3 && !COLDFIRE
-       default y
- config MMU_SUN3
-       bool
-+config MMU_CFV4E
-+      bool
-+
-+config SDRAM_BASE
-+      hex
-+      depends on COLDFIRE
-+      default 0x40000000 if M5445X
-+      default 0x00000000 if M547X_8X
-+
-+config SDRAM_SIZE
-+      hex
-+      depends on COLDFIRE
-+      default 0x08000000 if M54451EVB
-+      default 0x10000000 if M54455EVB
-+      default 0x04000000 if M547X_8X
-+
-+config NOR_FLASH_BASE
-+      hex "NOR Flash Base Address"
-+      depends on COLDFIRE
-+      default 0x00000000 if M54451EVB
-+      default 0x00000000 if M54455EVB
-+      default 0xE0000000 if M547X_8X
-+
- config M68KFPU_EMU
-       bool "Math emulation support (EXPERIMENTAL)"
-       depends on EXPERIMENTAL
-@@ -468,6 +627,14 @@ config ZONE_DMA
- source "drivers/pci/Kconfig"
- source "drivers/zorro/Kconfig"
-+endmenu
-+
-+menu "Power management options"
-+
-+config PM
-+      bool "Power Management support"
-+      help
-+        Support processor power management modes
- endmenu
-@@ -647,7 +814,7 @@ config DN_SERIAL
- config SERIAL_CONSOLE
-       bool "Support for serial port console"
--      depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
-+      depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO || COLDFIRE) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL || SERIAL_COLDFIRE)
-       ---help---
-         If you say Y here, it will be possible to use a serial port as the
-         system console (the system console is the device which receives all
---- a/arch/m68k/Kconfig.debug
-+++ b/arch/m68k/Kconfig.debug
-@@ -2,4 +2,13 @@ menu "Kernel hacking"
- source "lib/Kconfig.debug"
-+config BOOTPARAM
-+      bool 'Compiled-in Kernel Boot Parameter'
-+      depends on COLDFIRE
-+
-+config BOOTPARAM_STRING
-+      string 'Kernel Boot Parameter'
-+      default 'console=ttyS0,115200'
-+      depends on BOOTPARAM
-+
- endmenu
---- a/arch/m68k/kernel/asm-offsets.c
-+++ b/arch/m68k/kernel/asm-offsets.c
-@@ -58,8 +58,15 @@ int main(void)
-       DEFINE(PT_A2, offsetof(struct pt_regs, a2));
-       DEFINE(PT_PC, offsetof(struct pt_regs, pc));
-       DEFINE(PT_SR, offsetof(struct pt_regs, sr));
-+#ifdef CONFIG_COLDFIRE
-+      /* Need to get the context out of struct mm for ASID setting */
-+      DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context));
-+      /* Coldfire exception frame has vector *before* pc */
-+      DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4);
-+#else
-       /* bitfields are a bit difficult */
-       DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4);
-+#endif
-       /* offsets into the irq_handler struct */
-       DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler));
---- /dev/null
-+++ b/arch/m68k/kernel/bios32_mcf548x.c
-@@ -0,0 +1,631 @@
-+/*
-+ * bios32.c - PCI BIOS functions for m68k systems.
-+ *
-+ * Written by Wout Klaren.
-+ *
-+ * Based on the DEC Alpha bios32.c by Dave Rusling and David Mosberger.
-+ */
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+
-+#if 0
-+# define DBG_DEVS(args)               printk args
-+#else
-+# define DBG_DEVS(args)
-+#endif
-+
-+#ifdef CONFIG_PCI
-+
-+/*
-+ * PCI support for Linux/m68k. Currently only the Hades is supported.
-+ *
-+ * The support for PCI bridges in the DEC Alpha version has
-+ * been removed in this version.
-+ */
-+
-+#include <linux/pci.h>
-+#include <linux/slab.h>
-+#include <linux/mm.h>
-+
-+#include <asm/io.h>
-+#include <asm/pci.h>
-+#include <asm/uaccess.h>
-+
-+#define KB            1024
-+#define MB            (1024*KB)
-+#define GB            (1024*MB)
-+
-+#define MAJOR_REV     0
-+#define MINOR_REV     5
-+
-+/*
-+ * Align VAL to ALIGN, which must be a power of two.
-+ */
-+
-+#define MAX(val1, val2)               (((val1) > (val2)) ? val1 : val2)
-+
-+/*
-+ * Offsets relative to the I/O and memory base addresses from where resources
-+ * are allocated.
-+ */
-+
-+#ifdef CONFIG_COLDFIRE
-+#define IO_ALLOC_OFFSET               0x00000100
-+#define MEM_ALLOC_OFFSET      0x00000000
-+#else /* CONFIG_COLDFIRE */
-+#define IO_ALLOC_OFFSET               0x00004000
-+#define MEM_ALLOC_OFFSET      0x04000000
-+#endif /* CONFIG_COLDFIRE */
-+
-+/*
-+ * Declarations of hardware specific initialisation functions.
-+ */
-+
-+extern struct pci_bus_info *init_hades_pci(void);
-+
-+/*
-+ * Bus info structure of the PCI bus. A pointer to this structure is
-+ * put in the sysdata member of the pci_bus structure.
-+ */
-+
-+static struct pci_bus_info *bus_info;
-+
-+static int pci_modify = 1;            /* If set, layout the PCI bus ourself. */
-+static int skip_vga;                  /* If set do not modify base addresses
-+                                         of vga cards.*/
-+static int disable_pci_burst;         /* If set do not allow PCI bursts. */
-+
-+static unsigned int io_base;
-+static unsigned int mem_base;
-+
-+/*
-+ * static void disable_dev(struct pci_dev *dev)
-+ *
-+ * Disable PCI device DEV so that it does not respond to I/O or memory
-+ * accesses.
-+ *
-+ * Parameters:
-+ *
-+ * dev        - device to disable.
-+ */
-+
-+static void __init disable_dev(struct pci_dev *dev)
-+{
-+      unsigned short cmd;
-+
-+      if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
-+           (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
-+           (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga)
-+              return;
-+
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+
-+      cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER);
-+      pci_write_config_word(dev, PCI_COMMAND, cmd);
-+}
-+
-+/* Stolen from pcibios_enable_resources/i386 */
-+int pcibios_enable_device(struct pci_dev *dev, int mask)
-+{
-+      u16 cmd, old_cmd;
-+      int idx;
-+      struct resource *r;
-+
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+      old_cmd = cmd;
-+      for(idx=0; idx<6; idx++) {
-+              /* Only set up the requested stuff */
-+              if (!(mask & (1<<idx)))
-+                      continue;
-+
-+              r = &dev->resource[idx];
-+              if (!r->start && r->end) {
-+                      printk("PCI: Device %s not available because"
-+                              " of resource collisions\n", dev->dev.bus_id);
-+                      return -EINVAL;
-+              }
-+              if (r->flags & IORESOURCE_IO)
-+                      cmd |= PCI_COMMAND_IO;
-+              if (r->flags & IORESOURCE_MEM)
-+                      cmd |= PCI_COMMAND_MEMORY;
-+      }
-+      if (dev->resource[PCI_ROM_RESOURCE].start)
-+              cmd |= PCI_COMMAND_MEMORY;
-+      if (cmd != old_cmd) {
-+              printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->dev.bus_id, old_cmd, cmd);
-+              pci_write_config_word(dev, PCI_COMMAND, cmd);
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * static void layout_dev(struct pci_dev *dev)
-+ *
-+ * Layout memory and I/O for a device.
-+ *
-+ * Parameters:
-+ *
-+ * device     - device to layout memory and I/O for.
-+ */
-+
-+static void __init layout_dev(struct pci_dev *dev)
-+{
-+      unsigned short cmd;
-+      unsigned int base, mask, size, reg;
-+      unsigned int alignto;
-+      int i;
-+
-+      /*
-+       * Skip video cards if requested.
-+       */
-+      if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
-+           (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
-+           (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga){
-+              printk("%s: VGA\n",__FUNCTION__);
-+              return;
-+      }
-+      pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+
-+      for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++)
-+      {
-+              /*
-+               * Figure out how much space and of what type this
-+               * device wants.
-+               */
-+
-+              pci_write_config_dword(dev, reg, 0xffffffff);
-+              pci_read_config_dword(dev, reg, &base);
-+              if (!base)
-+              {
-+                      /* this base-address register is unused */
-+                      dev->resource[i].start = 0;
-+                      dev->resource[i].end = 0;
-+                      dev->resource[i].flags = 0;
-+                      continue;
-+              }
-+
-+              /*
-+               * We've read the base address register back after
-+               * writing all ones and so now we must decode it.
-+               */
-+      
-+              if (base & PCI_BASE_ADDRESS_SPACE_IO)
-+              {
-+                      /*
-+                       * I/O space base address register.
-+                       */
-+
-+                      cmd |= PCI_COMMAND_IO;
-+
-+                      base &= PCI_BASE_ADDRESS_IO_MASK;
-+                      mask = (~base << 1) | 0x1;
-+                      size = (mask & base) & 0xffffffff;
-+
-+                      /*
-+                       * Align to multiple of size of minimum base.
-+                       */
-+
-+#ifdef CONFIG_COLDFIRE
-+                      alignto = MAX(PAGE_SIZE, size) ;
-+#else /* CONFIG_COLDFIRE */
-+                      alignto = MAX(0x040, size) ;
-+#endif /* CONFIG_COLDFIRE */
-+                      base = ALIGN(io_base, alignto);
-+                      io_base = base + size;
-+                      pci_write_config_dword(dev, reg, base | PCI_BASE_ADDRESS_SPACE_IO);
-+
-+                      dev->resource[i].start = base;
-+                      dev->resource[i].end = dev->resource[i].start + size - 1;
-+                      dev->resource[i].flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO;
-+
-+                      DBG_DEVS(("layout_dev: IO address: %x\n", base));
-+              }
-+              else
-+              {
-+                      unsigned int type;
-+
-+                      /*
-+                       * Memory space base address register.
-+                       */
-+
-+                      cmd |= PCI_COMMAND_MEMORY;
-+                      type = base & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
-+                      base &= PCI_BASE_ADDRESS_MEM_MASK;
-+                      mask = (~base << 1) | 0x1;
-+                      size = (mask & base) & 0xffffffff;
-+                      switch (type)
-+                      {
-+                      case PCI_BASE_ADDRESS_MEM_TYPE_32:
-+                      case PCI_BASE_ADDRESS_MEM_TYPE_64:
-+                              break;
-+
-+                      case PCI_BASE_ADDRESS_MEM_TYPE_1M:
-+                              printk("bios32 WARNING: slot %d, function %d "
-+                                     "requests memory below 1MB---don't "
-+                                     "know how to do that.\n",
-+                                     PCI_SLOT(dev->devfn),
-+                                     PCI_FUNC(dev->devfn));
-+                              continue;
-+                      }
-+                      DBG_DEVS(("%s MEM: base %x,type %x,mask %x,size %x\n",
-+                              __FUNCTION__, base, type, mask, size));
-+                      /*
-+                       * Align to multiple of size of minimum base.
-+                       */
-+
-+                      alignto = max_t(unsigned int, 0x1000, size);
-+                      base = ALIGN(mem_base, alignto);
-+                      mem_base = base + size;
-+                      pci_write_config_dword(dev, reg, base);
-+
-+                      dev->resource[i].start = base;
-+                      dev->resource[i].end = dev->resource[i].start + size - 1;
-+                      dev->resource[i].flags = IORESOURCE_MEM;
-+                      DBG_DEVS(("%s MEM :base %x,size %x\n",
-+                              __FUNCTION__, base, size));
-+                      if (type == PCI_BASE_ADDRESS_MEM_TYPE_64)
-+                      {
-+                              /*
-+                               * 64-bit address, set the highest 32 bits
-+                               * to zero.
-+                               */
-+
-+                              reg += 4;
-+                              pci_write_config_dword(dev, reg, 0);
-+
-+                              i++;
-+                              dev->resource[i].start = 0;
-+                              dev->resource[i].end = 0;
-+                              dev->resource[i].flags = 0;
-+                              printk("%s:type == 64\n",__FUNCTION__);
-+                      }
-+              }
-+      }
-+
-+      /*
-+       * Enable device:
-+       */
-+
-+      if (dev->class >> 8 == PCI_CLASS_NOT_DEFINED ||
-+          dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA ||
-+          dev->class >> 8 == PCI_CLASS_DISPLAY_VGA ||
-+          dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)
-+      {
-+              /*
-+               * All of these (may) have I/O scattered all around
-+               * and may not use i/o-base address registers at all.
-+               * So we just have to always enable I/O to these
-+               * devices.
-+               */
-+              cmd |= PCI_COMMAND_IO;
-+      }
-+
-+      pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MASTER);
-+
-+      pci_write_config_byte(dev, PCI_LATENCY_TIMER, (disable_pci_burst) ? 0 : 32);
-+
-+      if (bus_info != NULL)
-+              bus_info->conf_device(dev);     /* Machine dependent configuration. */
-+
-+      printk(KERN_INFO "layout_dev: bus %d  slot 0x%x  VID 0x%x  DID 0x%x  class 0x%x\n",
-+              dev->bus->number, PCI_SLOT(dev->devfn),
-+              dev->vendor, dev->device, dev->class);
-+}
-+
-+/*
-+ * static void layout_bus(struct pci_bus *bus)
-+ *
-+ * Layout memory and I/O for all devices on the given bus.
-+ *
-+ * Parameters:
-+ *
-+ * bus        - bus.
-+ */
-+
-+static void __init layout_bus(struct pci_bus *bus)
-+{
-+      unsigned int bio, bmem;
-+      struct pci_dev *dev;
-+
-+      DBG_DEVS(("layout_bus: starting bus %d\n", bus->number));
-+
-+      if (list_empty(&bus->devices) && list_empty(&bus->children))
-+              return;
-+
-+      /*
-+       * Align the current bases on appropriate boundaries (4K for
-+       * IO and 1MB for memory).
-+       */
-+
-+      bio = io_base = ALIGN(io_base, 4*KB);
-+      bmem = mem_base = ALIGN(mem_base, 1*MB);
-+
-+      /*
-+       * PCI devices might have been setup by a PCI BIOS emulation
-+       * running under TOS. In these cases there is a
-+       * window during which two devices may have an overlapping
-+       * address range. To avoid this causing trouble, we first
-+       * turn off the I/O and memory address decoders for all PCI
-+       * devices.  They'll be re-enabled only once all address
-+       * decoders are programmed consistently.
-+       */
-+
-+      DBG_DEVS(("layout_bus: disable_dev for bus %d\n", bus->number));
-+
-+#ifdef NL_ORIGINAL
-+      for (dev = bus->devices; dev; dev = dev->sibling)
-+#else
-+      dev = NULL;
-+      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
-+#endif
-+      {
-+              if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
-+                  (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
-+                      disable_dev(dev);
-+      }
-+
-+      /*
-+       * Allocate space to each device:
-+       */
-+
-+      DBG_DEVS(("layout_bus: starting bus %d devices\n", bus->number));
-+
-+#ifdef NL_ORIGINAL
-+      for (dev = bus->devices; dev; dev = dev->sibling)
-+#else
-+      dev = NULL;
-+      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
-+#endif
-+      {
-+              if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
-+                  (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
-+                      layout_dev(dev);
-+      }
-+
-+      DBG_DEVS(("layout_bus: bus %d finished\n", bus->number));
-+}
-+
-+/*
-+ * static void pcibios_fixup(void)
-+ *
-+ * Layout memory and I/O of all devices on the PCI bus if 'pci_modify' is
-+ * true. This might be necessary because not every m68k machine with a PCI
-+ * bus has a PCI BIOS. This function should be called right after
-+ * pci_scan_bus() in pcibios_init().
-+ */
-+
-+static void __init pcibios_fixup(void)
-+{
-+      DBG_DEVS(("%s\n", __FUNCTION__));
-+      if (pci_modify)
-+      {
-+              /*
-+               * Set base addresses for allocation of I/O and memory space.
-+               */
-+
-+              io_base = bus_info->io_space.start + IO_ALLOC_OFFSET;
-+              mem_base = bus_info->mem_space.start + MEM_ALLOC_OFFSET;
-+
-+              /*
-+               * Scan the tree, allocating PCI memory and I/O space.
-+               */
-+
-+#ifdef NL_ORIGINAL
-+              layout_bus(pci_bus_b(pci_root.next));
-+#else
-+              layout_bus(pci_bus_b(pci_root_buses.next));
-+#endif
-+      }
-+
-+      /*
-+       * Fix interrupt assignments, etc.
-+       */
-+
-+      bus_info->fixup(pci_modify);
-+}
-+
-+/*
-+ * static void pcibios_claim_resources(struct pci_bus *bus)
-+ *
-+ * Claim all resources that are assigned to devices on the given bus.
-+ *
-+ * Parameters:
-+ *
-+ * bus        - bus.
-+ */
-+
-+static void __init pcibios_claim_resources(struct pci_bus *bus)
-+{
-+      struct pci_dev *dev;
-+      int i;
-+      DBG_DEVS(("%s\n", __FUNCTION__));
-+#ifdef NL_ORIGINAL
-+      while (bus)
-+#else
-+      while ((bus = pci_find_next_bus(bus)) != NULL)
-+#endif
-+      {
-+
-+#ifdef NL_ORIGINAL
-+              for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
-+#else
-+              dev = NULL;
-+              while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
-+#endif
-+              {
-+                      for (i = 0; i < PCI_NUM_RESOURCES; i++)
-+                      {
-+                              struct resource *r = &dev->resource[i];
-+                              struct resource *pr;
-+                              struct pci_bus_info *bus_info = 
-+                                      (struct pci_bus_info *) dev->sysdata;
-+
-+                              if ((r->start == 0) || (r->parent != NULL))
-+                                      continue;
-+
-+#ifdef CONFIG_COLDFIRE
-+                              if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE)
-+                                      continue;
-+#endif /* CONFIG_COLDFIRE */
-+#if 1
-+                              if (r->flags & IORESOURCE_IO)
-+                                      pr = &bus_info->io_space;
-+                              else
-+                                      pr = &bus_info->mem_space;
-+#else
-+                              if (r->flags & IORESOURCE_IO)
-+                                      pr = &ioport_resource;
-+                              else
-+                                      pr = &iomem_resource;
-+#endif
-+                              if (request_resource(pr, r) < 0)
-+                              {
-+#ifdef NL_ORIGINAL
-+                                      DBG_DEVS(("PCI: Address space collision on "
-+                                              "region %d of device %s\n", i, dev->name));
-+#else
-+                                      printk("PCI: Address space collision on region %d of device %s\n", i, dev->dev.bus_id);
-+#endif
-+                              }
-+                      }
-+              }
-+
-+#ifdef NL_ORIGINAL
-+              if (bus->children)
-+                      pcibios_claim_resources(bus->children);
-+#else
-+              if (!list_empty(&bus->children))
-+                      pcibios_claim_resources(pci_bus_b(bus->children.next));
-+#endif
-+
-+#ifdef NL_ORIGINAL
-+              bus = bus->next;
-+#endif
-+      }
-+}
-+
-+/*
-+ * int pcibios_assign_resource(struct pci_dev *dev, int i)
-+ *
-+ * Assign a new address to a PCI resource.
-+ *
-+ * Parameters:
-+ *
-+ * dev        - device.
-+ * i  - resource.
-+ *
-+ * Result: 0 if successful.
-+ */
-+
-+int __init pcibios_assign_resource(struct pci_dev *dev, int i)
-+{
-+      struct resource *r = &dev->resource[i];
-+      struct resource *pr = pci_find_parent_resource(dev, r);
-+      unsigned long size = r->end + 1;
-+      DBG_DEVS(("%s:IO_ALLOC_OFFSET %x\n", __FUNCTION__, IO_ALLOC_OFFSET));
-+      if (!pr)
-+              return -EINVAL;
-+
-+      if (r->flags & IORESOURCE_IO)
-+      {
-+              DBG_DEVS(("%s:IORESOURCE_IO:start %x, size %lx\n",
-+                      __FUNCTION__, bus_info->io_space.start, size));
-+              if (size > 0x100)
-+                      return -EFBIG;
-+
-+#ifdef NL_ORIGINAL
-+              if (allocate_resource(pr, r, size, bus_info->io_space.start +
-+                                    IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024))
-+#else
-+              if (allocate_resource(pr, r, size, bus_info->io_space.start +
-+                                 IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
-+#endif
-+                      return -EBUSY;
-+      }
-+      else
-+      {
-+              DBG_DEVS(("%s:IORESOURCE_MEM:start %x, size %lx\n",
-+                              __FUNCTION__, bus_info->mem_space.start, size));
-+#ifdef NL_ORIGINAL
-+              if (allocate_resource(pr, r, size, bus_info->mem_space.start +
-+                                    MEM_ALLOC_OFFSET, bus_info->mem_space.end, size))
-+#else
-+              if (allocate_resource(pr, r, size, bus_info->io_space.start +
-+                                 IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
-+#endif
-+                      return -EBUSY;
-+      }
-+
-+      if (i < 6)
-+              pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, r->start);
-+
-+      return 0;
-+}
-+
-+void pcibios_fixup_bus(struct pci_bus *bus)
-+{
-+      struct pci_dev *dev;
-+      void *sysdata;
-+
-+      sysdata = (bus->parent) ? bus->parent->sysdata : bus->sysdata;
-+
-+#ifdef NL_ORIGINAL
-+      for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
-+#else
-+      dev = NULL;
-+      while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
-+#endif
-+              dev->sysdata = sysdata;
-+}
-+
-+int __init pcibios_init(void)
-+{
-+      printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV);
-+
-+      bus_info = NULL;
-+#ifdef CONFIG_COLDFIRE
-+      bus_info = init_coldfire_pci();
-+#endif /* CONFIG_COLDFIRE */
-+#ifdef CONFIG_HADES
-+      if (MACH_IS_HADES)
-+              bus_info = init_hades_pci();
-+#endif
-+      if (bus_info != NULL)
-+      {
-+              printk("PCI: Probing PCI hardware\n");
-+              pci_scan_bus(0, bus_info->m68k_pci_ops, bus_info);
-+              pcibios_fixup();
-+#ifdef NL_ORIGINAL
-+              pcibios_claim_resources(pci_root);
-+#else
-+              pcibios_claim_resources(pci_bus_b(pci_root_buses.next));
-+#endif
-+      }
-+      else
-+              printk("PCI: No PCI bus detected\n");
-+      return 0;
-+}
-+
-+subsys_initcall(pcibios_init);
-+
-+char * pcibios_setup(char *str)
-+{
-+      if (!strcmp(str, "nomodify"))
-+      {
-+              pci_modify = 0;
-+              return NULL;
-+      }
-+      else if (!strcmp(str, "skipvga"))
-+      {
-+              skip_vga = 1;
-+              return NULL;
-+      }
-+      else if (!strcmp(str, "noburst"))
-+      {
-+              disable_pci_burst = 1;
-+              return NULL;
-+      }
-+
-+      return str;
-+}
-+#endif /* CONFIG_PCI */
---- a/arch/m68k/kernel/dma.c
-+++ b/arch/m68k/kernel/dma.c
-@@ -11,12 +11,24 @@
- #include <linux/kernel.h>
- #include <linux/scatterlist.h>
- #include <linux/vmalloc.h>
--
-+#include <linux/pci.h>
- #include <asm/pgalloc.h>
- void *dma_alloc_coherent(struct device *dev, size_t size,
-                        dma_addr_t *handle, gfp_t flag)
- {
-+#if   defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
-+        /*
-+      * On the M5445x platform the memory allocated with GFP_DMA
-+      * is guaranteed to be DMA'able.
-+      */
-+        void *addr;
-+
-+        size = PAGE_ALIGN(size);
-+        addr = kmalloc(size, GFP_DMA);
-+        *handle = virt_to_phys(addr);
-+        return addr;
-+#else
-       struct page *page, **map;
-       pgprot_t pgprot;
-       void *addr;
-@@ -55,6 +67,7 @@ void *dma_alloc_coherent(struct device *
-       kfree(map);
-       return addr;
-+#endif
- }
- EXPORT_SYMBOL(dma_alloc_coherent);
-@@ -62,7 +75,11 @@ void dma_free_coherent(struct device *de
-                      void *addr, dma_addr_t handle)
- {
-       pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
-+#if   defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
-+      kfree(addr);
-+#else
-       vfree(addr);
-+#endif
- }
- EXPORT_SYMBOL(dma_free_coherent);
---- a/arch/m68k/kernel/Makefile
-+++ b/arch/m68k/kernel/Makefile
-@@ -2,19 +2,27 @@
- # Makefile for the linux kernel.
- #
--ifndef CONFIG_SUN3
--  extra-y := head.o
-+ifdef CONFIG_SUN3
-+  extra-y := sun3-head.o vmlinux.lds
-+  obj-y := entry.o signal.o ints.o
- else
--  extra-y := sun3-head.o
-+ifndef CONFIG_COLDFIRE
-+  extra-y := head.o vmlinux.lds
-+  obj-y := entry.o signal.o traps.o ints.o
-+  obj-$(CONFIG_PCI) += bios32.o
-+else   # CONFIG_COLDFIRE
-+  extra-y := ../coldfire/head.o vmlinux.lds
-+ifdef CONFIG_M547X_8X
-+  obj-$(CONFIG_PCI) += bios32_mcf548x.o
-+endif
-+endif
- endif
--extra-y       += vmlinux.lds
--obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
-+obj-y += process.o ptrace.o module.o \
-          sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o
- devres-y = ../../../kernel/irq/devres.o
--obj-$(CONFIG_PCI)     += bios32.o
- obj-y$(CONFIG_MMU_SUN3) += dma.o      # no, it's not a typo
- EXTRA_AFLAGS := -traditional
---- a/arch/m68k/kernel/process.c
-+++ b/arch/m68k/kernel/process.c
-@@ -191,6 +191,7 @@ EXPORT_SYMBOL(kernel_thread);
- void flush_thread(void)
- {
-+#if !defined(CONFIG_COLDFIRE)
-       unsigned long zero = 0;
-       set_fs(USER_DS);
-       current->thread.fs = __USER_DS;
-@@ -198,6 +199,14 @@ void flush_thread(void)
-               asm volatile (".chip 68k/68881\n\t"
-                             "frestore %0@\n\t"
-                             ".chip 68k" : : "a" (&zero));
-+#else
-+      set_fs(USER_DS);
-+      current->thread.fs = USER_DS;
-+#if defined(CONFIG_FPU)
-+      if (!FPU_IS_EMU)
-+              asm volatile ("frestore %0@\n\t" : : "a" (&zero));
-+#endif
-+#endif
- }
- /*
-@@ -261,6 +270,7 @@ int copy_thread(int nr, unsigned long cl
-        * Must save the current SFC/DFC value, NOT the value when
-        * the parent was last descheduled - RGH  10-08-96
-        */
-+#if !defined(CONFIG_COLDFIRE)
-       p->thread.fs = get_fs().seg;
-       if (!FPU_IS_EMU) {
-@@ -272,9 +282,34 @@ int copy_thread(int nr, unsigned long cl
-                               "fmoveml %/fpiar/%/fpcr/%/fpsr,%1"
-                               : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0])
-                               : "memory");
-+#else
-+      p->thread.fs = get_fs();
-+
-+#if defined(CONFIG_FPU)
-+      if (!FPU_IS_EMU) {
-+              /* Copy the current fpu state */
-+              asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0])
-+                            : "memory");
-+
-+              if (p->thread.fpstate[0]) {
-+                      asm volatile ("fmovemd %/fp0-%/fp7,%0"
-+                                    : : "m" (p->thread.fp[0])
-+                                    : "memory");
-+                      asm volatile ("fmovel %/fpiar,%0"
-+                                    : : "m" (p->thread.fpcntl[0])
-+                                    : "memory");
-+                      asm volatile ("fmovel %/fpcr,%0"
-+                                    : : "m" (p->thread.fpcntl[1])
-+                                    : "memory");
-+                      asm volatile ("fmovel %/fpsr,%0"
-+                                    : : "m" (p->thread.fpcntl[2])
-+                                    : "memory");
-+              }
-               /* Restore the state in case the fpu was busy */
-               asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0]));
-       }
-+#endif
-+#endif
-       return 0;
- }
-@@ -283,7 +318,9 @@ int copy_thread(int nr, unsigned long cl
- int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
- {
-+#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU)
-       char fpustate[216];
-+#endif
-       if (FPU_IS_EMU) {
-               int i;
-@@ -300,6 +337,7 @@ int dump_fpu (struct pt_regs *regs, stru
-       }
-       /* First dump the fpu context to avoid protocol violation.  */
-+#if !defined(CONFIG_COLDFIRE)
-       asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
-       if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
-               return 0;
-@@ -310,6 +348,25 @@ int dump_fpu (struct pt_regs *regs, stru
-       asm volatile ("fmovemx %/fp0-%/fp7,%0"
-               :: "m" (fpu->fpregs[0])
-               : "memory");
-+#elif defined(CONFIG_FPU)
-+      asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
-+      if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
-+              return 0;
-+
-+      asm volatile ("fmovel %/fpiar,%0"
-+                    : : "m" (fpu->fpcntl[0])
-+                    : "memory");
-+      asm volatile ("fmovel %/fpcr,%0"
-+                    : : "m" (fpu->fpcntl[1])
-+                    : "memory");
-+      asm volatile ("fmovel %/fpsr,%0"
-+                    : : "m" (fpu->fpcntl[2])
-+                    : "memory");
-+      asm volatile ("fmovemd %/fp0-%/fp7,%0"
-+                    : : "m" (fpu->fpregs[0])
-+                    : "memory");
-+#endif
-+
-       return 1;
- }
- EXPORT_SYMBOL(dump_fpu);
---- a/arch/m68k/kernel/setup.c
-+++ b/arch/m68k/kernel/setup.c
-@@ -67,13 +67,22 @@ EXPORT_SYMBOL(m68k_memory);
- struct mem_info m68k_ramdisk;
-+#if !defined(CONFIG_COLDFIRE)
- static char m68k_command_line[CL_SIZE];
-+#else
-+char m68k_command_line[CL_SIZE];
-+unsigned long uboot_info_stk;
-+EXPORT_SYMBOL(uboot_info_stk);
-+#endif
- void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL;
- /* machine dependent irq functions */
- void (*mach_init_IRQ) (void) __initdata = NULL;
- void (*mach_get_model) (char *model);
- int (*mach_get_hardware_list) (char *buffer);
-+#ifdef CONFIG_COLDFIRE
-+void (*mach_tick)(void);
-+#endif
- /* machine dependent timer functions */
- unsigned long (*mach_gettimeoffset) (void);
- int (*mach_hwclk) (int, struct rtc_time*);
-@@ -128,13 +137,17 @@ extern void config_hp300(void);
- extern void config_q40(void);
- extern void config_sun3x(void);
-+#ifdef CONFIG_COLDFIRE
-+void coldfire_sort_memrec(void);
-+#endif
-+
- #define MASK_256K 0xfffc0000
- extern void paging_init(void);
- static void __init m68k_parse_bootinfo(const struct bi_record *record)
- {
--      while (record->tag != BI_LAST) {
-+      while ((record->tag != BI_LAST) && !(CONFIG_COLDFIRE)) {
-               int unknown = 0;
-               const unsigned long *data = record->data;
-@@ -192,7 +205,11 @@ static void __init m68k_parse_bootinfo(c
-                                             record->size);
-       }
--      m68k_realnum_memory = m68k_num_memory;
-+#ifdef CONFIG_COLDFIRE
-+    coldfire_sort_memrec();
-+#endif
-+
-+    m68k_realnum_memory = m68k_num_memory;
- #ifdef CONFIG_SINGLE_MEMORY_CHUNK
-       if (m68k_num_memory > 1) {
-               printk("Ignoring last %i chunks of physical memory\n",
-@@ -205,7 +222,9 @@ static void __init m68k_parse_bootinfo(c
- void __init setup_arch(char **cmdline_p)
- {
-       extern int _etext, _edata, _end;
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
-       int i;
-+#endif
-       /* The bootinfo is located right after the kernel bss */
-       m68k_parse_bootinfo((const struct bi_record *)&_end);
-@@ -220,9 +239,10 @@ void __init setup_arch(char **cmdline_p)
-        * We should really do our own FPU check at startup.
-        * [what do we do with buggy 68LC040s? if we have problems
-        *  with them, we should add a test to check_bugs() below] */
--#ifndef CONFIG_M68KFPU_EMU_ONLY
-+#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU)
-       /* clear the fpu if we have one */
--      if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) {
-+      if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060|
-+                          FPU_CFV4E)) {
-               volatile int zero = 0;
-               asm volatile ("frestore %0" : : "m" (zero));
-       }
-@@ -310,13 +330,18 @@ void __init setup_arch(char **cmdline_p)
-               config_sun3x();
-               break;
- #endif
-+#ifdef CONFIG_COLDFIRE
-+      case MACH_CFMMU:
-+              config_coldfire();
-+              break;
-+#endif
-       default:
-               panic("No configuration setup");
-       }
-       paging_init();
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
-       for (i = 1; i < m68k_num_memory; i++)
-               free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
-                                 m68k_memory[i].size);
-@@ -343,6 +368,10 @@ void __init setup_arch(char **cmdline_p)
- #endif /* !CONFIG_SUN3 */
-+#ifdef CONFIG_COLDFIRE
-+      mmu_context_init();
-+#endif
-+
- /* set ISA defs early as possible */
- #if defined(CONFIG_ISA) && defined(MULTI_ISA)
- #if defined(CONFIG_Q40)
-@@ -373,6 +402,7 @@ static int show_cpuinfo(struct seq_file 
- #define LOOP_CYCLES_68030     (8)
- #define LOOP_CYCLES_68040     (3)
- #define LOOP_CYCLES_68060     (1)
-+#define LOOP_CYCLES_COLDFIRE  (2)
-       if (CPU_IS_020) {
-               cpu = "68020";
-@@ -386,6 +416,9 @@ static int show_cpuinfo(struct seq_file 
-       } else if (CPU_IS_060) {
-               cpu = "68060";
-               clockfactor = LOOP_CYCLES_68060;
-+      } else if (CPU_IS_CFV4E) {
-+              cpu = "ColdFire V4e";
-+              clockfactor = LOOP_CYCLES_COLDFIRE;
-       } else {
-               cpu = "680x0";
-               clockfactor = 0;
-@@ -404,6 +437,8 @@ static int show_cpuinfo(struct seq_file 
-               fpu = "68060";
-       else if (m68k_fputype & FPU_SUNFPA)
-               fpu = "Sun FPA";
-+      else if (m68k_fputype & FPU_CFV4E)
-+              fpu = "ColdFire V4e";
-       else
-               fpu = "none";
- #endif
-@@ -420,6 +455,8 @@ static int show_cpuinfo(struct seq_file 
-               mmu = "Sun-3";
-       else if (m68k_mmutype & MMU_APOLLO)
-               mmu = "Apollo";
-+      else if (m68k_mmutype & MMU_CFV4E)
-+              mmu = "ColdFire";
-       else
-               mmu = "unknown";
-@@ -482,7 +519,7 @@ int get_hardware_list(char *buffer)
- void check_bugs(void)
- {
--#ifndef CONFIG_M68KFPU_EMU
-+#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X)
-       if (m68k_fputype == 0) {
-               printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
-                       "WHICH IS REQUIRED BY LINUX/M68K ***\n");
---- a/arch/m68k/kernel/sys_m68k.c
-+++ b/arch/m68k/kernel/sys_m68k.c
-@@ -29,6 +29,9 @@
- #include <asm/traps.h>
- #include <asm/page.h>
- #include <asm/unistd.h>
-+#ifdef CONFIG_COLDFIRE
-+#include <asm/cacheflush.h>
-+#endif
- /*
-  * sys_pipe() is the normal C calling standard for creating
-@@ -257,6 +260,7 @@ asmlinkage int sys_ipc (uint call, int f
-       return -EINVAL;
- }
-+#ifndef CONFIG_COLDFIRE
- /* Convert virtual (user) address VADDR to physical address PADDR */
- #define virt_to_phys_040(vaddr)                                               \
- ({                                                                    \
-@@ -580,6 +584,7 @@ cache_flush_060 (unsigned long addr, int
-     }
-   return 0;
- }
-+#endif /* CONFIG_COLDFIRE */
- /* sys_cacheflush -- flush (part of) the processor cache.  */
- asmlinkage int
-@@ -612,6 +617,7 @@ sys_cacheflush (unsigned long addr, int 
-                       goto out;
-       }
-+#ifndef CONFIG_COLDFIRE
-       if (CPU_IS_020_OR_030) {
-               if (scope == FLUSH_SCOPE_LINE && len < 256) {
-                       unsigned long cacr;
-@@ -656,6 +662,16 @@ sys_cacheflush (unsigned long addr, int 
-               ret = cache_flush_060 (addr, scope, cache, len);
-           }
-       }
-+#else /* CONFIG_COLDFIRE */
-+      if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA))
-+              flush_bcache();
-+      else if (cache & FLUSH_CACHE_INSN)
-+              flush_icache();
-+      else
-+              flush_dcache();
-+
-+      ret = 0;
-+#endif /* CONFIG_COLDFIRE */
- out:
-       unlock_kernel();
-       return ret;
---- a/arch/m68k/kernel/time.c
-+++ b/arch/m68k/kernel/time.c
-@@ -40,6 +40,11 @@ static inline int set_rtc_mmss(unsigned 
-  */
- static irqreturn_t timer_interrupt(int irq, void *dummy)
- {
-+#ifdef CONFIG_COLDFIRE
-+      /* kick hardware timer if necessary */
-+      if (mach_tick)
-+              mach_tick();
-+#endif
-       do_timer(1);
- #ifndef CONFIG_SMP
-       update_process_times(user_mode(get_irq_regs()));
---- a/arch/m68k/kernel/vmlinux.lds.S
-+++ b/arch/m68k/kernel/vmlinux.lds.S
-@@ -1,10 +1,13 @@
- PHDRS
- {
--  text PT_LOAD FILEHDR PHDRS FLAGS (7);
-+  headers PT_PHDR PHDRS ;
-+  text PT_LOAD FILEHDR PHDRS FLAGS (5);
-   data PT_LOAD FLAGS (7);
- }
- #ifdef CONFIG_SUN3
- #include "vmlinux-sun3.lds"
-+#elif CONFIG_COLDFIRE
-+#include "../coldfire/vmlinux-cf.lds"
- #else
- #include "vmlinux-std.lds"
- #endif
---- a/arch/m68k/lib/checksum.c
-+++ b/arch/m68k/lib/checksum.c
-@@ -39,8 +39,131 @@
-  * computes a partial checksum, e.g. for TCP/UDP fragments
-  */
-+#ifdef CONFIG_COLDFIRE
-+
-+static inline unsigned short from32to16(unsigned long x)
-+{
-+      /* add up 16-bit and 16-bit for 16+c bit */
-+      x = (x & 0xffff) + (x >> 16);
-+      /* add up carry.. */
-+      x = (x & 0xffff) + (x >> 16);
-+      return x;
-+}
-+
-+static unsigned long do_csum(const unsigned char *buff, int len)
-+{
-+      int odd, count;
-+      unsigned long result = 0;
-+
-+      if (len <= 0)
-+              goto out;
-+      odd = 1 & (unsigned long) buff;
-+      if (odd) {
-+              result = *buff;
-+              len--;
-+              buff++;
-+      }
-+      count = len >> 1;               /* nr of 16-bit words.. */
-+      if (count) {
-+              if (2 & (unsigned long) buff) {
-+                      result += *(unsigned short *) buff;
-+                      count--;
-+                      len -= 2;
-+                      buff += 2;
-+              }
-+              count >>= 1;            /* nr of 32-bit words.. */
-+              if (count) {
-+                      unsigned long carry = 0;
-+                      do {
-+                              unsigned long w = *(unsigned long *) buff;
-+                              count--;
-+                              buff += 4;
-+                              result += carry;
-+                              result += w;
-+                              carry = (w > result);
-+                      } while (count);
-+                      result += carry;
-+                      result = (result & 0xffff) + (result >> 16);
-+              }
-+              if (len & 2) {
-+                      result += *(unsigned short *) buff;
-+                      buff += 2;
-+              }
-+      }
-+      if (len & 1)
-+              result += (*buff << 8);
-+      result = from32to16(result);
-+      if (odd)
-+              result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
-+out:
-+      return result;
-+}
-+
-+/*
-+ *    This is a version of ip_compute_csum() optimized for IP headers,
-+ *    which always checksum on 4 octet boundaries.
-+ */
-+__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
-+{
-+      return ~do_csum(iph, ihl*4);
-+}
-+EXPORT_SYMBOL(ip_fast_csum);
-+
-+/*
-+ * computes the checksum of a memory block at buff, length len,
-+ * and adds in "sum" (32-bit)
-+ *
-+ * returns a 32-bit number suitable for feeding into itself
-+ * or csum_tcpudp_magic
-+ *
-+ * this function must be called with even lengths, except
-+ * for the last fragment, which may be odd
-+ *
-+ * it's best to have buff aligned on a 32-bit boundary
-+ */
- __wsum csum_partial(const void *buff, int len, __wsum sum)
- {
-+      unsigned int result = do_csum(buff, len);
-+
-+      /* add in old sum, and carry.. */
-+      result += sum;
-+      if (sum > result)
-+              result += 1;
-+      return result;
-+}
-+EXPORT_SYMBOL(csum_partial);
-+
-+/*
-+ * copy from fs while checksumming, otherwise like csum_partial
-+ */
-+
-+__wsum
-+csum_partial_copy_from_user(const void __user *src, void *dst, int len,
-+                          __wsum sum, int *csum_err)
-+{
-+      if (csum_err) *csum_err = 0;
-+      memcpy(dst, src, len);
-+      return csum_partial(dst, len, sum);
-+}
-+EXPORT_SYMBOL(csum_partial_copy_from_user);
-+
-+/*
-+ * copy from ds while checksumming, otherwise like csum_partial
-+ */
-+
-+__wsum
-+csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
-+{
-+      memcpy(dst, src, len);
-+      return csum_partial(dst, len, sum);
-+}
-+EXPORT_SYMBOL(csum_partial_copy_nocheck);
-+
-+#else /* !CONFIG_COLDFIRE */
-+
-+unsigned int
-+csum_partial(const unsigned char *buff, int len, unsigned int sum)
-+{
-       unsigned long tmp1, tmp2;
-         /*
-          * Experiments with ethernet and slip connections show that buff
-@@ -423,3 +546,4 @@ csum_partial_copy_nocheck(const void *sr
-     return(sum);
- }
- EXPORT_SYMBOL(csum_partial_copy_nocheck);
-+#endif /* CONFIG_COLDFIRE */
---- a/arch/m68k/lib/muldi3.c
-+++ b/arch/m68k/lib/muldi3.c
-@@ -21,12 +21,22 @@ Boston, MA 02111-1307, USA.  */
- #define BITS_PER_UNIT 8
-+#ifdef CONFIG_COLDFIRE
-+#define umul_ppmm(w1, w0, u, v) \
-+  do { \
-+       unsigned long long x; \
-+       x = (unsigned long long)u * v; \
-+       w0 = (unsigned long)(x & 0x00000000ffffffff); \
-+       w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \
-+     } while (0)
-+#else /* CONFIG_COLDFIRE */
- #define umul_ppmm(w1, w0, u, v) \
-   __asm__ ("mulu%.l %3,%1:%0"                                         \
-            : "=d" ((USItype)(w0)),                                    \
-              "=d" ((USItype)(w1))                                     \
-            : "%0" ((USItype)(u)),                                     \
-              "dmi" ((USItype)(v)))
-+#endif /* CONFIG_COLDFIRE */
- #define __umulsidi3(u, v) \
-   ({DIunion __w;                                                      \
---- a/arch/m68k/lib/semaphore.S
-+++ b/arch/m68k/lib/semaphore.S
-@@ -16,11 +16,24 @@
-  * there is contention on the semaphore.
-  */
- ENTRY(__down_failed)
-+#ifndef CONFIG_COLDFIRE
-       moveml %a0/%d0/%d1,-(%sp)
-+#else
-+      movel %a0,-(%sp)
-+      movel %d0,-(%sp)
-+      movel %d1,-(%sp)
-+#endif
-       movel %a1,-(%sp)
-       jbsr __down
-       movel (%sp)+,%a1
-+#ifndef CONFIG_COLDFIRE
-       moveml (%sp)+,%a0/%d0/%d1
-+#else
-+      movel (%sp)+,%d1
-+      movel (%sp)+,%d0
-+      movel (%sp)+,%a0
-+#endif
-+
-       rts
- ENTRY(__down_failed_interruptible)
-@@ -44,10 +57,22 @@ ENTRY(__down_failed_trylock)
-       rts
- ENTRY(__up_wakeup)
-+#ifndef CONFIG_COLDFIRE
-       moveml %a0/%d0/%d1,-(%sp)
-+#else
-+      movel %a0,-(%sp)
-+      movel %d0,-(%sp)
-+      movel %d1,-(%sp)
-+#endif
-       movel %a1,-(%sp)
-       jbsr __up
-       movel (%sp)+,%a1
-+#ifndef CONFIG_COLDFIRE
-       moveml (%sp)+,%a0/%d0/%d1
-+#else
-+      movel (%sp)+,%d1
-+      movel (%sp)+,%d0
-+      movel (%sp)+,%a0
-+#endif
-       rts
---- a/arch/m68k/lib/string.c
-+++ b/arch/m68k/lib/string.c
-@@ -15,6 +15,7 @@ char *strcpy(char *dest, const char *src
- }
- EXPORT_SYMBOL(strcpy);
-+#ifndef CONFIG_COLDFIRE
- void *memset(void *s, int c, size_t count)
- {
-       void *xs = s;
-@@ -143,6 +144,69 @@ void *memcpy(void *to, const void *from,
- }
- EXPORT_SYMBOL(memcpy);
-+#else /* CONFIG_COLDFIRE */
-+
-+void *memset(void *s, int c, size_t count)
-+{
-+  unsigned long x;
-+  void *originalTo;
-+
-+  for (x = 0; x < count; x++)
-+    *(unsigned char *)s++ = (unsigned char)c;
-+
-+  return originalTo;
-+}
-+EXPORT_SYMBOL(memset);
-+
-+void *memcpy(void *to, const void *from, size_t n)
-+{
-+  void *xto = to;
-+  size_t temp;
-+
-+  if (!n)
-+    return xto;
-+  if ((long) to & 1) {
-+      char *cto = to;
-+      const char *cfrom = from;
-+      *cto++ = *cfrom++;
-+      to = cto;
-+      from = cfrom;
-+      n--;
-+    }
-+  if (n > 2 && (long) to & 2) {
-+      short *sto = to;
-+      const short *sfrom = from;
-+      *sto++ = *sfrom++;
-+      to = sto;
-+      from = sfrom;
-+      n -= 2;
-+    }
-+  temp = n >> 2;
-+  if (temp) {
-+      long *lto = to;
-+      const long *lfrom = from;
-+      for (; temp; temp--)
-+      *lto++ = *lfrom++;
-+      to = lto;
-+      from = lfrom;
-+    }
-+  if (n & 2) {
-+      short *sto = to;
-+      const short *sfrom = from;
-+      *sto++ = *sfrom++;
-+      to = sto;
-+      from = sfrom;
-+    }
-+  if (n & 1) {
-+      char *cto = to;
-+      const char *cfrom = from;
-+      *cto = *cfrom;
-+    }
-+  return xto;
-+}
-+EXPORT_SYMBOL(memcpy);
-+#endif /* CONFIG_COLDFIRE */
-+
- void *memmove(void *dest, const void *src, size_t n)
- {
-       void *xdest = dest;
---- a/arch/m68k/lib/uaccess.c
-+++ b/arch/m68k/lib/uaccess.c
-@@ -5,6 +5,7 @@
-  */
- #include <linux/module.h>
-+#ifndef CONFIG_COLDFIRE
- #include <asm/uaccess.h>
- unsigned long __generic_copy_from_user(void *to, const void __user *from,
-@@ -220,3 +221,244 @@ unsigned long __clear_user(void __user *
-     return res;
- }
- EXPORT_SYMBOL(__clear_user);
-+
-+#else /* CONFIG_COLDFIRE */
-+
-+#include <asm/cf_uaccess.h>
-+
-+unsigned long __generic_copy_from_user(void *to, const void *from,
-+              unsigned long n)
-+{
-+    unsigned long tmp;
-+    __asm__ __volatile__
-+      ("   tstl %2\n"
-+       "   jeq 2f\n"
-+       "1: movel (%1)+,%3\n"
-+       "   movel %3,(%0)+\n"
-+       "   subql #1,%2\n"
-+       "   jne 1b\n"
-+       "2: movel %4,%2\n"
-+       "   bclr #1,%2\n"
-+       "   jeq 4f\n"
-+       "3: movew (%1)+,%3\n"
-+       "   movew %3,(%0)+\n"
-+       "4: bclr #0,%2\n"
-+       "   jeq 6f\n"
-+       "5: moveb (%1)+,%3\n"
-+       "   moveb %3,(%0)+\n"
-+       "6:\n"
-+       ".section .fixup,\"ax\"\n"
-+       "   .even\n"
-+       "7: movel %2,%%d0\n"
-+       "71:clrl (%0)+\n"
-+       "   subql #1,%%d0\n"
-+       "   jne 71b\n"
-+       "   lsll #2,%2\n"
-+       "   addl %4,%2\n"
-+       "   btst #1,%4\n"
-+       "   jne 81f\n"
-+       "   btst #0,%4\n"
-+       "   jne 91f\n"
-+       "   jra 6b\n"
-+       "8: addql #2,%2\n"
-+       "81:clrw (%0)+\n"
-+       "   btst #0,%4\n"
-+       "   jne 91f\n"
-+       "   jra 6b\n"
-+       "9: addql #1,%2\n"
-+       "91:clrb (%0)+\n"
-+       "   jra 6b\n"
-+       ".previous\n"
-+       ".section __ex_table,\"a\"\n"
-+       "   .align 4\n"
-+       "   .long 1b,7b\n"
-+       "   .long 3b,8b\n"
-+       "   .long 5b,9b\n"
-+       ".previous"
-+       : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
-+       : "d"(n & 3), "0"(to), "1"(from), "2"(n/4)
-+       : "d0", "memory");
-+    return n;
-+}
-+EXPORT_SYMBOL(__generic_copy_from_user);
-+
-+
-+unsigned long __generic_copy_to_user(void *to, const void *from,
-+              unsigned long n)
-+{
-+    unsigned long tmp;
-+    __asm__ __volatile__
-+      ("   tstl %2\n"
-+       "   jeq 3f\n"
-+       "1: movel (%1)+,%3\n"
-+       "22:movel %3,(%0)+\n"
-+       "2: subql #1,%2\n"
-+       "   jne 1b\n"
-+       "3: movel %4,%2\n"
-+       "   bclr #1,%2\n"
-+       "   jeq 4f\n"
-+       "   movew (%1)+,%3\n"
-+       "24:movew %3,(%0)+\n"
-+       "4: bclr #0,%2\n"
-+       "   jeq 5f\n"
-+       "   moveb (%1)+,%3\n"
-+       "25:moveb %3,(%0)+\n"
-+       "5:\n"
-+       ".section .fixup,\"ax\"\n"
-+       "   .even\n"
-+       "60:addql #1,%2\n"
-+       "6: lsll #2,%2\n"
-+       "   addl %4,%2\n"
-+       "   jra 5b\n"
-+       "7: addql #2,%2\n"
-+       "   jra 5b\n"
-+       "8: addql #1,%2\n"
-+       "   jra 5b\n"
-+       ".previous\n"
-+       ".section __ex_table,\"a\"\n"
-+       "   .align 4\n"
-+       "   .long 1b,60b\n"
-+       "   .long 22b,6b\n"
-+       "   .long 2b,6b\n"
-+       "   .long 24b,7b\n"
-+       "   .long 3b,60b\n"
-+       "   .long 4b,7b\n"
-+       "   .long 25b,8b\n"
-+       "   .long 5b,8b\n"
-+       ".previous"
-+       : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
-+       : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4)
-+       : "memory");
-+    return n;
-+}
-+EXPORT_SYMBOL(__generic_copy_to_user);
-+
-+/*
-+ * Copy a null terminated string from userspace.
-+ */
-+
-+long strncpy_from_user(char *dst, const char *src, long count)
-+{
-+      long res = -EFAULT;
-+      if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
-+              return res;
-+    if (count == 0) return count;
-+    __asm__ __volatile__
-+      ("1: moveb (%2)+,%%d0\n"
-+       "12:moveb %%d0,(%1)+\n"
-+       "   jeq 2f\n"
-+       "   subql #1,%3\n"
-+       "   jne 1b\n"
-+       "2: subl %3,%0\n"
-+       "3:\n"
-+       ".section .fixup,\"ax\"\n"
-+       "   .even\n"
-+       "4: movel %4,%0\n"
-+       "   jra 3b\n"
-+       ".previous\n"
-+       ".section __ex_table,\"a\"\n"
-+       "   .align 4\n"
-+       "   .long 1b,4b\n"
-+       "   .long 12b,4b\n"
-+       ".previous"
-+       : "=d"(res), "=a"(dst), "=a"(src), "=d"(count)
-+       : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count)
-+       : "d0", "memory");
-+    return res;
-+}
-+EXPORT_SYMBOL(strncpy_from_user);
-+
-+/*
-+ * Return the size of a string (including the ending 0)
-+ *
-+ * Return 0 on exception, a value greater than N if too long
-+ */
-+long strnlen_user(const char *src, long n)
-+{
-+    long res = -EFAULT;
-+    if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
-+      return res;
-+
-+      res = -(long)src;
-+      __asm__ __volatile__
-+              ("1:\n"
-+               "   tstl %2\n"
-+               "   jeq 3f\n"
-+               "2: moveb (%1)+,%%d0\n"
-+               "22:\n"
-+               "   subql #1,%2\n"
-+               "   tstb %%d0\n"
-+               "   jne 1b\n"
-+               "   jra 4f\n"
-+               "3:\n"
-+               "   addql #1,%0\n"
-+               "4:\n"
-+               "   addl %1,%0\n"
-+               "5:\n"
-+               ".section .fixup,\"ax\"\n"
-+               "   .even\n"
-+               "6: moveq %3,%0\n"
-+               "   jra 5b\n"
-+               ".previous\n"
-+               ".section __ex_table,\"a\"\n"
-+               "   .align 4\n"
-+               "   .long 2b,6b\n"
-+               "   .long 22b,6b\n"
-+               ".previous"
-+               : "=d"(res), "=a"(src), "=d"(n)
-+               : "i"(0), "0"(res), "1"(src), "2"(n)
-+               : "d0");
-+      return res;
-+}
-+EXPORT_SYMBOL(strnlen_user);
-+
-+
-+/*
-+ * Zero Userspace
-+ */
-+
-+unsigned long __clear_user(void *to, unsigned long n)
-+{
-+    __asm__ __volatile__
-+      ("   tstl %1\n"
-+       "   jeq 3f\n"
-+       "1: movel %3,(%0)+\n"
-+       "2: subql #1,%1\n"
-+       "   jne 1b\n"
-+       "3: movel %2,%1\n"
-+       "   bclr #1,%1\n"
-+       "   jeq 4f\n"
-+       "24:movew %3,(%0)+\n"
-+       "4: bclr #0,%1\n"
-+       "   jeq 5f\n"
-+       "25:moveb %3,(%0)+\n"
-+       "5:\n"
-+       ".section .fixup,\"ax\"\n"
-+       "   .even\n"
-+       "61:addql #1,%1\n"
-+       "6: lsll #2,%1\n"
-+       "   addl %2,%1\n"
-+       "   jra 5b\n"
-+       "7: addql #2,%1\n"
-+       "   jra 5b\n"
-+       "8: addql #1,%1\n"
-+       "   jra 5b\n"
-+       ".previous\n"
-+       ".section __ex_table,\"a\"\n"
-+       "   .align 4\n"
-+       "   .long 1b,61b\n"
-+       "   .long 2b,6b\n"
-+       "   .long 3b,61b\n"
-+       "   .long 24b,7b\n"
-+       "   .long 4b,7b\n"
-+       "   .long 25b,8b\n"
-+       "   .long 5b,8b\n"
-+       ".previous"
-+       : "=a"(to), "=d"(n)
-+       : "r"(n & 3), "d"(0), "0"(to), "1"(n/4));
-+    return n;
-+}
-+EXPORT_SYMBOL(__clear_user);
-+
-+#endif /* CONFIG_COLDFIRE */
-+
---- a/arch/m68k/Makefile
-+++ b/arch/m68k/Makefile
-@@ -16,7 +16,9 @@
- KBUILD_DEFCONFIG := amiga_defconfig
- # override top level makefile
-+ifndef CONFIG_COLDFIRE
- AS += -m68020
-+endif
- LDFLAGS := -m m68kelf
- LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
- ifneq ($(SUBARCH),$(ARCH))
-@@ -30,12 +32,18 @@ ifdef CONFIG_SUN3
- LDFLAGS_vmlinux = -N
- endif
-+ifdef CONFIG_COLDFIRE
-+# OBJCOPYFLAGS    := -R .note -R .note.gnu.build-id -R .comment -S
-+# LDFLAGS_vmlinux = --verbose
-+endif
-+
- CHECKFLAGS += -D__mc68000__
- # without -fno-strength-reduce the 53c7xx.c driver fails ;-(
- KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2
- # enable processor switch if compiled only for a single cpu
-+ifndef CONFIG_COLDFIRE
- ifndef CONFIG_M68020
- ifndef CONFIG_M68030
-@@ -49,6 +57,16 @@ endif
- endif
- endif
-+endif
-+
-+ifdef CONFIG_M5445X
-+KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
-+KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float  
-+endif
-+ifdef CONFIG_M547X_8X
-+KBUILD_CFLAGS += -mcfv4e -g
-+KBUILD_AFLAGS += -mcfv4e
-+endif
- ifdef CONFIG_KGDB
- # If configured for kgdb support, include debugging infos and keep the
-@@ -57,8 +75,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po
- endif
- ifndef CONFIG_SUN3
-+ifndef CONFIG_COLDFIRE
- head-y := arch/m68k/kernel/head.o
- else
-+head-y := arch/m68k/coldfire/head.o
-+endif
-+else
- head-y := arch/m68k/kernel/sun3-head.o
- endif
-@@ -79,6 +101,7 @@ core-$(CONFIG_SUN3)         += arch/m68k/sun3/      
- core-$(CONFIG_M68040)         += arch/m68k/fpsp040/
- core-$(CONFIG_M68060)         += arch/m68k/ifpsp060/
- core-$(CONFIG_M68KFPU_EMU)    += arch/m68k/math-emu/
-+core-$(CONFIG_COLDFIRE)               += arch/m68k/coldfire/
- all:  zImage
---- a/arch/m68k/mm/cache.c
-+++ b/arch/m68k/mm/cache.c
-@@ -10,7 +10,11 @@
- #include <asm/pgalloc.h>
- #include <asm/traps.h>
-+#ifdef CONFIG_COLDFIRE
-+#include <asm/cfcache.h>
-+#endif /* CONFIG_COLDFIRE */
-+#ifndef CONFIG_COLDFIRE
- static unsigned long virt_to_phys_slow(unsigned long vaddr)
- {
-       if (CPU_IS_060) {
-@@ -69,11 +73,18 @@ static unsigned long virt_to_phys_slow(u
-       }
-       return 0;
- }
-+#endif /* CONFIG_COLDFIRE */
-+
- /* Push n pages at kernel virtual address and clear the icache */
- /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
- void flush_icache_range(unsigned long address, unsigned long endaddr)
- {
-+#ifdef CONFIG_COLDFIRE
-+// JKM -- hack until new cpushl stuff is in
-+//    cf_icache_flush_range(address, endaddr);
-+      flush_icache();
-+#else /* !CONFIG_COLDFIRE */
-       if (CPU_IS_040_OR_060) {
-               address &= PAGE_MASK;
-@@ -94,9 +105,11 @@ void flush_icache_range(unsigned long ad
-                             : "=&d" (tmp)
-                             : "di" (FLUSH_I));
-       }
-+#endif /* CONFIG_COLDFIRE */
- }
- EXPORT_SYMBOL(flush_icache_range);
-+#ifndef CONFIG_COLDFIRE
- void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
-                            unsigned long addr, int len)
- {
-@@ -115,4 +128,5 @@ void flush_icache_user_range(struct vm_a
-                             : "di" (FLUSH_I));
-       }
- }
-+#endif /* CONFIG_COLDFIRE */
---- /dev/null
-+++ b/arch/m68k/mm/cf-mmu.c
-@@ -0,0 +1,260 @@
-+/*
-+ * linux/arch/m68k/mm/cf-mmu.c
-+ *
-+ * Based upon linux/arch/m68k/mm/sun3mmu.c
-+ * Based upon linux/arch/ppc/mm/mmu_context.c
-+ *
-+ * Implementations of mm routines specific to the Coldfire MMU.
-+ *
-+ * Copyright (c) 2008 Freescale Semiconductor, Inc.
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/swap.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#ifdef CONFIG_BLK_DEV_RAM
-+#include <linux/blkdev.h>
-+#endif
-+#include <linux/bootmem.h>
-+
-+#include <asm/setup.h>
-+#include <asm/uaccess.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/machdep.h>
-+#include <asm/io.h>
-+#include <asm/mmu_context.h>
-+#include <asm/cf_pgalloc.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/tlbflush.h>
-+
-+#define KMAPAREA(x)   ((x >= VMALLOC_START) && ( x < KMAP_END))
-+
-+#undef DEBUG
-+
-+mm_context_t next_mmu_context;
-+unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
-+
-+atomic_t nr_free_contexts;
-+struct mm_struct *context_mm[LAST_CONTEXT+1];
-+void steal_context(void);
-+
-+
-+const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";
-+
-+extern unsigned long empty_bad_page_table;
-+extern unsigned long empty_bad_page;
-+extern unsigned long num_pages;
-+
-+extern char __init_begin, __init_end;
-+
-+void free_initmem(void)
-+{
-+#if 0
-+      unsigned long addr;
-+      unsigned long start = (unsigned long)&__init_begin;
-+      unsigned long end = (unsigned long)&__init_end;
-+
-+      printk(KERN_INFO "free_initmem: __init_begin = 0x%lx  __init_end = 0x%lx\n", start, end);
-+
-+      addr = (unsigned long)&__init_begin;
-+      for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) {
-+              /* not currently used */
-+              virt_to_page(addr)->flags &= ~(1 << PG_reserved);
-+              init_page_count(virt_to_page(addr));
-+              free_page(addr);
-+              totalram_pages++;
-+      }
-+#endif
-+}
-+
-+/* Coldfire paging_init derived from sun3 */
-+void __init paging_init(void)
-+{
-+      pgd_t * pg_dir;
-+      pte_t * pg_table;
-+      int i;
-+      unsigned long address;
-+      unsigned long next_pgtable;
-+      unsigned long bootmem_end;
-+      unsigned long zones_size[MAX_NR_ZONES];
-+      unsigned long size;
-+      enum zone_type zone;
-+
-+      empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE);
-+      memset((void *)empty_zero_page, 0, PAGE_SIZE);
-+
-+      pg_dir = swapper_pg_dir;
-+      memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir));
-+
-+      size = num_pages * sizeof(pte_t);  
-+      size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1);
-+      next_pgtable = (unsigned long)alloc_bootmem_pages(size);
-+
-+      bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; 
-+      pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; 
-+
-+      address = PAGE_OFFSET;
-+      while (address < (unsigned long)high_memory) 
-+      {
-+              pg_table = (pte_t *)next_pgtable; 
-+              next_pgtable += PTRS_PER_PTE * sizeof (pte_t);
-+              pgd_val(*pg_dir) = (unsigned long) pg_table;
-+              pg_dir++;
-+
-+              /* now change pg_table to kernel virtual addresses */
-+              for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table)
-+              {
-+                      pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT);
-+                      if (address >= (unsigned long)high_memory)
-+                              pte_val (pte) = 0;
-+
-+                      set_pte (pg_table, pte);
-+                      address += PAGE_SIZE;
-+              }
-+      }
-+      
-+      current->mm = NULL;
-+
-+      /* clear zones */
-+      for (zone = 0; zone < MAX_NR_ZONES; zone++)
-+              zones_size[zone] = 0x0;
-+
-+      /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */
-+      /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the
-+       * allocator is being a bit challenging */
-+        zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT;
-+
-+      /* allocate the rest to NORMAL - head.S marks them CACHE */
-+      zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0];
-+
-+      free_area_init(zones_size);
-+}
-+
-+
-+int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)
-+{
-+        struct mm_struct *mm;
-+        pgd_t *pgd;
-+        pmd_t *pmd;
-+        pte_t *pte;
-+        unsigned long mmuar;
-+        int asid;
-+      int flags;
-+
-+      local_save_flags(flags);
-+      local_irq_disable();
-+
-+      mmuar = ( dtlb ) ? regs->mmuar
-+                       : regs->pc + (extension_word * sizeof(long));
-+
-+        mm = (!user_mode(regs) && KMAPAREA(mmuar)) ? &init_mm : current->mm;
-+
-+        if (!mm) {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }
-+
-+        pgd = pgd_offset(mm, mmuar);
-+        if (pgd_none(*pgd))  {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }
-+          
-+      pmd = pmd_offset(pgd, mmuar);
-+      if (pmd_none(*pmd)) {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }       
-+    
-+      pte = (KMAPAREA(mmuar)) ? pte_offset_kernel(pmd, mmuar)
-+                             : pte_offset_map(pmd, mmuar);
-+      if (pte_none(*pte) || !pte_present(*pte)) {
-+          local_irq_restore(flags);
-+          return (-1);                
-+      }
-+
-+      if (write) {
-+            if (!pte_write(*pte)) {
-+              local_irq_restore(flags);
-+              return (-1);
-+          }
-+          set_pte(pte, pte_mkdirty(*pte));
-+      }
-+      
-+        set_pte(pte, pte_mkyoung(*pte));
-+        asid = mm->context & 0xff;
-+        if (!pte_dirty(*pte) && !KMAPAREA(mmuar))
-+          set_pte(pte, pte_wrprotect(*pte));
-+
-+        *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
-+               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT)
-+               | MMUTR_V;
-+
-+        *MMUDR = (pte_val(*pte) & PAGE_MASK) 
-+             | ((pte->pte) & CF_PAGE_MMUDR_MASK)
-+               | MMUDR_SZ8K | MMUDR_X;
-+          
-+      if ( dtlb )
-+          *MMUOR = MMUOR_ACC | MMUOR_UAA;
-+      else
-+          *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA;
-+
-+      asm("nop");
-+
-+#ifdef DEBUG
-+      printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
-+                (pte_val(*pte)  & PAGE_MASK));
-+#endif
-+      local_irq_restore(flags);
-+        return (0);
-+}
-+
-+
-+/* The following was taken from arch/ppc/mmu_context.c
-+ *
-+ * Initialize the context management stuff.
-+ */
-+void __init mmu_context_init(void)
-+{
-+      /*
-+       * Some processors have too few contexts to reserve one for
-+       * init_mm, and require using context 0 for a normal task.
-+       * Other processors reserve the use of context zero for the kernel.
-+       * This code assumes FIRST_CONTEXT < 32.
-+       */
-+      context_map[0] = (1 << FIRST_CONTEXT) - 1;
-+      next_mmu_context = FIRST_CONTEXT;
-+      atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1);
-+}
-+
-+/*
-+ * Steal a context from a task that has one at the moment.
-+ * This is only used on 8xx and 4xx and we presently assume that
-+ * they don't do SMP.  If they do then thicfpgalloc.hs will have to check
-+ * whether the MM we steal is in use.
-+ * We also assume that this is only used on systems that don't
-+ * use an MMU hash table - this is true for 8xx and 4xx.
-+ * This isn't an LRU system, it just frees up each context in
-+ * turn (sort-of pseudo-random replacement :).  This would be the
-+ * place to implement an LRU scheme if anyone was motivated to do it.
-+ *  -- paulus
-+ */
-+void steal_context(void)
-+{
-+      struct mm_struct *mm;
-+      /* free up context `next_mmu_context' */
-+      /* if we shouldn't free context 0, don't... */
-+      if (next_mmu_context < FIRST_CONTEXT)
-+              next_mmu_context = FIRST_CONTEXT;
-+      mm = context_mm[next_mmu_context];
-+      flush_tlb_mm(mm);
-+      destroy_context(mm);
-+}
---- /dev/null
-+++ b/arch/m68k/mm/cf-mmu.c.orig
-@@ -0,0 +1,265 @@
-+/*
-+ * linux/arch/m68k/mm/cf-mmu.c
-+ *
-+ * Based upon linux/arch/m68k/mm/sun3mmu.c
-+ * Based upon linux/arch/ppc/mm/mmu_context.c
-+ *
-+ * Implementations of mm routines specific to the Coldfire MMU.
-+ *
-+ * Copyright (c) 2008 Freescale Semiconductor, Inc.
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/swap.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#ifdef CONFIG_BLK_DEV_RAM
-+#include <linux/blkdev.h>
-+#endif
-+#include <linux/bootmem.h>
-+
-+#include <asm/setup.h>
-+#include <asm/uaccess.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/machdep.h>
-+#include <asm/io.h>
-+#include <asm/mmu_context.h>
-+#include <asm/cf_pgalloc.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/tlbflush.h>
-+
-+#if PAGE_OFFSET == CONFIG_SDRAM_BASE
-+#define       KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE)))
-+#else
-+#define       KERNRAM(x) (x >= PAGE_OFFSET)
-+#endif
-+
-+mm_context_t next_mmu_context;
-+unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
-+
-+atomic_t nr_free_contexts;
-+struct mm_struct *context_mm[LAST_CONTEXT+1];
-+void steal_context(void);
-+
-+
-+const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";
-+
-+extern unsigned long empty_bad_page_table;
-+extern unsigned long empty_bad_page;
-+extern unsigned long num_pages;
-+
-+extern char __init_begin, __init_end;
-+
-+void free_initmem(void)
-+{
-+#if 0
-+      unsigned long addr;
-+      unsigned long start = (unsigned long)&__init_begin;
-+      unsigned long end = (unsigned long)&__init_end;
-+
-+/* 
-+ * JKM -- revisit -- the latest round of vmlinux.lds changes has caused
-+ * a little grief with how init areas are handled.  With the new toolchain
-+ * release I'll fix this.
-+ */
-+      printk(KERN_INFO "free_initmem: __init_begin = 0x%lx  __init_end = 0x%lx\n", start, end);
-+
-+      addr = (unsigned long)&__init_begin;
-+      for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) {
-+              /* not currently used */
-+              virt_to_page(addr)->flags &= ~(1 << PG_reserved);
-+              init_page_count(virt_to_page(addr));
-+              free_page(addr);
-+              totalram_pages++;
-+      }
-+#endif
-+}
-+
-+/* Coldfire paging_init derived from sun3 */
-+void __init paging_init(void)
-+{
-+      pgd_t * pg_dir;
-+      pte_t * pg_table;
-+      int i;
-+      unsigned long address;
-+      unsigned long next_pgtable;
-+      unsigned long bootmem_end;
-+      unsigned long zones_size[MAX_NR_ZONES];
-+      unsigned long size;
-+      enum zone_type zone;
-+
-+      empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE);
-+      memset((void *)empty_zero_page, 0, PAGE_SIZE);
-+
-+      pg_dir = swapper_pg_dir;
-+      memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir));
-+
-+      size = num_pages * sizeof(pte_t);  
-+      size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1);
-+      next_pgtable = (unsigned long)alloc_bootmem_pages(size);
-+
-+      bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; 
-+      pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; 
-+
-+      address = PAGE_OFFSET;
-+      while (address < (unsigned long)high_memory) 
-+      {
-+              pg_table = (pte_t *)next_pgtable; 
-+              next_pgtable += PTRS_PER_PTE * sizeof (pte_t);
-+              pgd_val(*pg_dir) = (unsigned long) pg_table;
-+              pg_dir++;
-+
-+              /* now change pg_table to kernel virtual addresses */
-+              for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table)
-+              {
-+                      pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT);
-+                      if (address >= (unsigned long)high_memory)
-+                              pte_val (pte) = 0;
-+
-+                      set_pte (pg_table, pte);
-+                      address += PAGE_SIZE;
-+              }
-+      }
-+      
-+      current->mm = NULL;
-+
-+      /* clear zones */
-+      for (zone = 0; zone < MAX_NR_ZONES; zone++)
-+              zones_size[zone] = 0x0;
-+
-+      /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */
-+      /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the
-+       * allocator is being a bit challenging */
-+        zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT;
-+
-+      /* allocate the rest to NORMAL - head.S marks them CACHE */
-+      zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0];
-+
-+      free_area_init(zones_size);
-+}
-+
-+
-+int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)
-+{
-+        struct mm_struct *mm;
-+        pgd_t *pgd;
-+        pmd_t *pmd;
-+        pte_t *pte;
-+        unsigned long mmuar;
-+        int asid;
-+      int flags;
-+
-+      local_save_flags(flags);
-+      local_irq_disable();
-+
-+      mmuar = ( dtlb ) ? regs->mmuar
-+                       : regs->pc + (extension_word * sizeof(long));
-+
-+        mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm;
-+
-+        if (!mm) {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }
-+
-+        pgd = pgd_offset(mm, mmuar);
-+        if (pgd_none(*pgd))  {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }
-+          
-+      pmd = pmd_offset(pgd, mmuar);
-+      if (pmd_none(*pmd)) {
-+          local_irq_restore(flags);
-+          return (-1);
-+      }       
-+    
-+      pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar)
-+                             : pte_offset_map(pmd, mmuar);
-+      if (pte_none(*pte) || !pte_present(*pte)) {
-+          local_irq_restore(flags);
-+          return (-1);                
-+      }
-+
-+      if (write) {
-+            if (!pte_write(*pte)) {
-+              local_irq_restore(flags);
-+              return (-1);
-+          }
-+          set_pte(pte, pte_mkdirty(*pte));
-+      }
-+      
-+        set_pte(pte, pte_mkyoung(*pte));
-+        asid = mm->context & 0xff;
-+        if (!pte_dirty(*pte) && !KERNRAM(mmuar))
-+          set_pte(pte, pte_wrprotect(*pte));
-+
-+        *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
-+               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT)
-+               | MMUTR_V;
-+
-+        *MMUDR = (pte_val(*pte) & PAGE_MASK) 
-+             | ((pte->pte) & CF_PAGE_MMUDR_MASK)
-+               | MMUDR_SZ8K | MMUDR_X;
-+          
-+      if ( dtlb )
-+          *MMUOR = MMUOR_ACC | MMUOR_UAA;
-+      else
-+          *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA;
-+
-+      asm("nop");
-+
-+      /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
-+                (pte_val(*pte)  & PAGE_MASK));*/
-+      local_irq_restore(flags);
-+        return (0);
-+}
-+
-+
-+/* The following was taken from arch/ppc/mmu_context.c
-+ *
-+ * Initialize the context management stuff.
-+ */
-+void __init mmu_context_init(void)
-+{
-+      /*
-+       * Some processors have too few contexts to reserve one for
-+       * init_mm, and require using context 0 for a normal task.
-+       * Other processors reserve the use of context zero for the kernel.
-+       * This code assumes FIRST_CONTEXT < 32.
-+       */
-+      context_map[0] = (1 << FIRST_CONTEXT) - 1;
-+      next_mmu_context = FIRST_CONTEXT;
-+      atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1);
-+}
-+
-+/*
-+ * Steal a context from a task that has one at the moment.
-+ * This is only used on 8xx and 4xx and we presently assume that
-+ * they don't do SMP.  If they do then thicfpgalloc.hs will have to check
-+ * whether the MM we steal is in use.
-+ * We also assume that this is only used on systems that don't
-+ * use an MMU hash table - this is true for 8xx and 4xx.
-+ * This isn't an LRU system, it just frees up each context in
-+ * turn (sort-of pseudo-random replacement :).  This would be the
-+ * place to implement an LRU scheme if anyone was motivated to do it.
-+ *  -- paulus
-+ */
-+void steal_context(void)
-+{
-+      struct mm_struct *mm;
-+      /* free up context `next_mmu_context' */
-+      /* if we shouldn't free context 0, don't... */
-+      if (next_mmu_context < FIRST_CONTEXT)
-+              next_mmu_context = FIRST_CONTEXT;
-+      mm = context_mm[next_mmu_context];
-+      flush_tlb_mm(mm);
-+      destroy_context(mm);
-+}
---- a/arch/m68k/mm/hwtest.c
-+++ b/arch/m68k/mm/hwtest.c
-@@ -25,6 +25,7 @@
- #include <linux/module.h>
-+#ifndef CONFIG_COLDFIRE
- int hwreg_present( volatile void *regp )
- {
-     int       ret = 0;
-@@ -82,4 +83,5 @@ int hwreg_write( volatile void *regp, un
-       return( ret );
- }
- EXPORT_SYMBOL(hwreg_write);
-+#endif
---- a/arch/m68k/mm/init.c
-+++ b/arch/m68k/mm/init.c
-@@ -122,7 +122,6 @@ void __init mem_init(void)
-       if (MACH_IS_ATARI)
-               atari_stram_mem_init_hook();
- #endif
--
-       /* this will put all memory onto the freelists */
-       totalram_pages = num_physpages = 0;
-       for_each_online_pgdat(pgdat) {
-@@ -146,7 +145,7 @@ void __init mem_init(void)
-               }
-       }
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
-       /* insert pointer tables allocated so far into the tablelist */
-       init_pointer_table((unsigned long)kernel_pg_dir);
-       for (i = 0; i < PTRS_PER_PGD; i++) {
---- a/arch/m68k/mm/kmap.c
-+++ b/arch/m68k/mm/kmap.c
-@@ -24,7 +24,11 @@
- #undef DEBUG
-+#ifndef CONFIG_COLDFIRE
- #define PTRTREESIZE   (256*1024)
-+#else
-+#define PTRTREESIZE     PAGE_SIZE
-+#endif
- /*
-  * For 040/060 we can use the virtual memory area like other architectures,
-@@ -50,7 +54,11 @@ static inline void free_io_area(void *ad
- #else
-+#ifdef CONFIG_COLDFIRE
-+#define IO_SIZE         PAGE_SIZE
-+#else
- #define IO_SIZE               (256*1024)
-+#endif
- static struct vm_struct *iolist;
-@@ -125,8 +133,34 @@ void __iomem *__ioremap(unsigned long ph
-       }
- #endif
-+#ifdef CONFIG_M5445X
-+      if (physaddr >= 0xf0000000) {
-+              /*
-+               * On the M5445x processors an ACR is setup to map
-+               * the 0xF0000000 range into kernel memory as
-+               * non-cacheable.
-+               */
-+              return (void __iomem *)physaddr;
-+      }
-+#endif
-+
-+#ifdef CONFIG_M547X_8X
-+      if (physaddr >= 0xf0000000) {
-+              /*
-+               * On the M547x/M548x processors an ACR is setup to map
-+               * the 0xF0000000 range into kernel memory as
-+               * non-cacheable.
-+               */
-+              return (void __iomem *)physaddr;
-+      }
-+        if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) {
-+                printk("ioremap:PCI 0x%lx,0x%lx(%d) - PCI area hit\n", physaddr, size, cacheflag);
-+                return (void *)physaddr;
-+        }
-+#endif
-+
- #ifdef DEBUG
--      printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag);
-+      printk("ioremap: paddr=0x%lx,size=0x%lx(%d) - ", physaddr, size, cacheflag);
- #endif
-       /*
-        * Mappings have to be aligned
-@@ -145,7 +179,7 @@ void __iomem *__ioremap(unsigned long ph
-       virtaddr = (unsigned long)area->addr;
-       retaddr = virtaddr + offset;
- #ifdef DEBUG
--      printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr);
-+      printk(" paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx", physaddr, virtaddr, retaddr);
- #endif
-       /*
-@@ -170,7 +204,12 @@ void __iomem *__ioremap(unsigned long ph
-                       break;
-               }
-       } else {
-+#ifndef CONFIG_COLDFIRE
-               physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
-+#else
-+              physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \
-+                           _PAGE_READWRITE);
-+#endif
-               switch (cacheflag) {
-               case IOMAP_NOCACHE_SER:
-               case IOMAP_NOCACHE_NONSER:
-@@ -249,7 +288,12 @@ void __iounmap(void *addr, unsigned long
-       pgd_t *pgd_dir;
-       pmd_t *pmd_dir;
-       pte_t *pte_dir;
--
-+#ifdef CONFIG_M547X_8X
-+        if ((addr >= (void*)0xd0000000) && (addr + size < (void*)0xd800ffff)) {
-+                printk("%s: PCI address\n",__FUNCTION__);
-+                return;
-+        }
-+#endif
-       while ((long)size > 0) {
-               pgd_dir = pgd_offset_k(virtaddr);
-               if (pgd_bad(*pgd_dir)) {
---- a/arch/m68k/mm/Makefile
-+++ b/arch/m68k/mm/Makefile
-@@ -6,3 +6,4 @@ obj-y          := cache.o init.o fault.o hwtest.
- obj-$(CONFIG_MMU_MOTOROLA)    += kmap.o memory.o motorola.o
- obj-$(CONFIG_MMU_SUN3)                += sun3kmap.o sun3mmu.o
-+obj-$(CONFIG_MMU_CFV4E)               += cf-mmu.o kmap.o memory.o
---- a/arch/m68k/mm/memory.c
-+++ b/arch/m68k/mm/memory.c
-@@ -127,6 +127,7 @@ int free_pointer_table (pmd_t *ptable)
-       return 0;
- }
-+#ifndef CONFIG_COLDFIRE
- /* invalidate page in both caches */
- static inline void clear040(unsigned long paddr)
- {
-@@ -173,6 +174,7 @@ static inline void pushcl040(unsigned lo
-               clear040(paddr);
-       local_irq_restore(flags);
- }
-+#endif /* CONFIG_COLDFIRE */
- /*
-  * 040: Hit every page containing an address in the range paddr..paddr+len-1.
-@@ -203,6 +205,11 @@ static inline void pushcl040(unsigned lo
- void cache_clear (unsigned long paddr, int len)
- {
-+#ifdef CONFIG_COLDFIRE
-+// JKM -- revise to use proper caching
-+//    cf_cache_clear(paddr, len);
-+      flush_bcache();
-+#else
-     if (CPU_IS_040_OR_060) {
-       int tmp;
-@@ -237,6 +244,7 @@ void cache_clear (unsigned long paddr, i
-     if(mach_l2_flush)
-       mach_l2_flush(0);
- #endif
-+#endif /* CONFIG_COLDFIRE */
- }
- EXPORT_SYMBOL(cache_clear);
-@@ -250,6 +258,11 @@ EXPORT_SYMBOL(cache_clear);
- void cache_push (unsigned long paddr, int len)
- {
-+#ifdef CONFIG_COLDFIRE
-+// JKM -- revise to use proper caching
-+//    cf_cache_push(paddr, len);
-+      flush_bcache();
-+#else
-     if (CPU_IS_040_OR_060) {
-       int tmp = PAGE_SIZE;
-@@ -290,6 +303,7 @@ void cache_push (unsigned long paddr, in
-     if(mach_l2_flush)
-       mach_l2_flush(1);
- #endif
-+#endif /* CONFIG_COLDFIRE */
- }
- EXPORT_SYMBOL(cache_push);
---- a/drivers/ata/Kconfig
-+++ b/drivers/ata/Kconfig
-@@ -6,7 +6,7 @@ menuconfig ATA
-       tristate "Serial ATA (prod) and Parallel ATA (experimental) drivers"
-       depends on HAS_IOMEM
-       depends on BLOCK
--      depends on !(M32R || M68K) || BROKEN
-+      depends on !M32R || BROKEN
-       depends on !SUN4 || BROKEN
-       select SCSI
-       ---help---
-@@ -679,4 +679,13 @@ config PATA_BF54X
-         If unsure, say N.
-+config PATA_FSL
-+      tristate "Freescale on-chip PATA support"
-+      depends on (ARCH_MX3 || ARCH_MX27 || PPC_512x || M54455)
-+      help
-+        On Freescale processors, say Y here if you wish to use the on-chip
-+        ATA interface.
-+
-+        If you are unsure, say N to this.
-+
- endif # ATA
---- a/drivers/ata/Makefile
-+++ b/drivers/ata/Makefile
-@@ -1,4 +1,3 @@
--
- obj-$(CONFIG_ATA)             += libata.o
- obj-$(CONFIG_SATA_AHCI)               += ahci.o
-@@ -71,6 +70,7 @@ obj-$(CONFIG_PATA_BF54X)     += pata_bf54x.o
- obj-$(CONFIG_PATA_PLATFORM)   += pata_platform.o
- obj-$(CONFIG_PATA_OF_PLATFORM)        += pata_of_platform.o
- obj-$(CONFIG_PATA_ICSIDE)     += pata_icside.o
-+obj-$(CONFIG_PATA_FSL)                += pata_fsl.o
- # Should be last but two libata driver
- obj-$(CONFIG_PATA_ACPI)               += pata_acpi.o
- # Should be last but one libata driver
---- /dev/null
-+++ b/drivers/ata/pata_fsl.c
-@@ -0,0 +1,814 @@
-+/*
-+ * Freescale integrated PATA driver
-+ */
-+
-+/*
-+ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/blkdev.h>
-+#include <scsi/scsi_host.h>
-+#include <linux/ata.h>
-+#include <linux/libata.h>
-+#include <linux/platform_device.h>
-+#include <linux/fsl_devices.h>
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+#include <asm/dma.h>
-+#endif
-+
-+#define DRV_NAME "pata_fsl"
-+#define DRV_VERSION "1.0"
-+
-+#ifdef CONFIG_M54455
-+#define WRITE_ATA8(val, reg)                  \
-+      __raw_writeb(val, (ata_regs + reg));
-+#define WRITE_ATA16(val, reg)                 \
-+      __raw_writew(val, (ata_regs + reg));
-+#else
-+#define WRITE_ATA8(val, reg)                  \
-+      __raw_writel(val, (ata_regs + reg));
-+#define WRITE_ATA16(val, reg)                 \
-+      __raw_writel(val, (ata_regs + reg));
-+#endif
-+
-+struct pata_fsl_priv {
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      int ultra;
-+#endif
-+      u8 *fsl_ata_regs;
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      int dma_rchan;
-+      int dma_wchan;
-+      int dma_done;
-+      int dma_dir;
-+#endif
-+};
-+
-+enum {
-+      /* various constants */
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      FSL_ATA_MAX_SG_LEN      = 65534,
-+#endif
-+
-+      /* offsets to registers */
-+
-+      FSL_ATA_TIMING_REGS     = 0x00,
-+      FSL_ATA_FIFO_FILL       = 0x20,
-+      FSL_ATA_CONTROL         = 0x24,
-+      FSL_ATA_INT_PEND        = 0x28,
-+      FSL_ATA_INT_EN          = 0x2C,
-+      FSL_ATA_INT_CLEAR       = 0x30,
-+      FSL_ATA_FIFO_ALARM      = 0x34,
-+      FSL_ATA_DRIVE_DATA      = 0xA0,
-+      FSL_ATA_DRIVE_CONTROL   = 0xD8,
-+
-+      /* bits within FSL_ATA_CONTROL */
-+
-+      FSL_ATA_CTRL_FIFO_RST_B    = 0x80,
-+      FSL_ATA_CTRL_ATA_RST_B     = 0x40,
-+      FSL_ATA_CTRL_FIFO_TX_EN    = 0x20,
-+      FSL_ATA_CTRL_FIFO_RCV_EN   = 0x10,
-+      FSL_ATA_CTRL_DMA_PENDING   = 0x08,
-+      FSL_ATA_CTRL_DMA_ULTRA     = 0x04,
-+      FSL_ATA_CTRL_DMA_WRITE     = 0x02,
-+      FSL_ATA_CTRL_IORDY_EN      = 0x01,
-+
-+      /* bits within the interrupt control registers */
-+
-+      FSL_ATA_INTR_ATA_INTRQ1      = 0x80,
-+      FSL_ATA_INTR_FIFO_UNDERFLOW  = 0x40,
-+      FSL_ATA_INTR_FIFO_OVERFLOW   = 0x20,
-+      FSL_ATA_INTR_CTRL_IDLE       = 0x10,
-+      FSL_ATA_INTR_ATA_INTRQ2      = 0x08,
-+};
-+
-+/*
-+ * This structure contains the timing parameters for
-+ * ATA bus timing in the 5 PIO modes.  The timings
-+ * are in nanoseconds, and are converted to clock
-+ * cycles before being stored in the ATA controller
-+ * timing registers.
-+ */
-+static struct {
-+      short t0, t1, t2_8, t2_16, t2i, t4, t9, tA;
-+} pio_specs[] = {
-+      [0] = {
-+              .t0 = 600, .t1 = 70, .t2_8 = 290, .t2_16 = 165, .t2i = 0,
-+              .t4 = 30,.t9 = 20,.tA = 50
-+      },
-+      [1] = {
-+              .t0 = 383, .t1 = 50, .t2_8 = 290, .t2_16 = 125, .t2i = 0,
-+              .t4 = 20, .t9 = 15, .tA = 50
-+      },
-+      [2] = {
-+              .t0 = 240, .t1 = 30, .t2_8 = 290, .t2_16 = 100, .t2i = 0,
-+              .t4 = 15, .t9 = 10, .tA = 50
-+      },
-+      [3] = {
-+              .t0 = 180, .t1 = 30, .t2_8 = 80, .t2_16 = 80, .t2i = 0,
-+              .t4 = 10, .t9 = 10, .tA = 50
-+      },
-+      [4] = {
-+              .t0 = 120, .t1 = 25, .t2_8 = 70, .t2_16 = 70, .t2i = 0,
-+              .t4 = 10, .t9 = 10, .tA = 50
-+      },
-+};
-+
-+#define NR_PIO_SPECS (sizeof pio_specs / sizeof pio_specs[0])
-+
-+/*
-+ * This structure contains the timing parameters for
-+ * ATA bus timing in the 3 MDMA modes.  The timings
-+ * are in nanoseconds, and are converted to clock
-+ * cycles before being stored in the ATA controller
-+ * timing registers.
-+ */
-+static struct {
-+      short t0M, tD, tH, tJ, tKW, tM, tN, tJNH;
-+} mdma_specs[] = {
-+      [0] = {
-+              .t0M = 480, .tD = 215, .tH = 20, .tJ = 20, .tKW = 215,
-+              .tM = 50, .tN = 15, .tJNH = 20
-+      },
-+      [1] = {
-+              .t0M = 150, .tD = 80, .tH = 15, .tJ = 5, .tKW = 50,
-+              .tM = 30, .tN = 10, .tJNH = 15
-+      },
-+      [2] = {
-+              .t0M = 120, .tD = 70, .tH = 10, .tJ = 5, .tKW = 25,
-+              .tM = 25, .tN = 10, .tJNH = 10
-+      },
-+};
-+
-+#define NR_MDMA_SPECS (sizeof mdma_specs / sizeof mdma_specs[0])
-+
-+/*
-+ * This structure contains the timing parameters for
-+ * ATA bus timing in the 6 UDMA modes.  The timings
-+ * are in nanoseconds, and are converted to clock
-+ * cycles before being stored in the ATA controller
-+ * timing registers.
-+ */
-+static struct {
-+      short t2CYC, tCYC, tDS, tDH, tDVS, tDVH, tCVS, tCVH, tFS_min, tLI_max,
-+          tMLI, tAZ, tZAH, tENV_min, tSR, tRFS, tRP, tACK, tSS, tDZFS;
-+} udma_specs[] = {
-+      [0] = {
-+              .t2CYC = 235, .tCYC = 114, .tDS = 15, .tDH = 5, .tDVS = 70,
-+              .tDVH = 6, .tCVS = 70, .tCVH = 6, .tFS_min = 0,
-+              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 50, .tRFS = 75, .tRP = 160,
-+              .tACK = 20, .tSS = 50, .tDZFS = 80
-+      },
-+      [1] = {
-+              .t2CYC = 156, .tCYC = 75, .tDS = 10, .tDH = 5, .tDVS = 48,
-+              .tDVH = 6, .tCVS = 48, .tCVH = 6, .tFS_min = 0,
-+              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 30, .tRFS = 70, .tRP = 125,
-+              .tACK = 20, .tSS = 50, .tDZFS = 63
-+      },
-+      [2] = {
-+              .t2CYC = 117, .tCYC = 55, .tDS = 7, .tDH = 5, .tDVS = 34,
-+              .tDVH = 6, .tCVS = 34, .tCVH = 6, .tFS_min = 0,
-+              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100,
-+              .tACK = 20, .tSS = 50, .tDZFS = 47
-+      },
-+      [3] = {
-+              .t2CYC = 86, .tCYC = 39, .tDS = 7, .tDH = 5, .tDVS = 20,
-+              .tDVH = 6, .tCVS = 20, .tCVH = 6, .tFS_min = 0,
-+              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100,
-+              .tACK = 20, .tSS = 50, .tDZFS = 35
-+      },
-+      [4] = {
-+              .t2CYC = 57, .tCYC = 25, .tDS = 5, .tDH = 5, .tDVS = 7,
-+              .tDVH = 6, .tCVS = 7, .tCVH = 6, .tFS_min = 0,
-+              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 50, .tRFS = 60, .tRP = 100,
-+              .tACK = 20, .tSS = 50, .tDZFS = 25
-+      },
-+      [5] = {
-+              .t2CYC = 38, .tCYC = 17, .tDS = 4, .tDH = 5, .tDVS = 5,
-+              .tDVH = 6, .tCVS = 10, .tCVH = 10, .tFS_min = 0,
-+              .tLI_max = 75, .tMLI = 20, .tAZ = 10, .tZAH = 20,
-+              .tENV_min = 20, .tSR = 20, .tRFS = 50, .tRP = 85,
-+              .tACK = 20, .tSS = 50, .tDZFS = 40
-+      },
-+};
-+
-+#define NR_UDMA_SPECS (sizeof udma_specs / sizeof udma_specs[0])
-+
-+struct fsl_ata_time_regs {
-+      u8 time_off, time_on, time_1, time_2w;
-+      u8 time_2r, time_ax, time_pio_rdx, time_4;
-+      u8 time_9, time_m, time_jn, time_d;
-+      u8 time_k, time_ack, time_env, time_rpx;
-+      u8 time_zah, time_mlix, time_dvh, time_dzfs;
-+      u8 time_dvs, time_cvh, time_ss, time_cyc;
-+};
-+
-+static void update_timing_config(struct fsl_ata_time_regs *tp, struct ata_host *host)
-+{
-+      u32 *lp = (u32 *)tp;
-+      struct pata_fsl_priv *priv = host->private_data;
-+      u32 *ctlp = (u32 *)priv->fsl_ata_regs;
-+      int i;
-+
-+      /* 
-+       * JKM - this could have endianess issues on BE depending
-+       * on how the controller is glued to the bus -- probably
-+       * should rewrite this to write byte at a time.
-+       */
-+      for (i = 0; i < 5; i++) {
-+              __raw_writel(*lp, ctlp);
-+              lp++;
-+              ctlp++;
-+      }
-+      mb();
-+}
-+
-+/*!
-+ * Calculate values for the ATA bus timing registers and store
-+ * them into the hardware.
-+ *
-+ * @param       xfer_mode   specifies XFER xfer_mode
-+ * @param       pdev        specifies platform_device
-+ *
-+ * @return      EINVAL      speed out of range, or illegal mode
-+ */
-+static int set_ata_bus_timing(u8 xfer_mode, struct platform_device *pdev)
-+{
-+      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
-+                                           pdev->dev.platform_data;
-+      struct ata_host *host = dev_get_drvdata(&pdev->dev);
-+
-+      /* get the bus clock cycle time, in ns */
-+      int T = 1 * 1000 * 1000 * 1000 / plat->get_clk_rate();
-+      struct fsl_ata_time_regs tr = {0};
-+      DPRINTK("clk_rate = %d  T = %d\n",plat->get_clk_rate(), T);
-+
-+      /*
-+       * every mode gets the same t_off and t_on
-+       */
-+      tr.time_off = 3;
-+      tr.time_on = 3;
-+
-+      if (xfer_mode >= XFER_UDMA_0) {
-+              int speed = xfer_mode - XFER_UDMA_0;
-+              if (speed >= NR_UDMA_SPECS) {
-+                      return -EINVAL;
-+              }
-+              tr.time_ack = (udma_specs[speed].tACK + T) / T;
-+              tr.time_env = (udma_specs[speed].tENV_min + T) / T;
-+              tr.time_rpx = (udma_specs[speed].tRP + T) / T + 2;
-+
-+              tr.time_zah = (udma_specs[speed].tZAH + T) / T;
-+              tr.time_mlix = (udma_specs[speed].tMLI + T) / T;
-+              tr.time_dvh = (udma_specs[speed].tDVH + T) / T + 1;
-+              tr.time_dzfs = (udma_specs[speed].tDZFS + T) / T;
-+
-+              tr.time_dvs = (udma_specs[speed].tDVS + T) / T;
-+              tr.time_cvh = (udma_specs[speed].tCVH + T) / T;
-+              tr.time_ss = (udma_specs[speed].tSS + T) / T;
-+              tr.time_cyc = (udma_specs[speed].tCYC + T) / T;
-+      } else if (xfer_mode >= XFER_MW_DMA_0) {
-+              int speed = xfer_mode - XFER_MW_DMA_0;
-+              if (speed >= NR_MDMA_SPECS) {
-+                      return -EINVAL;
-+              }
-+              tr.time_m = (mdma_specs[speed].tM + T) / T;
-+              tr.time_jn = (mdma_specs[speed].tJNH + T) / T;
-+              tr.time_d = (mdma_specs[speed].tD + T) / T;
-+
-+              tr.time_k = (mdma_specs[speed].tKW + T) / T;
-+      } else {
-+              int speed = xfer_mode - XFER_PIO_0;
-+              if (speed >= NR_PIO_SPECS) {
-+                      return -EINVAL;
-+              }
-+              tr.time_1 = (pio_specs[speed].t1 + T) / T;
-+              tr.time_2w = (pio_specs[speed].t2_8 + T) / T;
-+
-+              tr.time_2r = (pio_specs[speed].t2_8 + T) / T;
-+              tr.time_ax = (pio_specs[speed].tA + T) / T + 2;
-+              tr.time_pio_rdx = 1;
-+              tr.time_4 = (pio_specs[speed].t4 + T) / T;
-+
-+              tr.time_9 = (pio_specs[speed].t9 + T) / T;
-+      }
-+
-+      update_timing_config(&tr, host);
-+
-+      return 0;
-+}
-+
-+static void pata_fsl_set_piomode(struct ata_port *ap, struct ata_device *adev)
-+{
-+      set_ata_bus_timing(adev->pio_mode, to_platform_device(ap->dev));
-+}
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+static void pata_fsl_set_dmamode(struct ata_port *ap, struct ata_device *adev)
-+{
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+
-+      priv->ultra = adev->dma_mode >= XFER_UDMA_0;
-+
-+      set_ata_bus_timing(adev->dma_mode, to_platform_device(ap->dev));
-+}
-+#endif
-+
-+static int pata_fsl_port_start(struct ata_port *ap)
-+{
-+      return 0;
-+}
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+static void dma_callback(void *arg, int error_status, unsigned int count)
-+{
-+      struct ata_port *ap = arg;
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+      u8 *ata_regs = priv->fsl_ata_regs;
-+
-+      priv->dma_done = 1;
-+      /* 
-+       * DMA is finished, so unmask INTRQ from the drive to allow the
-+       * normal ISR to fire.
-+       */
-+#if 0
-+      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
-+#else
-+      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
-+#endif
-+      mb();
-+}
-+
-+static void pata_fsl_bmdma_setup(struct ata_queued_cmd *qc)
-+{
-+      int nr_sg = 0;
-+      int chan;
-+      int dma_mode = 0, dma_ultra;
-+      u8 ata_control;
-+      struct ata_port *ap = qc->ap;
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+      u8 *ata_regs = priv->fsl_ata_regs;
-+      struct fsl_ata_platform_data *plat = ap->dev->platform_data;
-+      struct scatterlist tmp[plat->max_sg], *tsg, *sg;
-+      int err;
-+
-+      DPRINTK("ENTER\n");
-+
-+      priv->dma_dir = qc->dma_dir;
-+
-+      /*
-+       * Configure the on-chip ATA interface hardware.
-+       */
-+      dma_ultra = priv->ultra ?
-+              FSL_ATA_CTRL_DMA_ULTRA : 0;
-+
-+      ata_control = FSL_ATA_CTRL_FIFO_RST_B |
-+                    FSL_ATA_CTRL_ATA_RST_B |
-+                    FSL_ATA_CTRL_DMA_PENDING |
-+                    dma_ultra;
-+
-+      if (qc->dma_dir == DMA_TO_DEVICE) {
-+              chan = priv->dma_wchan;
-+              ata_control |= FSL_ATA_CTRL_FIFO_TX_EN |
-+                            FSL_ATA_CTRL_DMA_WRITE;
-+              dma_mode = DMA_MODE_WRITE;
-+      } else {
-+              chan = priv->dma_rchan;
-+              ata_control |= FSL_ATA_CTRL_FIFO_RCV_EN;
-+              dma_mode = DMA_MODE_READ;
-+      }
-+#if 0
-+      __raw_writel(ata_control, ata_regs + FSL_ATA_CONTROL);
-+      __raw_writel(plat->fifo_alarm, ata_regs + FSL_ATA_FIFO_ALARM);
-+      __raw_writel(FSL_ATA_INTR_ATA_INTRQ1, ata_regs + FSL_ATA_INT_EN);
-+#else
-+      WRITE_ATA8(ata_control, FSL_ATA_CONTROL);
-+      WRITE_ATA8(plat->fifo_alarm, FSL_ATA_FIFO_ALARM);
-+      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ1, FSL_ATA_INT_EN);
-+#endif
-+      mb();
-+
-+      /*
-+       * Set up the DMA completion callback.
-+       */
-+      mxc_dma_callback_set(chan, dma_callback, (void *)ap);
-+
-+      /*
-+       * Copy the sg list to an array.
-+       */
-+      tsg = tmp;
-+      ata_for_each_sg(sg, qc) {
-+              memcpy(tsg, sg, sizeof *sg);
-+              tsg++;
-+              nr_sg++;
-+      }
-+      
-+      err = mxc_dma_sg_config(chan, tmp, nr_sg, 0, dma_mode);
-+      if (err) {
-+              printk(KERN_ERR "pata_fsl_bmdma_setup: error %d\n", err);
-+      }
-+      DPRINTK("EXIT\n");
-+}
-+
-+static void pata_fsl_bmdma_start(struct ata_queued_cmd *qc)
-+{
-+      struct ata_port *ap = qc->ap;
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+      int chan;
-+      int err;
-+
-+      /*
-+       * Start the channel.
-+       */
-+      chan = qc->dma_dir == DMA_TO_DEVICE ? priv->dma_wchan : priv->dma_rchan;
-+
-+      priv->dma_done = 0;
-+
-+      err = mxc_dma_enable(chan);
-+      if (err) {
-+              printk(KERN_ERR "%s: : error %d\n", __func__, err);
-+      }
-+
-+      ap->ops->exec_command(ap, &qc->tf);
-+}
-+
-+static void pata_fsl_bmdma_stop(struct ata_queued_cmd *qc)
-+{
-+      struct ata_port *ap = qc->ap;
-+
-+      /* do a dummy read as in ata_bmdma_stop */
-+      ata_altstatus(ap);
-+}
-+
-+static u8 pata_fsl_bmdma_status(struct ata_port *ap)
-+{
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+
-+      return priv->dma_done ? ATA_DMA_INTR : 0;
-+}
-+
-+static void pata_fsl_dma_init(struct ata_port *ap)
-+{
-+      struct pata_fsl_priv *priv = ap->host->private_data;
-+
-+      priv->dma_rchan = -1;
-+      priv->dma_wchan = -1;
-+
-+      priv->dma_rchan = mxc_dma_request(MXC_DMA_ATA_RX, "MXC ATA RX");
-+      if (priv->dma_rchan < 0) {
-+              dev_printk(KERN_ERR, ap->dev, "couldn't get RX DMA channel\n");
-+              goto err_out;
-+      }
-+
-+      priv->dma_wchan = mxc_dma_request(MXC_DMA_ATA_TX, "MXC ATA TX");
-+      if (priv->dma_wchan < 0) {
-+              dev_printk(KERN_ERR, ap->dev, "couldn't get TX DMA channel\n");
-+              goto err_out;
-+      }       
-+
-+      dev_printk(KERN_ERR, ap->dev, "rchan=%d wchan=%d\n", priv->dma_rchan,
-+                 priv->dma_wchan);
-+      return;
-+
-+err_out:
-+      ap->mwdma_mask = 0;
-+      ap->udma_mask = 0;
-+      mxc_dma_free(priv->dma_rchan);
-+      mxc_dma_free(priv->dma_wchan);
-+      kfree(priv);
-+}
-+#endif /* CONFIG_FSL_PATA_USE_DMA */
-+
-+static void ata_dummy_noret(struct ata_port *ap) { return; }
-+
-+static struct scsi_host_template pata_fsl_sht = {
-+      .module                 = THIS_MODULE,
-+      .name                   = DRV_NAME,
-+      .ioctl                  = ata_scsi_ioctl,
-+      .queuecommand           = ata_scsi_queuecmd,
-+      .can_queue              = ATA_DEF_QUEUE,
-+      .this_id                = ATA_SHT_THIS_ID,
-+      .sg_tablesize           = LIBATA_MAX_PRD,
-+      .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
-+      .emulated               = ATA_SHT_EMULATED,
-+      .use_clustering         = ATA_SHT_USE_CLUSTERING,
-+      .proc_name              = DRV_NAME,
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      .dma_boundary           = FSL_ATA_MAX_SG_LEN,
-+#endif
-+      .slave_configure        = ata_scsi_slave_config,
-+      .slave_destroy          = ata_scsi_slave_destroy,
-+      .bios_param             = ata_std_bios_param,
-+};
-+
-+static struct ata_port_operations pata_fsl_port_ops = {
-+      .set_piomode            = pata_fsl_set_piomode,
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      .set_dmamode            = pata_fsl_set_dmamode,
-+#endif
-+
-+      .tf_load                = ata_tf_load,
-+      .tf_read                = ata_tf_read,
-+      .check_status           = ata_check_status,
-+      .exec_command           = ata_exec_command,
-+      .dev_select             = ata_std_dev_select,
-+
-+      .freeze                 = ata_bmdma_freeze,
-+      .thaw                   = ata_bmdma_thaw,
-+      .error_handler          = ata_bmdma_error_handler,
-+      .post_internal_cmd      = ata_bmdma_post_internal_cmd,
-+      .cable_detect           = ata_cable_unknown,
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      .bmdma_setup            = pata_fsl_bmdma_setup,
-+      .bmdma_start            = pata_fsl_bmdma_start,
-+#endif
-+
-+      .qc_prep                = ata_noop_qc_prep,
-+      .qc_issue               = ata_qc_issue_prot,
-+
-+      .data_xfer              = ata_data_xfer_noirq,
-+
-+      .irq_clear              = ata_dummy_noret,
-+      .irq_on                 = ata_irq_on,
-+
-+      .port_start             = pata_fsl_port_start,
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      .bmdma_stop             = pata_fsl_bmdma_stop,
-+      .bmdma_status           = pata_fsl_bmdma_status,
-+#endif
-+};
-+
-+static void fsl_setup_port(struct ata_ioports *ioaddr)
-+{
-+      unsigned int shift = 2;
-+
-+      ioaddr->data_addr       = ioaddr->cmd_addr + (ATA_REG_DATA    << shift);
-+      ioaddr->error_addr      = ioaddr->cmd_addr + (ATA_REG_ERR     << shift);
-+      ioaddr->feature_addr    = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
-+      ioaddr->nsect_addr      = ioaddr->cmd_addr + (ATA_REG_NSECT   << shift);
-+      ioaddr->lbal_addr       = ioaddr->cmd_addr + (ATA_REG_LBAL    << shift);
-+      ioaddr->lbam_addr       = ioaddr->cmd_addr + (ATA_REG_LBAM    << shift);
-+      ioaddr->lbah_addr       = ioaddr->cmd_addr + (ATA_REG_LBAH    << shift);
-+      ioaddr->device_addr     = ioaddr->cmd_addr + (ATA_REG_DEVICE  << shift);
-+      ioaddr->status_addr     = ioaddr->cmd_addr + (ATA_REG_STATUS  << shift);
-+      ioaddr->command_addr    = ioaddr->cmd_addr + (ATA_REG_CMD     << shift);
-+}
-+
-+/**
-+ *    pata_fsl_probe          -       attach a platform interface
-+ *    @pdev: platform device
-+ *
-+ *    Register a platform bus integrated ATA host controller
-+ *
-+ *    The 3 platform device resources are used as follows:
-+ *
-+ *            - I/O Base (IORESOURCE_MEM) virt. addr. of ATA controller regs
-+ *            - CTL Base (IORESOURCE_MEM) unused
-+ *            - IRQ      (IORESOURCE_IRQ) platform IRQ assigned to ATA
-+ *
-+ */
-+static int __devinit pata_fsl_probe(struct platform_device *pdev)
-+{
-+      struct resource *io_res;
-+      struct ata_host *host;
-+      struct ata_port *ap;
-+      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
-+                                           pdev->dev.platform_data;
-+      struct pata_fsl_priv *priv;
-+      u8 *ata_regs;
-+      int ret;
-+
-+      DPRINTK("ENTER\n");
-+      /* 
-+       * Get an ata_host structure for this device
-+       */
-+      host = ata_host_alloc(&pdev->dev, 1);
-+      if (!host)
-+              return -ENOMEM;
-+      ap = host->ports[0];
-+
-+      /* 
-+       * Allocate private data
-+       */
-+      priv = kzalloc(sizeof (struct pata_fsl_priv), GFP_KERNEL);
-+      if(priv == NULL) {
-+              /* free(host); */
-+              return -ENOMEM;
-+      }
-+      host->private_data = priv;
-+
-+      /*
-+       * Set up resources
-+       */
-+      if (unlikely(pdev->num_resources != 3)) {
-+              dev_err(&pdev->dev, "invalid number of resources\n");
-+              return -EINVAL;
-+      }
-+
-+      io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      ata_regs = (u8 *)io_res->start;
-+      priv->fsl_ata_regs = ata_regs;
-+      ap->ioaddr.cmd_addr = (void *)(ata_regs + FSL_ATA_DRIVE_DATA);
-+      ap->ioaddr.ctl_addr = (void *)(ata_regs + FSL_ATA_DRIVE_CONTROL);
-+      ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
-+      ap->ops = &pata_fsl_port_ops;
-+      ap->pio_mask = 0x7F;
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      ap->mwdma_mask = 0x7F;
-+      ap->udma_mask = plat->udma_mask;
-+      pata_fsl_sht.sg_tablesize = plat->max_sg;
-+#else
-+      ap->mwdma_mask = 0x00;
-+      ap->udma_mask = 0x00;
-+#endif
-+      fsl_setup_port(&ap->ioaddr);
-+
-+      /*
-+       * Do platform-specific initialization (e.g. allocate pins,
-+       * turn on clock).  After this call it is assumed that
-+       * plat->get_clk_rate() can be called to calculate
-+       * timing.
-+       */
-+      if (plat->init && plat->init(pdev)) {
-+              /* REVISIT: don't leak what ata_host_alloc() allocated */
-+              return -ENODEV;
-+      }
-+
-+      /* Deassert the reset bit to enable the interface */
-+      WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL);
-+      mb();
-+
-+      /* Set initial timing and mode */
-+      set_ata_bus_timing(XFER_PIO_4, pdev);
-+
-+#ifdef CONFIG_FSL_PATA_USE_DMA
-+      /* get DMA ready */
-+      pata_fsl_dma_init(ap);
-+#endif
-+
-+      /*
-+       * Enable the ATA INTRQ interrupt from the bus, but
-+       * only allow the CPU to see it (INTRQ2) at this point.
-+       * INTRQ1, which goes to the DMA, will be enabled later.
-+       */
-+#if 0
-+      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
-+#else
-+      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
-+#endif
-+      mb();
-+
-+      /* activate */
-+      ret = ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt,
-+                               0, &pata_fsl_sht);
-+      DPRINTK("EXIT ret=%d\n", ret);
-+      return ret;
-+}
-+
-+/**
-+ *    pata_fsl_remove -       unplug a platform interface
-+ *    @pdev: platform device
-+ *
-+ *    A platform bus ATA device has been unplugged. Perform the needed
-+ *    cleanup. Also called on module unload for any active devices.
-+ */
-+static int __devexit pata_fsl_remove(struct platform_device *pdev)
-+{
-+      struct device *dev = &pdev->dev;
-+      struct ata_host *host = dev_get_drvdata(dev);
-+      struct pata_fsl_priv *priv = host->private_data;
-+      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
-+                                           pdev->dev.platform_data;
-+      u8 *ata_regs = priv->fsl_ata_regs;
-+
-+#if 0
-+      __raw_writel(0, ata_regs + FSL_ATA_INT_EN);  /* Disable interrupts */
-+#else
-+      WRITE_ATA8(0, FSL_ATA_INT_EN); /* Disable interrupts */
-+#endif
-+      mb();
-+
-+      ata_host_detach(host);
-+
-+      if (plat->exit)
-+              plat->exit();
-+
-+      kfree(priv);
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+static int pata_fsl_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct ata_host *host = dev_get_drvdata(&pdev->dev);
-+      struct pata_fsl_priv *priv = host->private_data;
-+      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
-+                                           pdev->dev.platform_data;
-+      u8 *ata_regs = priv->fsl_ata_regs;
-+
-+      /* Disable interrupts. */
-+#if 0
-+      __raw_writel(0, ata_regs + FSL_ATA_INT_EN);
-+#else
-+      WRITE_ATA8(0, FSL_ATA_INT_EN);
-+#endif
-+      mb();
-+
-+      if (plat->exit)
-+              plat->exit();
-+
-+      return 0;
-+}
-+
-+static int pata_fsl_resume(struct platform_device *pdev)
-+{
-+      struct ata_host *host = dev_get_drvdata(&pdev->dev);
-+      struct pata_fsl_priv *priv = host->private_data;
-+      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
-+                                           pdev->dev.platform_data;
-+      u8 *ata_regs = priv->fsl_ata_regs;
-+
-+      if (plat->init && plat->init(pdev)) {
-+              return -ENODEV;
-+      }
-+
-+      /* Deassert the reset bit to enable the interface */
-+#if 0
-+      __raw_writel(FSL_ATA_CTRL_ATA_RST_B, ata_regs + FSL_ATA_CONTROL);
-+#else
-+      WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL);
-+#endif
-+      mb();
-+
-+      /* Set initial timing and mode */
-+      set_ata_bus_timing(XFER_PIO_4, pdev);
-+
-+      /*
-+       * Enable hardware interrupts.
-+       */
-+#if 0
-+      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
-+#else
-+      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
-+#endif
-+      mb();
-+
-+      return 0;
-+}
-+#endif
-+
-+static struct platform_driver pata_fsl_driver = {
-+      .probe          = pata_fsl_probe,
-+      .remove         = __devexit_p(pata_fsl_remove),
-+#ifdef CONFIG_PM
-+      .suspend        = pata_fsl_suspend,
-+      .resume         = pata_fsl_resume,
-+#endif
-+      .driver = {
-+              .name           = DRV_NAME,
-+              .owner          = THIS_MODULE,
-+      },
-+};
-+
-+static int __init pata_fsl_init(void)
-+{
-+      int ret;
-+
-+      DPRINTK("ENTER\n");
-+      ret = platform_driver_register(&pata_fsl_driver);
-+      DPRINTK("EXIT ret=%d\n", ret);
-+      return ret;
-+}
-+
-+static void __exit pata_fsl_exit(void)
-+{
-+      platform_driver_unregister(&pata_fsl_driver);
-+}
-+module_init(pata_fsl_init);
-+module_exit(pata_fsl_exit);
-+
-+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
-+MODULE_DESCRIPTION("low-level driver for Freescale ATA");
-+MODULE_LICENSE("GPL");
-+MODULE_VERSION(DRV_VERSION);
---- a/drivers/crypto/Kconfig
-+++ b/drivers/crypto/Kconfig
-@@ -60,6 +60,69 @@ config CRYPTO_DEV_GEODE
-         To compile this driver as a module, choose M here: the module
-         will be called geode-aes.
-+config CRYPTO_DEV_MCFCAU
-+      bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)"
-+      depends on M5445X
-+      select CRYPTO_ALGAPI
-+      help
-+        The cryptographic acceleration unit (CAU) is a ColdFire coprocessor
-+        implementing a set of specialized operations in hardware. For example, you can
-+        find it on MCF5445X.
-+
-+config CRYPTO_DEV_MCFCAU_DES
-+      tristate "DES and Triple DES cipher algorithms (MCF5445X)"
-+      depends on CRYPTO_DEV_MCFCAU
-+      select CRYPTO_ALGAPI
-+      select CRYPTO_BLKCIPHER
-+      help
-+        DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
-+        
-+        Say 'Y' here to use the CAU coprocessor for 
-+        the CryptoAPI DES and 3DES alogrithms.
-+                
-+        To compile this driver as a module, choose M here: the module
-+        will be called mcfcau-des.
-+
-+config CRYPTO_DEV_MCFCAU_AES
-+      tristate "AES cipher algorithm (MCF5445X)"
-+      depends on CRYPTO_DEV_MCFCAU
-+      select CRYPTO_ALGAPI
-+      select CRYPTO_BLKCIPHER
-+      help
-+        AES cipher algorithm (FIPS 197).
-+
-+        Say 'Y' here to use the CAU coprocessor for
-+        the CryptoAPI AES alogrithm.
-+
-+        To compile this driver as a module, choose M here: the module
-+        will be called mcfcau-aes.
-+
-+config CRYPTO_DEV_MCFCAU_MD5
-+      tristate "MD5 digest algorithm (MCF5445X)"
-+      depends on CRYPTO_DEV_MCFCAU
-+      select CRYPTO_ALGAPI
-+      help
-+        MD5 message digest algorithm (RFC1321).
-+
-+        Say 'Y' here to use the CAU coprocessor for
-+        the CryptoAPI MD5 alogrithm.
-+
-+        To compile this driver as a module, choose M here: the module
-+        will be called mcfcau-md5.
-+
-+config CRYPTO_DEV_MCFCAU_SHA1
-+      tristate "SHA1 digest algorithm (MCF5445X)"
-+      depends on CRYPTO_DEV_MCFCAU
-+      select CRYPTO_ALGAPI
-+      help
-+        SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
-+
-+        Say 'Y' here to use the CAU coprocessor for
-+        the CryptoAPI SHA1 alogrithm.
-+
-+        To compile this driver as a module, choose M here: the module
-+        will be called mcfcau-sha1.
-+
- config ZCRYPT
-       tristate "Support for PCI-attached cryptographic adapters"
-       depends on S390
---- a/drivers/crypto/Makefile
-+++ b/drivers/crypto/Makefile
-@@ -2,3 +2,8 @@ obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += 
- obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o
- obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o
- obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o
-+obj-$(CONFIG_CRYPTO_DEV_MCFCAU) += mcfcau.o
-+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_DES) += mcfcau-des.o
-+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_AES) += mcfcau-aes.o
-+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_MD5) += mcfcau-md5.o
-+obj-$(CONFIG_CRYPTO_DEV_MCFCAU_SHA1) += mcfcau-sha1.o
---- /dev/null
-+++ b/drivers/crypto/mcfcau-aes.c
-@@ -0,0 +1,311 @@
-+ /***************************************************************************
-+ * mcfcau-aes.c - Implementation of AES Cipher Algorithm
-+ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      17 September 2007       Andrey Butok
-+ *            Initial Release - developed on 2.6.20 Linux kernel.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/crypto.h>
-+
-+/*
-+#undef DEBUG
-+#define DEBUG 1
-+*/
-+
-+#include "mcfcau.h"
-+
-+#define MCFCAU_AES_MIN_KEY_SIZE       (16)
-+#define MCFCAU_AES_MAX_KEY_SIZE       (32)
-+#define MCFCAU_AES_BLOCK_SIZE (16)
-+
-+#define       MCFCAU_AES_DRIVER_DESC          "AES ColdFire CAU driver"
-+#define       MCFCAU_AES_DRIVER_VERSION       "v0.01"
-+
-+struct mcfcau_aes_ctx {
-+      int Nr_1;
-+      u32 buf[120];
-+      u32 buf_tmp[16];
-+};
-+
-+static u32 mcfcau_rco_tab[10]={ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
-+                              0x10000000, 0x20000000, 0x40000000, 0x80000000,
-+                              0x1b000000, 0x36000000};
-+
-+int mcfcau_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
-+                     unsigned int key_len)
-+{
-+      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-+      const u32 * key = (const u32 *)in_key;
-+      u32 *flags = &tfm->crt_flags;
-+      u32 i;
-+      u32* key_sch = (&ctx->buf[0]);
-+      u32 * temp_p, * rcon_p;
-+      u32 Nx;
-+      u32 Nk;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      if (key_len % 8) {
-+              *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
-+              return -EINVAL;
-+      }
-+
-+      Nk = key_len>>2;
-+
-+      for(i=0;i<Nk;i++){
-+              key_sch[i] = key[i];
-+      }
-+
-+      ctx->Nr_1 = Nk+5;
-+
-+      /* Key Expansion */
-+      temp_p=&key_sch[Nk-1];
-+      rcon_p=&mcfcau_rco_tab[0];
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      asm volatile ("move.l   %0, %%a1"::"m"(temp_p):"a1");
-+      asm volatile ("move.l   %0, %%a3"::"m"(rcon_p):"a3");
-+      asm volatile ("move.l   %0, %%a4"::"m"(key_sch):"a4");
-+
-+      Nx=(Nk+7)<<2; /* (Nr+1)*Nb */
-+
-+      for(i=Nk; i<Nx; i++)
-+      {
-+              /* temp = key_sch[Nk-1] */
-+              asm volatile ("cp0ld.l  (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");
-+
-+              if(i%Nk==0){
-+                      asm volatile ("moveq    #8, %%d0":::"d0");
-+                      /* CAA=RotWord(temp) */
-+                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA):"d0");
-+                      /* SubWord(CAA) */
-+                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_AESS+MCFCAU_CAA));
-+                      /* ACC xor rcon[i/Nk] */
-+                      asm volatile ("cp0ld.l  (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a3");
-+
-+              }else if((Nk>6) && (i%Nk ==4)){
-+                      /* SubWord(ACC) */
-+                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_AESS+MCFCAU_CAA));
-+              }
-+
-+              /* key_sch[i]^=key_sch[i-Nk]; store ACC to key_sch[i] */
-+              asm volatile ("cp0ld.l  (%%a4)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a4");
-+              asm volatile ("cp0st.l  %%d0,(%%a1),#1,%0"      ::"n"(MCFCAU_STR+MCFCAU_CAA));
-+      }
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+
-+      return 0;
-+}
-+
-+
-+/* encrypt a block of text */
-+static void mcfcau_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
-+{
-+      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-+      const int Nr_1 = ctx->Nr_1;
-+
-+      u32* key_sch = &(ctx->buf[0]);
-+      u32 i;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+      asm("move.l     %0, %%a1"::"m"(in):"a1");
-+      asm("move.l     %0, %%a0"::"m"(key_sch):"a0");
-+      /* state=in */
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");
-+      /* AddRoundKey() */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
-+
-+      for(i=Nr_1;i>0;i--){
-+              /* SubBytes(state) */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3));
-+              /* ShiftRows(state) */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR));
-+              /* MixColumns(state); AddRoundKey() */
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA0):"a0");
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA1):"a0");
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA2):"a0");
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA3):"a0");
-+      }
-+      /* SubBytes(state)*/
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3));
-+      /* ShiftRows(state) */
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR));
-+      /* AddRoundKey() */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
-+      /* out = state */
-+      asm("move.l     %0, %%a1"               ::"m"(out):"a1");
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1");
-+
-+      asm("move.l     %%d0,(%%a1)+":::"a1");
-+      asm("move.l     %%d1,(%%a1)+":::"a1");
-+
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+
-+      asm("move.l     %%d0,(%%a1)+":::"a1");
-+      asm("move.l     %%d1,(%%a1)+":::"a1");
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+
-+/* decrypt a block of text */
-+static void mcfcau_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
-+{
-+      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-+      u32* key_sch = &(ctx->buf[0]);
-+      u32 i;
-+      unsigned long iflags;
-+      const int Nr_1 = ctx->Nr_1;
-+      key_sch=&key_sch[(Nr_1+2)*4];
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      asm("move.l     %0, %%a1"::"m"(in):"a1");
-+      asm("move.l     %0, %%a0"::"m"(key_sch):"a0");
-+      /* state=in */
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");
-+      /* AddRoundKey() */
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
-+
-+      for(i=Nr_1;i>0;i--){
-+              /* InvShiftRows(state) */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR));
-+              /* InvSubBytes(state) */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0));
-+              /* InvMixColumns(state); AddRoundKey() */
-+              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA3):"a0");
-+              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA2):"a0");
-+              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA1):"a0");
-+              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA0):"a0");
-+      }
-+      /* InvShiftRows(state) */
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR));
-+      /* InvSubBytes(state)*/
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0));
-+      /* AddRoundKey() */
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
-+      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
-+      /* out = state */
-+      asm("move.l     %0, %%a1"               ::"m"(out):"a1");
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1");
-+
-+      asm("move.l     %%d0,(%%a1)+":::"a1");
-+      asm("move.l     %%d1,(%%a1)+":::"a1");
-+
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+
-+      asm("move.l     %%d0,(%%a1)+":::"a1");
-+      asm("move.l     %%d1,(%%a1)+":::"a1");
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+
-+}
-+
-+
-+static struct crypto_alg mcfcau_aes_alg = {
-+      .cra_name               =       "aes",
-+      .cra_driver_name        =       "aes-mcfcau",
-+      .cra_priority           =       MCFCAU_CRA_PRIORITY,
-+      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
-+      .cra_blocksize          =       MCFCAU_AES_BLOCK_SIZE,
-+      .cra_ctxsize            =       sizeof(struct mcfcau_aes_ctx),
-+      .cra_alignmask          =       3,
-+      .cra_module             =       THIS_MODULE,
-+      .cra_list               =       LIST_HEAD_INIT(mcfcau_aes_alg.cra_list),
-+      .cra_u                  =       {
-+              .cipher = {
-+                      .cia_min_keysize        =       MCFCAU_AES_MIN_KEY_SIZE,
-+                      .cia_max_keysize        =       MCFCAU_AES_MAX_KEY_SIZE,
-+                      .cia_setkey             =       mcfcau_aes_setkey,
-+                      .cia_encrypt            =       mcfcau_aes_encrypt,
-+                      .cia_decrypt            =       mcfcau_aes_decrypt
-+              }
-+      }
-+};
-+
-+static int __init mcfcau_aes_init(void)
-+{
-+      int ret = crypto_register_alg(&mcfcau_aes_alg);
-+
-+      printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " "
-+              MCFCAU_AES_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
-+      return ret;
-+}
-+
-+static void __exit mcfcau_aes_fini(void)
-+{
-+      crypto_unregister_alg(&mcfcau_aes_alg);
-+      printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " "
-+              MCFCAU_AES_DRIVER_VERSION " unregistered.\n");
-+}
-+
-+module_init(mcfcau_aes_init);
-+module_exit(mcfcau_aes_fini);
-+
-+MODULE_DESCRIPTION(MCFCAU_AES_DRIVER_DESC);
-+MODULE_LICENSE("Dual BSD/GPL");
-+MODULE_AUTHOR("Andrey Butok");
---- /dev/null
-+++ b/drivers/crypto/mcfcau.c
-@@ -0,0 +1,32 @@
-+/***************************************************************************
-+ * mcfcau.c - Implementation of DES & Triple DES EDE Cipher Algorithms
-+ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      28 September 2006       Andrey Butok
-+ *            Initial Release - developed on 2.6.20 Linux kernel.
-+ */
-+#include <linux/module.h>
-+
-+DEFINE_SPINLOCK(mcfcau_lock);
-+EXPORT_SYMBOL(mcfcau_lock);
---- /dev/null
-+++ b/drivers/crypto/mcfcau-des.c
-@@ -0,0 +1,437 @@
-+/***************************************************************************
-+ * mcfcau-des.c - Implementation of DES & Triple DES EDE Cipher Algorithms
-+ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      14 August 2007  Andrey Butok
-+ *            Initial Release - developed on 2.6.20 Linux kernel.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/crypto.h>
-+#include <linux/types.h>
-+
-+/*
-+#undef DEBUG
-+#define DEBUG 1
-+*/
-+
-+#include "mcfcau.h"
-+
-+#define MCFCAU_DES_KEY_SIZE           (8)
-+#define MCFCAU_DES_EXPKEY_WORDS               (32)
-+#define MCFCAU_DES_BLOCK_SIZE         (8)
-+
-+#define MCFCAU_DES3_EDE_KEY_SIZE      (3 * MCFCAU_DES_KEY_SIZE)
-+#define MCFCAU_DES3_EDE_EXPKEY_WORDS  (3 * MCFCAU_DES_EXPKEY_WORDS)
-+#define MCFCAU_DES3_EDE_BLOCK_SIZE    (MCFCAU_DES_BLOCK_SIZE)
-+
-+#define       MCFCAU_DES_DRIVER_DESC          "DES & 3DES ColdFire CAU driver"
-+#define       MCFCAU_DES_DRIVER_VERSION       "v0.01"
-+
-+struct mcfcau_des_ctx {
-+      u32 expkey[MCFCAU_DES_EXPKEY_WORDS];
-+};
-+
-+struct mcfcau_des3_ede_ctx {
-+      u32 expkey[MCFCAU_DES3_EDE_EXPKEY_WORDS];
-+};
-+
-+/* DES round operations */
-+static inline void mcfcau_des_encipher(void)
-+{
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSL1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1));
-+}
-+
-+static inline void mcfcau_des_decipher(void)
-+{
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK+MCFCAU_DC));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSR1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1));
-+}
-+
-+
-+static int mcfcau_des_setkey(struct crypto_tfm *tfm, const u8 *key_p,
-+                    unsigned int keylen)
-+{
-+      struct mcfcau_des_ctx *dctx = crypto_tfm_ctx(tfm);
-+      u32 *flags = &tfm->crt_flags;
-+      u32 * key = (u32 *) key_p;
-+
-+      DBG("\n");
-+
-+      /*
-+      * RFC2451: Weak key checks SHOULD be performed.
-+      *
-+      * FIPS 74:
-+      *   Keys having duals are keys which produce all zeros, all ones, or
-+      *   alternating zero-one patterns in the C and D registers after Permuted
-+      *   Choice 1 has operated on the key.
-+      *
-+      */
-+      if(*flags & CRYPTO_TFM_REQ_WEAK_KEY){ /* FIPS 74 */
-+              if(key[0]<0xE001E00l){
-+                      if(key[0]<0x1FE01FE0){
-+                              if(key[0]<0x01E001E0){
-+                                      if(((key[0]==0x01010101)&&(key[1]==0x01010101))||
-+                                              ((key[0]==0x011F011F)&&(key[1]==0x010E010E)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                              else{
-+                                      if(((key[0]==0x01E001E0)&&(key[1]==0x01F101F1))||
-+                                              ((key[0]==0x01FE01FE)&&(key[1]==0x01FE01FE)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                      }
-+                      else{
-+                              if(key[0]<0x1F1F1F1F){
-+                                      if(((key[0]==0x1FE01FE0)&&(key[1]==0x0EF10EF1))||
-+                                              ((key[0]==0x1F011F0l)&&(key[1]==0x0E010E01)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                              else{
-+                                      if(((key[0]==0x1F1F1F1F)&&(key[1]==0x0E0E0E0E))||
-+                                              ((key[0]==0x1FFE1FFE)&&(key[1]==0x0EFE0EFE)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                      }
-+              } else {
-+                      if(key[0]<0xFE01FE01){
-+                              if(key[0]<0xE0E0E0E0){
-+                                      if(((key[0]==0xE001E00l)&&(key[1]==0xF101F101))||
-+                                              ((key[0]==0xE01FE01F)&&(key[1]==0xF10EF10E)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                              else{
-+                                      if(((key[0]==0xE0E0E0E0)&&(key[1]==0xF1F1F1F1))||
-+                                              ((key[0]==0xE0FEE0FE)&&(key[1]==0xF1FEF1FE)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                      }
-+                      else{
-+                              if(key[0]<0xFEE0FEE0){
-+                                      if(((key[0]==0xFE01FE01)&&(key[1]==0xFE01FE01))||
-+                                              ((key[0]==0xFE1FFE1F)&&(key[1]==0xFE0EFE0E)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                              else{
-+                                      if(((key[0]==0xFEE0FEE0)&&(key[1]==0xFEF1FEF1))||
-+                                              ((key[0]==0xFEFEFEFE)&&(key[1]==0xFEFEFEFE)) )
-+                                              goto WEAK_KEY;
-+                              }
-+                      }
-+              }
-+      }
-+      memcpy(dctx->expkey, key_p, keylen);
-+      return 0;
-+WEAK_KEY:
-+      *flags |= CRYPTO_TFM_RES_WEAK_KEY;
-+      return -EINVAL;
-+}
-+
-+
-+void mcfcau_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
-+{
-+      struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm);
-+      u32 * des_key_tmp = ctx->expkey;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      asm("move.l     %0, %%a0"::"m"(src):"a0");
-+      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
-+
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_encipher();
-+
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
-+      asm("move.l     %d0,(%a1)+");
-+      asm("move.l     %d1,(%a1)");
-+
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+
-+void mcfcau_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
-+{
-+      struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm);
-+      u32 * des_key_tmp = ctx->expkey;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      asm("move.l     %0, %%a0"::"m"(src):"a0");
-+      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
-+
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_decipher();
-+
-+      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+      asm("move.l     %d0,(%a1)+");
-+      asm("move.l     %d1,(%a1)");
-+
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+
-+/*
-+ * RFC2451:
-+ *
-+ *   For DES-EDE3, there is no known need to reject weak or
-+ *   complementation keys.  Any weakness is obviated by the use of
-+ *   multiple keys.
-+ *
-+ *   However, if the first two or last two independent 64-bit keys are
-+ *   equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
-+ *   same as DES.  Implementers MUST reject keys that exhibit this
-+ *   property.
-+ *
-+ */
-+
-+static int mcfcau_des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key_p, unsigned int keylen)
-+{
-+      const u32 *key = (const u32 *)key_p;
-+      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
-+      u32 *flags = &tfm->crt_flags;
-+
-+DBG("\n");
-+
-+      if (unlikely(!((key[0] ^ key[2]) | (key[1] ^ key[3])) ||
-+                   !((key[2] ^ key[4]) | (key[3] ^ key[5]))))
-+      {
-+              *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
-+              return -EINVAL;
-+      }
-+
-+      memcpy(dctx->expkey,key_p,keylen);
-+
-+      return 0;
-+}
-+
-+static void mcfcau_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
-+{
-+      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
-+      const u32 * des_key_tmp = dctx->expkey;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      /*EK1*/
-+      asm("move.l     %0, %%a0"::"m"(src):"a0");
-+      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
-+
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
-+
-+      mcfcau_des_encipher();
-+
-+      /*DK2*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
-+
-+      mcfcau_des_decipher();
-+
-+      /*EK3*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_encipher();
-+
-+      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+      asm("move.l     %d0,(%a1)+");
-+      asm("move.l     %d1,(%a1)");
-+
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+static void mcfcau_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
-+{
-+      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
-+      const u32 * des_key_tmp = dctx->expkey + 6 - 2;
-+      unsigned long iflags;
-+
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+
-+      /*DK3*/
-+      asm("move.l     %0, %%a0"::"m"(src):"a0");
-+      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
-+
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_decipher();
-+
-+      /*EK2*/
-+      asm("suba.l     #12,%a1");      /*dec key pointer*/
-+
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_encipher();
-+
-+      /*DK1*/
-+      asm("suba.l     #12,%a1");      /*dec key pointer*/
-+
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
-+      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
-+
-+      mcfcau_des_decipher();
-+
-+      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
-+      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
-+      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
-+      asm("move.l     %d0,(%a1)+");
-+      asm("move.l     %d1,(%a1)");
-+
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+
-+static struct crypto_alg mcfcau_des_alg = {
-+      .cra_name               =       "des",
-+      .cra_driver_name        =       "des-mcfcau",
-+      .cra_priority           =       MCFCAU_CRA_PRIORITY,
-+      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
-+      .cra_blocksize          =       MCFCAU_DES_BLOCK_SIZE,
-+      .cra_ctxsize            =       sizeof(struct mcfcau_des_ctx),
-+      .cra_module             =       THIS_MODULE,
-+      .cra_alignmask          =       3,
-+      .cra_list               =       LIST_HEAD_INIT(mcfcau_des_alg.cra_list),
-+      .cra_u                  =       { .cipher = {
-+      .cia_min_keysize        =       MCFCAU_DES_KEY_SIZE,
-+      .cia_max_keysize        =       MCFCAU_DES_KEY_SIZE,
-+      .cia_setkey             =       mcfcau_des_setkey,
-+      .cia_encrypt            =       mcfcau_des_encrypt,
-+      .cia_decrypt            =       mcfcau_des_decrypt } }
-+};
-+
-+static struct crypto_alg mcfcau_des3_ede_alg = {
-+      .cra_name               =       "des3_ede",
-+      .cra_driver_name        =       "des3_ede-mcfcau",
-+      .cra_priority           =       MCFCAU_CRA_PRIORITY,
-+      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
-+      .cra_blocksize          =       MCFCAU_DES3_EDE_BLOCK_SIZE,
-+      .cra_ctxsize            =       sizeof(struct mcfcau_des3_ede_ctx),
-+      .cra_module             =       THIS_MODULE,
-+      .cra_alignmask          =       3,
-+      .cra_list               =       LIST_HEAD_INIT(mcfcau_des3_ede_alg.cra_list),
-+      .cra_u                  =       { .cipher = {
-+      .cia_min_keysize        =       MCFCAU_DES3_EDE_KEY_SIZE,
-+      .cia_max_keysize        =       MCFCAU_DES3_EDE_KEY_SIZE,
-+      .cia_setkey             =       mcfcau_des3_ede_setkey,
-+      .cia_encrypt            =       mcfcau_des3_ede_encrypt,
-+      .cia_decrypt            =       mcfcau_des3_ede_decrypt } }
-+};
-+
-+MODULE_ALIAS("mcfcau_des3_ede");
-+
-+static int __init mcfcau_des_init(void)
-+{
-+      int ret;
-+
-+      ret = crypto_register_alg(&mcfcau_des_alg);
-+      if (ret < 0)
-+              goto out;
-+
-+      ret = crypto_register_alg(&mcfcau_des3_ede_alg);
-+      if (ret < 0)
-+              crypto_unregister_alg(&mcfcau_des_alg);
-+out:
-+      printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " "
-+              MCFCAU_DES_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
-+      return ret;
-+}
-+
-+static void __exit mcfcau_des_exit(void)
-+{
-+      crypto_unregister_alg(&mcfcau_des3_ede_alg);
-+      crypto_unregister_alg(&mcfcau_des_alg);
-+
-+      printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " "
-+              MCFCAU_DES_DRIVER_VERSION " unregistered.\n");
-+}
-+
-+module_init(mcfcau_des_init);
-+module_exit(mcfcau_des_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms for ColdFire CAU");
-+MODULE_AUTHOR("Andrey Butok");
---- /dev/null
-+++ b/drivers/crypto/mcfcau.h
-@@ -0,0 +1,98 @@
-+/***************************************************************************
-+ * mcfcau.h - Common header file for Freescale ColdFire
-+ *            Cryptographic Acceleration Unit (CAU) drivers.
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      14 August 2007  Andrey Butok
-+ */
-+
-+#ifndef MCFCAU_H
-+#define MCFCAU_H
-+
-+#include <linux/spinlock.h>
-+
-+/* CAU Registers (CAx) */
-+#define MCFCAU_CASR           (0x0)
-+#define MCFCAU_CAA            (0x1)
-+#define MCFCAU_CA0            (0x2)
-+#define MCFCAU_CA1            (0x3)
-+#define MCFCAU_CA2            (0x4)
-+#define MCFCAU_CA3            (0x5)
-+#define MCFCAU_CA4            (0x6)
-+#define MCFCAU_CA5            (0x7)
-+
-+ /* CAU Commands */
-+#define MCFCAU_CNOP           (0x000)
-+#define MCFCAU_LDR            (0x010)
-+#define MCFCAU_STR            (0x020)
-+#define MCFCAU_ADR            (0x030)
-+#define MCFCAU_RADR           (0x040)
-+#define MCFCAU_ADRA           (0x050)
-+#define MCFCAU_XOR            (0x060)
-+#define MCFCAU_ROTL           (0x070)
-+#define MCFCAU_MVRA           (0x080)
-+#define MCFCAU_MVAR           (0x090)
-+#define MCFCAU_AESS           (0x0A0)
-+#define MCFCAU_AESIS          (0x0B0)
-+#define MCFCAU_AESC           (0x0C0)
-+#define MCFCAU_AESIC          (0x0D0)
-+#define MCFCAU_AESR           (0x0E0)
-+#define MCFCAU_AESIR          (0x0F0)
-+#define MCFCAU_DESR           (0x100)
-+#define MCFCAU_DESK           (0x110)
-+#define MCFCAU_HASH           (0x120)
-+#define MCFCAU_SHS            (0x130)
-+#define MCFCAU_MDS            (0x140)
-+#define MCFCAU_ILL            (0x1F0)
-+
-+/* DESR Fields */
-+#define MCFCAU_IP             (0x08)  /* initial permutation */
-+#define MCFCAU_FP             (0x04)  /* final permutation */
-+#define MCFCAU_KSL1           (0x00)  /* key schedule left 1 bit */
-+#define MCFCAU_KSL2           (0x01)  /* key schedule left 2 bits */
-+#define MCFCAU_KSR1           (0x02)  /* key schedule right 1 bit */
-+#define MCFCAU_KSR2           (0x03)  /* key schedule right 2 bits */
-+
-+/* DESK Field */
-+#define MCFCAU_DC             (0x01)  /* decrypt key schedule */
-+#define MCFCAU_CP             (0x02)  /* check parity */
-+
-+/* HASH Functions Codes */
-+#define MCFCAU_HFF            (0x0)   /* MD5 F() CA1&CA2 | ~CA1&CA3 */
-+#define MCFCAU_HFG            (0x1)   /* MD5 G() CA1&CA3 | CA2&~CA3 */
-+#define MCFCAU_HFH            (0x2)   /* MD5 H(), SHA Parity() CA1^CA2^CA3 */
-+#define MCFCAU_HFI            (0x3)   /* MD5 I() CA2^(CA1|~CA3) */
-+#define MCFCAU_HFC            (0x4)   /* SHA Ch() CA1&CA2 ^ ~CA1&CA3 */
-+#define MCFCAU_HFM            (0x5)   /* SHA Maj() CA1&CA2 ^ CA1&CA3 ^ CA2&CA3 */
-+
-+#define MCFCAU_CRA_PRIORITY   (300)
-+
-+extern spinlock_t mcfcau_lock;
-+
-+#ifdef DEBUG
-+#define DBG(fmt, args...)     printk( "[%s]  " fmt , __FUNCTION__, ## args)
-+#else
-+#define DBG(fmt, args...)     do{}while(0)
-+#endif
-+
-+#endif
---- /dev/null
-+++ b/drivers/crypto/mcfcau-md5.c
-@@ -0,0 +1,654 @@
-+ /***************************************************************************
-+ * mcfcau-md5.c - Implementation of MD5 Message Digest Algorithm (RFC1321)
-+ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      30 September 2007       Andrey Butok
-+ *            Initial Release - developed on 2.6.20 Linux kernel.
-+ */
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/string.h>
-+#include <linux/crypto.h>
-+#include <linux/types.h>
-+#include <asm/byteorder.h>
-+
-+/*
-+#undef DEBUG
-+#define DEBUG 1
-+*/
-+
-+#include "mcfcau.h"
-+
-+
-+#define MCFCAU_MD5_DIGEST_SIZE                (16)
-+#define MCFCAU_MD5_HMAC_BLOCK_SIZE    (64)
-+#define MCFCAU_MD5_BLOCK_WORDS                (16)
-+#define MCFCAU_MD5_HASH_WORDS         (4)
-+
-+#define       MCFCAU_MD5_DRIVER_DESC          "MD5 ColdFire CAU driver"
-+#define       MCFCAU_MD5_DRIVER_VERSION       "v0.01"
-+
-+
-+struct mcfcau_md5_ctx {
-+      u32 hash[MCFCAU_MD5_HASH_WORDS];
-+      u32 block[MCFCAU_MD5_BLOCK_WORDS];
-+      u64 byte_count;
-+};
-+
-+u32 mcfcau_md5_t[64]={0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
-+                      0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
-+                      0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
-+                      0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
-+                      0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
-+                      0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
-+                      0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
-+                      0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
-+                      0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
-+                      0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
-+                      0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
-+                      0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
-+                      0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
-+                      0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
-+                      0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
-+                      0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
-+
-+
-+
-+static void mcfcau_md5_transform(u32 *hash, u32 const *in)
-+{
-+      int i;
-+      u32 * md5_t_p=&mcfcau_md5_t[0];
-+      unsigned long iflags;
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+      asm("move.l     %0, %%a1"::"m"(hash):"a1");
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");/*a*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");/*b*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");/*c*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");/*d*/
-+      asm("move.l     %0, %%a0"::"m"(in):"a0");       /* X[] */
-+      asm("move.l     %0, %%a3"::"m"(md5_t_p):"a3");  /* T[] */
-+
-+      
-+      /*  Round 1 */
-+      asm("moveq.l    #7, %%d4":::"d4");      /* for rotating by 7 */
-+      asm("moveq.l    #12, %%d5":::"d5");     /* for rotating by 12 */
-+      asm("moveq.l    #17, %%d6":::"d6");     /* for rotating by 17 */
-+      asm("moveq.l    #22, %%d7":::"d7");     /* for rotating by 22 */
-+
-+      for(i=0; i<4;i++){
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));         /* a+F(b,c,d) */
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");    /* add byterev x[i] */
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");     /* add t[i] */
-+              asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));         /* rotate by 7 */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));         /* add b */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));                     /* register to register shift */
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
-+              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+      };
-+
-+
-+      /* Round 2 */
-+      asm("moveq.l    #5, %%d4":::"d4");      /* for rotating by 5 */
-+      asm("moveq.l    #9, %%d5":::"d5");      /* for rotating by 9 */
-+      asm("moveq.l    #14, %%d6":::"d6");     /* for rotating by 14 */
-+      asm("moveq.l    #20, %%d7":::"d7");     /* for rotating by 20 */
-+
-+      asm("lea -60(%%a0),%%a0":::"a0");
-+
-+      for(i=0; i<2;i++){
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("lea        20(%%a0),%%a0"          :::"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("lea        20(%%a0),%%a0"          :::"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("lea        -44(%%a0),%%a0"         :::"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+              asm("lea        20(%%a0),%%a0"          :::"a0");
-+              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+              asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+      };
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        20(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -44(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        20(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        20(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -44(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        20(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        20(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -28(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      /* Round 3 */
-+      asm("moveq.l    #4, %%d4":::"d4");      /* for rotating by 5 */
-+      asm("moveq.l    #11, %%d5":::"d5");     /* for rotating by 9 */
-+      asm("moveq.l    #16, %%d6":::"d6");     /* for rotating by 14 */
-+      asm("moveq.l    #23, %%d7":::"d7");     /* for rotating by 20 */
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -52(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -52(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        12(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -52(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -8(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      
-+      /* Round 4 */
-+      asm("moveq.l    #6, %%d4":::"d4");      /* for rotating by 6 */
-+      asm("moveq.l    #10, %%d5":::"d5");     /* for rotating by 10 */
-+      asm("moveq.l    #15, %%d6":::"d6");     /* for rotating by 15 */
-+      asm("moveq.l    #21, %%d7":::"d7");     /* for rotating by 21 */
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        -36(%%a0),%%a0"         :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
-+      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
-+      asm("lea        28(%%a0),%%a0"          :::"a0");
-+      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
-+      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
-+
-+      
-+      asm("move.l     %0, %%a1"::"m"(hash):"a1");
-+
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1");/*a*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a1");/*b*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a1");/*c*/
-+      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a1");/*d*/
-+
-+      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA3):"a1");/*d*/
-+      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA2):"a1");/*c*/
-+      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA1):"a1");/*b*/
-+      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CAA):"a1");/*a*/
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+static inline void le32_to_cpu_array(u32 *buf, unsigned int words)
-+{
-+      while (words--) {
-+              __le32_to_cpus(buf);
-+              buf++;
-+      }
-+}
-+
-+static inline void cpu_to_le32_array(u32 *buf, unsigned int words)
-+{
-+      while (words--) {
-+              __cpu_to_le32s(buf);
-+              buf++;
-+      }
-+}
-+
-+static void mcfcau_md5_initialization(struct crypto_tfm *tfm)
-+{
-+      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
-+
-+      DBG("\n");
-+      mctx->hash[0] = 0x67452301;
-+      mctx->hash[1] = 0xefcdab89;
-+      mctx->hash[2] = 0x98badcfe;
-+      mctx->hash[3] = 0x10325476;
-+      mctx->byte_count = 0;
-+}
-+
-+static void mcfcau_md5_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len)
-+{
-+      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
-+      const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f);
-+
-+      DBG("\n");
-+      mctx->byte_count += len;
-+
-+      if (avail > len) {
-+              memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
-+                     data, len);
-+      }
-+      else {
-+              memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail);
-+
-+              mcfcau_md5_transform(mctx->hash, mctx->block);
-+              data += avail;
-+              len -= avail;
-+
-+              while (len >= sizeof(mctx->block)) {
-+                      memcpy(mctx->block, data, sizeof(mctx->block));
-+                      mcfcau_md5_transform(mctx->hash, mctx->block);
-+                      data += sizeof(mctx->block);
-+                      len -= sizeof(mctx->block);
-+              }
-+
-+              memcpy(mctx->block, data, len);
-+      }
-+}
-+
-+static void mcfcau_md5_final(struct crypto_tfm *tfm, u8 *out)
-+{
-+      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
-+      const unsigned int offset = mctx->byte_count & 0x3f;
-+      char *p = (char *)mctx->block + offset;
-+      int padding = 56 - (offset + 1);
-+
-+      DBG("\n");
-+
-+      *p++ = 0x80;
-+      if (padding < 0) {
-+              memset(p, 0x00, padding + sizeof (u64));
-+              mcfcau_md5_transform(mctx->hash, mctx->block);
-+              p = (char *)mctx->block;
-+              padding = 56;
-+      }
-+
-+      memset(p, 0, padding);
-+      mctx->block[14] = mctx->byte_count << 3;
-+      mctx->block[15] = mctx->byte_count >> 29;
-+      le32_to_cpu_array(&mctx->block[14], 2);
-+
-+      mcfcau_md5_transform(mctx->hash, mctx->block);
-+
-+      cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(u32));
-+      memcpy(out, mctx->hash, sizeof(mctx->hash));
-+      memset(mctx, 0, sizeof(*mctx));
-+}
-+
-+static struct crypto_alg mcfcau_md5_alg = {
-+      .cra_name               =       "md5",
-+      .cra_driver_name        =       "md5-mcfcau",
-+      .cra_priority           =       MCFCAU_CRA_PRIORITY,
-+      .cra_flags              =       CRYPTO_ALG_TYPE_DIGEST,
-+      .cra_blocksize          =       MCFCAU_MD5_HMAC_BLOCK_SIZE,
-+      .cra_ctxsize            =       sizeof(struct mcfcau_md5_ctx),
-+      .cra_module             =       THIS_MODULE,
-+      .cra_list               =       LIST_HEAD_INIT(mcfcau_md5_alg.cra_list),
-+      .cra_u                  =       { .digest = {
-+      .dia_digestsize         =       MCFCAU_MD5_DIGEST_SIZE,
-+      .dia_init               =       mcfcau_md5_initialization,
-+      .dia_update             =       mcfcau_md5_update,
-+      .dia_final              =       mcfcau_md5_final } }
-+};
-+
-+static int __init mcfcau_md5_init(void)
-+{
-+      int ret = crypto_register_alg(&mcfcau_md5_alg);
-+      printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " "
-+              MCFCAU_MD5_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
-+      return ret;
-+}
-+
-+static void __exit mcfcau_md5_exit(void)
-+{
-+      crypto_unregister_alg(&mcfcau_md5_alg);
-+      printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " "
-+              MCFCAU_MD5_DRIVER_VERSION " unregistered.\n");
-+}
-+
-+module_init(mcfcau_md5_init);
-+module_exit(mcfcau_md5_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION(MCFCAU_MD5_DRIVER_DESC);
-+MODULE_AUTHOR("Andrey Butok");
---- /dev/null
-+++ b/drivers/crypto/mcfcau-sha1.c
-@@ -0,0 +1,280 @@
-+ /***************************************************************************
-+ * mcfcau-sha1.c - Implementation of SHA1 Secure Hash Algorithm
-+ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
-+ *
-+ * Author: Andrey Butok
-+ * Copyright Freescale Semiconductor Inc.  2007
-+ *
-+ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+ * for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software Foundation,
-+ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ * v0.01      15 October 2007 Andrey Butok
-+ *            Initial Release - developed on 2.6.20 Linux kernel.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/mm.h>
-+#include <linux/crypto.h>
-+#include <linux/types.h>
-+
-+
-+/*
-+#undef DEBUG
-+#define DEBUG 1
-+*/
-+
-+#include "mcfcau.h"
-+
-+#define MCFCAU_SHA1_DIGEST_WORDS      (5)
-+#define MCFCAU_SHA1_WORKSPACE_WORDS   (80)
-+
-+#define MCFCAU_SHA1_DIGEST_SIZE               (20)
-+#define MCFCAU_SHA1_HMAC_BLOCK_SIZE   (64)
-+
-+#define       MCFCAU_SHA1_DRIVER_DESC         "SHA1 ColdFire CAU driver"
-+#define       MCFCAU_SHA1_DRIVER_VERSION      "v0.01"
-+
-+struct mcfcau_sha1_ctx {
-+        u64 count;
-+        u32 state[5];
-+        u8 buffer[64];
-+};
-+
-+const static u32 K[4]={0x5A827999L,   /* Rounds  0-19: sqrt(2) * 2^30 */
-+                      0x6ED9EBA1L,    /* Rounds 20-39: sqrt(3) * 2^30 */
-+                      0x8F1BBCDCL,    /* Rounds 40-59: sqrt(5) * 2^30 */
-+                      0xCA62C1D6L};   /* Rounds 60-79: sqrt(10) * 2^30 */
-+
-+static void noinline mcfcau_sha1_transform(__u32 *digest, const char *in, __u32 *W)
-+{
-+      int i;
-+      u32 * tmp_p;
-+      unsigned long iflags;
-+
-+      /* (a) Devide M(i) into 16 words W */
-+      for (i = 0; i < 16; i++)
-+              W[i] = ((const u32 *)in)[i];
-+
-+      /* (b) W[i+16] = S^1(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i]) */
-+      tmp_p=&W[16];
-+
-+      spin_lock_irqsave(&mcfcau_lock, iflags);
-+      asm("move.l     %0, %%a0"::"m"(tmp_p):"a0");
-+      asm("moveq.l    #1, %%d3":::"d3");
-+
-+      for (i = 0; i < 64; i++){
-+              asm("cp0ld.l    -64(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_LDR+MCFCAU_CA0));
-+              asm("cp0ld.l    -56(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
-+              asm("cp0ld.l    -32(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
-+              asm("cp0ld.l    -12(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
-+              asm("cp0ld.l    %%d3,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CA0):"d3");
-+              asm("cp0st.l    %%d0,(%%a0)+,#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA0));
-+      }
-+
-+      /* (c) */
-+      asm("move.l     %0, %%a0"::"m"(digest):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a0"); /* a */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a0"); /* b */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); /* c */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a0"); /* d */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA4):"a0"); /* e */
-+
-+      /* (d) */
-+      asm("moveq.l    #5, %%d0":::"d0");
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MVRA+MCFCAU_CA0));
-+      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /*S^5(A)*/
-+
-+      tmp_p=(u32*)K;
-+      asm("move.l     %0, %%a0"::"m"(tmp_p):"a0");
-+      asm("move.l     %0, %%a1"::"m"(W):"a1");
-+
-+      for (i = 0; i < 20; i++) {
-+              /* t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; */
-+              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFC)); /*f(b,c,d)*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
-+              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
-+      }
-+
-+      asm("add.l #4,%%a0"     :::"a0"); /* update K */
-+
-+      for (; i < 40; i ++) {
-+              /* t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; */
-+              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
-+              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
-+      }
-+
-+      asm("add.l #4,%%a0"     :::"a0"); /* update K */
-+
-+      for (; i < 60; i ++) {
-+              /* t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; */
-+              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFM)); /*f(b,c,d)*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
-+              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
-+      }
-+
-+      asm("add.l #4,%%a0"     :::"a0"); /* update K */
-+
-+      for (; i < 80; i ++) {
-+              /* t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; */
-+              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
-+              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
-+              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
-+              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
-+      }
-+
-+      /* (e) */
-+      asm("move.l     %0, %%a0"::"m"(digest):"a0");
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA0):"a0"); /* +a */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a0"); /* +b */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a0"); /* +c */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a0"); /* +d */
-+      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA4):"a0"); /* +e */
-+
-+      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA4):"a0");
-+      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA3):"a0");
-+      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA2):"a0");
-+      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA1):"a0");
-+      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA0):"a0");
-+      spin_unlock_irqrestore(&mcfcau_lock, iflags);
-+}
-+
-+static void mcfcau_sha1_init(struct crypto_tfm *tfm)
-+{
-+      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
-+      static const struct mcfcau_sha1_ctx initstate = {
-+        0,
-+        { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 },
-+        { 0, }
-+      };
-+
-+      *sctx = initstate;
-+}
-+
-+static void mcfcau_sha1_update(struct crypto_tfm *tfm, const u8 *data,
-+                      unsigned int len)
-+{
-+      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
-+      unsigned int partial, done;
-+      const u8 *src;
-+
-+      partial = sctx->count & 0x3f;
-+      sctx->count += len;
-+      done = 0;
-+      src = data;
-+
-+      if ((partial + len) > 63) {
-+              u32 temp[MCFCAU_SHA1_WORKSPACE_WORDS];
-+
-+              if (partial) {
-+                      done = -partial;
-+                      memcpy(sctx->buffer + partial, data, done + 64);
-+                      src = sctx->buffer;
-+              }
-+
-+              do {
-+                      mcfcau_sha1_transform(sctx->state, src, temp);
-+                      done += 64;
-+                      src = data + done;
-+              } while (done + 63 < len);
-+
-+              memset(temp, 0, sizeof(temp));
-+              partial = 0;
-+      }
-+      memcpy(sctx->buffer + partial, src, len - done);
-+}
-+
-+
-+/* Add padding and return the message digest. */
-+static void mcfcau_sha1_final(struct crypto_tfm *tfm, u8 *out)
-+{
-+      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
-+      u32 *dst = (u32 *)out;
-+      u32 i, index, padlen;
-+      u64 bits;
-+      static const u8 padding[64] = { 0x80, };
-+
-+      bits = sctx->count << 3;
-+
-+      /* Pad out to 56 mod 64 */
-+      index = sctx->count & 0x3f;
-+      padlen = (index < 56) ? (56 - index) : ((64+56) - index);
-+      mcfcau_sha1_update(tfm, padding, padlen);
-+
-+      /* Append length */
-+      mcfcau_sha1_update(tfm, (const u8 *)&bits, sizeof(bits));
-+
-+      /* Store state in digest */
-+      for (i = 0; i < 5; i++)
-+              dst[i] = sctx->state[i];
-+
-+
-+      /* Wipe context */
-+      memset(sctx, 0, sizeof *sctx);
-+}
-+
-+static struct crypto_alg mcfcau_sha1_alg = {
-+      .cra_name       =       "sha1",
-+      .cra_driver_name=       "sha1-mcfcau",
-+      .cra_priority   =       MCFCAU_CRA_PRIORITY,
-+      .cra_flags      =       CRYPTO_ALG_TYPE_DIGEST,
-+      .cra_blocksize  =       MCFCAU_SHA1_HMAC_BLOCK_SIZE,
-+      .cra_ctxsize    =       sizeof(struct mcfcau_sha1_ctx),
-+      .cra_module     =       THIS_MODULE,
-+      .cra_alignmask  =       3,
-+      .cra_list       =       LIST_HEAD_INIT(mcfcau_sha1_alg.cra_list),
-+      .cra_u          =       { .digest = {
-+      .dia_digestsize =       MCFCAU_SHA1_DIGEST_SIZE,
-+      .dia_init       =       mcfcau_sha1_init,
-+      .dia_update     =       mcfcau_sha1_update,
-+      .dia_final      =       mcfcau_sha1_final } }
-+};
-+
-+static int __init init(void)
-+{
-+      int ret = crypto_register_alg(&mcfcau_sha1_alg);
-+      printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " "
-+              MCFCAU_SHA1_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
-+      return ret;
-+}
-+
-+static void __exit fini(void)
-+{
-+      crypto_unregister_alg(&mcfcau_sha1_alg);
-+      printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " "
-+              MCFCAU_SHA1_DRIVER_VERSION " unregistered.\n");
-+}
-+
-+module_init(init);
-+module_exit(fini);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_DESCRIPTION(MCFCAU_SHA1_DRIVER_DESC);
-+MODULE_AUTHOR("Andrey Butok");
---- a/drivers/dma/Makefile
-+++ b/drivers/dma/Makefile
-@@ -4,3 +4,5 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
- ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o
- obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
- obj-$(CONFIG_FSL_DMA) += fsldma.o
-+obj-$(CONFIG_MCD_DMA) += mcddma.o
-+mcddma-objs := MCD_dmaApi.o MCD_tasks.o MCD_tasksInit.o
---- /dev/null
-+++ b/drivers/dma/MCD_dmaApi.c
-@@ -0,0 +1,965 @@
-+/*
-+ * drivers/dma/MCD_dmaApi.c
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include "MCD_dma.h"
-+#include "MCD_tasksInit.h"
-+#include "MCD_progCheck.h"
-+
-+/********************************************************************/
-+/*
-+ * This is an API-internal pointer to the DMA's registers
-+ */
-+dmaRegs *MCD_dmaBar;
-+
-+/*
-+ * These are the real and model task tables as generated by the
-+ * build process
-+ */
-+extern TaskTableEntry MCD_realTaskTableSrc[NCHANNELS];
-+extern TaskTableEntry MCD_modelTaskTableSrc[NUMOFVARIANTS];
-+
-+/*
-+ * However, this (usually) gets relocated to on-chip SRAM, at which
-+ * point we access them as these tables
-+ */
-+volatile TaskTableEntry *MCD_taskTable;
-+TaskTableEntry *MCD_modelTaskTable;
-+
-+
-+/*
-+ * MCD_chStatus[] is an array of status indicators for remembering
-+ * whether a DMA has ever been attempted on each channel, pausing
-+ * status, etc.
-+ */
-+static int MCD_chStatus[NCHANNELS] =
-+{
-+    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
-+    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
-+    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
-+    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA
-+};
-+
-+/*
-+ * Prototypes for local functions
-+ */
-+static void MCD_memcpy (int *dest, int *src, u32 size);
-+static void MCD_resmActions (int channel);
-+
-+/*
-+ * Buffer descriptors used for storage of progress info for single Dmas
-+ * Also used as storage for the DMA for CRCs for single DMAs
-+ * Otherwise, the DMA does not parse these buffer descriptors
-+ */
-+#ifdef MCD_INCLUDE_EU
-+extern MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
-+#else
-+MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
-+#endif
-+MCD_bufDesc *MCD_relocBuffDesc;
-+
-+
-+/*
-+ * Defines for the debug control register's functions
-+ */
-+#define DBG_CTL_COMP1_TASK  (0x00002000) /* have comparator 1 look for a task # */
-+#define DBG_CTL_ENABLE      (DBG_CTL_AUTO_ARM    | \
-+                             DBG_CTL_BREAK       | \
-+                             DBG_CTL_INT_BREAK   | \
-+                             DBG_CTL_COMP1_TASK)
-+#define DBG_CTL_DISABLE     (DBG_CTL_AUTO_ARM    | \
-+                             DBG_CTL_INT_BREAK   | \
-+                             DBG_CTL_COMP1_TASK)
-+#define DBG_KILL_ALL_STAT   (0xFFFFFFFF)
-+
-+/*
-+ * Offset to context save area where progress info is stored
-+ */
-+#define CSAVE_OFFSET        10
-+
-+/*
-+ * Defines for Byte Swapping
-+ */
-+#define MCD_BYTE_SWAP_KILLER    0xFFF8888F
-+#define MCD_NO_BYTE_SWAP_ATALL  0x00040000
-+
-+/*
-+ * Execution Unit Identifiers
-+ */
-+#define MAC  0  /* legacy - not used */
-+#define LUAC 1  /* legacy - not used */
-+#define CRC  2  /* legacy - not used */
-+#define LURC 3  /* Logic Unit with CRC */
-+
-+/*
-+ * Task Identifiers
-+ */
-+#define TASK_CHAINNOEU  0
-+#define TASK_SINGLENOEU 1
-+#ifdef MCD_INCLUDE_EU
-+#define TASK_CHAINEU    2
-+#define TASK_SINGLEEU   3
-+#define TASK_FECRX      4
-+#define TASK_FECTX      5
-+#else
-+#define TASK_CHAINEU    0
-+#define TASK_SINGLEEU   1
-+#define TASK_FECRX      2
-+#define TASK_FECTX      3
-+#endif
-+
-+/*
-+ * Structure to remember which variant is on which channel
-+ */
-+typedef struct MCD_remVariants_struct MCD_remVariant;
-+struct MCD_remVariants_struct
-+{
-+   int remDestRsdIncr[NCHANNELS];  /* -1,0,1 */
-+   int remSrcRsdIncr[NCHANNELS];   /* -1,0,1 */
-+   s16 remDestIncr[NCHANNELS];     /* DestIncr */
-+   s16 remSrcIncr[NCHANNELS];      /* srcIncr */
-+   u32 remXferSize[NCHANNELS];     /* xferSize */
-+};
-+
-+/*
-+ * Structure to remember the startDma parameters for each channel
-+ */
-+MCD_remVariant MCD_remVariants;
-+
-+/********************************************************************/
-+/*
-+ * Function: MCD_initDma
-+ * Purpose:  Initializes the DMA API by setting up a pointer to the DMA
-+ *           registers, relocating and creating the appropriate task
-+ *           structures, and setting up some global settings
-+ * Arguments:
-+ *  dmaBarAddr    - pointer to the multichannel DMA registers
-+ *  taskTableDest - location to move DMA task code and structs to
-+ *  flags         - operational parameters
-+ * Return Value:
-+ *  MCD_TABLE_UNALIGNED if taskTableDest is not 512-byte aligned
-+ *  MCD_OK otherwise
-+ */
-+extern u32 MCD_funcDescTab0[];
-+
-+int MCD_initDma (dmaRegs *dmaBarAddr, void *taskTableDest, u32 flags)
-+{
-+    int i;
-+    TaskTableEntry *entryPtr;
-+
-+    /* Setup the local pointer to register set */
-+    MCD_dmaBar = dmaBarAddr;
-+
-+    /* Do we need to move/create a task table */
-+    if ((flags & MCD_RELOC_TASKS) != 0)
-+    {
-+        int fixedSize;
-+        u32 *fixedPtr;
-+        int varTabsOffset, funcDescTabsOffset, contextSavesOffset;
-+        int taskDescTabsOffset;
-+        int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize;
-+        int taskDescTabSize;
-+
-+        int i;
-+
-+        /* Check if physical address is aligned on 512 byte boundary */
-+        if (((u32)taskTableDest & 0x000001ff) != 0)
-+            return(MCD_TABLE_UNALIGNED);
-+
-+        MCD_taskTable = taskTableDest; /* set up local pointer to task Table */
-+
-+        /*
-+         * Create a task table:
-+         * - compute aligned base offsets for variable tables and
-+         *   function descriptor tables, then
-+         * - loop through the task table and setup the pointers
-+         * - copy over model task table with the the actual task descriptor
-+         *   tables
-+         */
-+        taskTableSize = NCHANNELS * sizeof(TaskTableEntry);
-+        /* Align variable tables to size */
-+        varTabsOffset = taskTableSize + (u32)taskTableDest;
-+        if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0)
-+            varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE);
-+        /* Align function descriptor tables */
-+        varTabsSize = NCHANNELS * VAR_TAB_SIZE;
-+        funcDescTabsOffset = varTabsOffset + varTabsSize;
-+
-+        if ((funcDescTabsOffset & (FUNCDESC_TAB_SIZE - 1)) != 0)
-+            funcDescTabsOffset = (funcDescTabsOffset + FUNCDESC_TAB_SIZE) &
-+            (~FUNCDESC_TAB_SIZE);
-+
-+        funcDescTabsSize = FUNCDESC_TAB_NUM * FUNCDESC_TAB_SIZE;
-+        contextSavesOffset = funcDescTabsOffset + funcDescTabsSize;
-+        contextSavesSize = (NCHANNELS * CONTEXT_SAVE_SIZE);
-+        fixedSize = taskTableSize + varTabsSize + funcDescTabsSize +
-+                    contextSavesSize;
-+
-+        /* Zero the thing out */
-+        fixedPtr = (u32 *)taskTableDest;
-+        for (i = 0;i<(fixedSize/4);i++)
-+            fixedPtr[i] = 0;
-+
-+        entryPtr = (TaskTableEntry*)MCD_taskTable;
-+        /* Set up fixed pointers */
-+        for (i = 0; i < NCHANNELS; i++)
-+        {
-+            entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */
-+            entryPtr[i].FDTandFlags = (u32)funcDescTabsOffset | MCD_TT_FLAGS_DEF;
-+            entryPtr[i].contextSaveSpace = (u32)contextSavesOffset;
-+            varTabsOffset += VAR_TAB_SIZE;
-+#ifdef MCD_INCLUDE_EU /* if not there is only one, just point to the same one */
-+            funcDescTabsOffset += FUNCDESC_TAB_SIZE;
-+#endif
-+            contextSavesOffset += CONTEXT_SAVE_SIZE;
-+        }
-+        /* Copy over the function descriptor table */
-+        for ( i = 0; i < FUNCDESC_TAB_NUM; i++)
-+        {
-+            MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK),
-+                       (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE);
-+        }
-+
-+        /* Copy model task table to where the context save stuff leaves off */
-+        MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset;
-+
-+        MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc,
-+                    NUMOFVARIANTS * sizeof(TaskTableEntry));
-+
-+        /* Point to local version of model task table */
-+        entryPtr = MCD_modelTaskTable;
-+        taskDescTabsOffset = (u32)MCD_modelTaskTable +
-+                            (NUMOFVARIANTS * sizeof(TaskTableEntry));
-+
-+        /* Copy actual task code and update TDT ptrs in local model task table */
-+        for (i = 0; i < NUMOFVARIANTS; i++)
-+        {
-+            taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4;
-+            MCD_memcpy ((void*)taskDescTabsOffset, (void*)entryPtr[i].TDTstart, taskDescTabSize);
-+            entryPtr[i].TDTstart = (u32)taskDescTabsOffset;
-+            taskDescTabsOffset += taskDescTabSize;
-+            entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4;
-+        }
-+#ifdef MCD_INCLUDE_EU 
-+        /* 
-+         * Tack single DMA BDs onto end of code so API controls where
-+         * they are since DMA might write to them 
-+         */
-+        MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4);
-+#else 
-+        /* 
-+         * DMA does not touch them so they can be wherever and we don't need to
-+         * waste SRAM on them 
-+         */
-+        MCD_relocBuffDesc = MCD_singleBufDescs;
-+#endif
-+    }
-+    else
-+    {
-+        /* 
-+         * Point the would-be relocated task tables and the buffer descriptors
-+         * to the ones the linker generated
-+         */
-+        if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0)
-+            return(MCD_TABLE_UNALIGNED);
-+
-+        entryPtr = MCD_realTaskTableSrc;
-+        for (i = 0; i < NCHANNELS; i++)
-+        {
-+            if (((entryPtr[i].varTab & (VAR_TAB_SIZE - 1)) != 0) ||
-+                ((entryPtr[i].FDTandFlags & (FUNCDESC_TAB_SIZE - 1)) != 0))
-+                return(MCD_TABLE_UNALIGNED);
-+        }
-+
-+        MCD_taskTable = MCD_realTaskTableSrc;
-+        MCD_modelTaskTable = MCD_modelTaskTableSrc;
-+        MCD_relocBuffDesc = MCD_singleBufDescs;
-+    }
-+
-+    /* Make all channels inactive, and remember them as such: */
-+    MCD_dmaBar->taskbar = (u32) MCD_taskTable;
-+    for (i = 0;  i < NCHANNELS;  i++)
-+    {
-+        MCD_dmaBar->taskControl[i] = 0x0;
-+        MCD_chStatus[i] = MCD_NO_DMA;
-+    }
-+
-+   /* Set up pausing mechanism to inactive state: */
-+    MCD_dmaBar->debugComp1 = 0;
-+    MCD_dmaBar->debugComp2 = 0;
-+    MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
-+    MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT;
-+
-+    /* Enable or disable commbus prefetch */
-+    if ((flags & MCD_COMM_PREFETCH_EN) != 0)
-+        MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH;
-+    else
-+        MCD_dmaBar->ptdControl |= PTD_CTL_COMM_PREFETCH;
-+
-+    return(MCD_OK);
-+}
-+/*********************** End of MCD_initDma() ***********************/
-+
-+/********************************************************************/
-+/* Function:   MCD_dmaStatus
-+ * Purpose:    Returns the status of the DMA on the requested channel
-+ * Arguments:  channel - channel number
-+ * Returns:    Predefined status indicators
-+ */
-+int MCD_dmaStatus (int channel)
-+{
-+    u16 tcrValue;
-+
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    tcrValue = MCD_dmaBar->taskControl[channel];
-+    if ((tcrValue & TASK_CTL_EN) == 0)
-+    {   /* Nothing running if last reported with task enabled */
-+        if (   MCD_chStatus[channel] == MCD_RUNNING
-+            || MCD_chStatus[channel] == MCD_IDLE)
-+            MCD_chStatus[channel] = MCD_DONE;
-+    }
-+    else /* something is running */
-+    {
-+        /* There are three possibilities: paused, running or idle. */
-+        if (   MCD_chStatus[channel] == MCD_RUNNING
-+            || MCD_chStatus[channel] == MCD_IDLE)
-+        {
-+            MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT;
-+            /* Determine which initiator is asserted. */
-+            if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 )
-+                MCD_chStatus[channel] = MCD_RUNNING;
-+            else
-+                MCD_chStatus[channel] = MCD_IDLE;
-+            /* Do not change the status if it is already paused */
-+        }
-+    }
-+    return MCD_chStatus[channel];
-+}
-+/******************** End of MCD_dmaStatus() ************************/
-+
-+/********************************************************************/
-+/* Function:    MCD_startDma
-+ * Ppurpose:    Starts a particular kind of DMA
-+ * Arguments:   see below
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ */
-+
-+int MCD_startDma (
-+    int  channel,   /* the channel on which to run the DMA */
-+    s8   *srcAddr,  /* the address to move data from, or physical buffer-descriptor address */
-+    s16  srcIncr,   /* the amount to increment the source address per transfer */
-+    s8   *destAddr, /* the address to move data to */
-+    s16  destIncr,  /* the amount to increment the destination address per transfer */
-+    u32  dmaSize,   /* the number of bytes to transfer independent of the transfer size */
-+    u32  xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
-+    u32  initiator, /* what device initiates the DMA */
-+    int  priority,  /* priority of the DMA */
-+    u32  flags,     /* flags describing the DMA */
-+    u32  funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
-+#ifdef MCD_NEED_ADDR_TRANS
-+    s8   *srcAddrVirt /* virtual buffer descriptor address TBD*/
-+#endif
-+)
-+{
-+    int srcRsdIncr, destRsdIncr;
-+    int *cSave;
-+    short xferSizeIncr;
-+    int tcrCount = 0;
-+#ifdef MCD_INCLUDE_EU
-+    u32 *realFuncArray;
-+#endif
-+
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+#ifndef MCD_INCLUDE_EU
-+    funcDesc = MCD_FUNC_NOEU1;
-+#endif
-+
-+#ifdef MCD_DEBUG
-+printf("startDma:Setting up params\n");
-+#endif
-+
-+   /* Enable task-wise priority */
-+    MCD_dmaBar->ptdControl |= (u16) 0x8000;
-+
-+    /* Calculate additional parameters to the regular DMA calls. */
-+    srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0);
-+    destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0);
-+    xferSizeIncr = (xferSize & 0xffff) | 0x20000000;
-+
-+    /* Remember which variant is running for each channel */
-+    MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr;
-+    MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr;
-+    MCD_remVariants.remDestIncr[channel] = destIncr;
-+    MCD_remVariants.remSrcIncr[channel] = srcIncr;
-+    MCD_remVariants.remXferSize[channel] = xferSize;
-+
-+    cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) 
-+            + CSAVE_OFFSET 
-+            + CURRBD;
-+
-+#ifdef MCD_INCLUDE_EU
-+    realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00);
-+
-+    /* 
-+     * Modify the LURC's normal and byte-residue-loop functions 
-+     * according to parameter. 
-+     */
-+    switch (xferSize)
-+    {
-+        case 4:
-+            realFuncArray[(LURC*16)] = funcDesc;
-+            break;
-+        case 2:
-+            realFuncArray[(LURC*16)] = funcDesc & 0xfffff00f;
-+            break;
-+        case 1:
-+        default:
-+            realFuncArray[(LURC*16)] = funcDesc & 0xffff000f;
-+            break;
-+    }
-+
-+    realFuncArray[(LURC*16+1)] = 0
-+        | (funcDesc & MCD_BYTE_SWAP_KILLER) 
-+        | MCD_NO_BYTE_SWAP_ATALL;
-+#endif
-+
-+   /* Write the initiator field in the TCR and set the initiator-hold bit*/
-+    MCD_dmaBar->taskControl[channel] = 0
-+        | (initiator << 8)
-+        | TASK_CTL_HIPRITSKEN
-+        | TASK_CTL_HLDINITNUM;
-+
-+    /* 
-+     * Current versions of the MPC8220 MCD have a hardware quirk that could
-+     * cause the write to the TCR to collide with an MDE access to the 
-+     * initiator-register file, so we have to verify that the write occurred
-+     * correctly by reading back the value.  On MCF547x/8x devices and any
-+     * future revisions of the MPC8220, this loop will not be entered.
-+     */
-+    while(((MCD_dmaBar->taskControl[channel] & 0x1fff) !=
-+          ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) &&
-+            (tcrCount < 1000))
-+    {
-+        tcrCount++;
-+        MCD_dmaBar->taskControl[channel] = 0
-+            | (initiator << 8)
-+            | TASK_CTL_HIPRITSKEN
-+            | TASK_CTL_HLDINITNUM;
-+    }
-+
-+    MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK;
-+
-+    if (channel < 8 && channel >= 0)
-+    {
-+        MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4);
-+        MCD_dmaBar->taskSize0 |= (xferSize & 3) << (((7 - channel)*4) + 2);
-+        MCD_dmaBar->taskSize0 |= (xferSize & 3) << ((7 - channel)*4);
-+    }
-+    else
-+    {
-+        MCD_dmaBar->taskSize1 &= ~(0xf << (15-channel)*4);
-+        MCD_dmaBar->taskSize1 |= (xferSize & 3) << (((15 - channel)*4) + 2);
-+        MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4);
-+    }
-+
-+    /* Setup task table flags/options */
-+    MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK;
-+    MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags);
-+
-+    if (flags & MCD_FECTX_DMA)
-+    {
-+        /* TDTStart and TDTEnd */
-+        MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECTX].TDTstart;
-+        MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECTX].TDTend;
-+        MCD_startDmaENetXmit(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
-+    }
-+    else if (flags & MCD_FECRX_DMA)
-+    {
-+        /* TDTStart and TDTEnd */
-+        MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECRX].TDTstart;
-+        MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECRX].TDTend;
-+        MCD_startDmaENetRcv(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
-+    }
-+    else if(flags & MCD_SINGLE_DMA)
-+    {
-+        /* 
-+         * This buffer descriptor is used for storing off initial parameters 
-+         * for later progress query calculation and for the DMA to write the 
-+         * resulting checksum. The DMA does not use this to determine how to 
-+         * operate, that info is passed with the init routine
-+         */
-+        MCD_relocBuffDesc[channel].srcAddr = srcAddr;
-+        MCD_relocBuffDesc[channel].destAddr = destAddr;
-+        MCD_relocBuffDesc[channel].lastDestAddr = destAddr;
-+        MCD_relocBuffDesc[channel].dmaSize = dmaSize;
-+        MCD_relocBuffDesc[channel].flags = 0;       /* not used */
-+        MCD_relocBuffDesc[channel].csumResult = 0;  /* not used */
-+        MCD_relocBuffDesc[channel].next = 0;        /* not used */
-+
-+        /* Initialize the progress-querying stuff to show no progress:*/
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] 
-+            = (int)srcAddr;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] 
-+            = (int)destAddr;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] 
-+            = 0;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] 
-+            = (u32) &(MCD_relocBuffDesc[channel]);
-+
-+        if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
-+        {
-+            /* TDTStart and TDTEnd */
-+            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart;
-+            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend;
-+            MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize,
-+                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), 
-+                                cSave, MCD_taskTable, channel);
-+        }
-+        else
-+        {
-+            /* TDTStart and TDTEnd */
-+            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart;
-+            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend;
-+            MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize,
-+                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), 
-+                                cSave, MCD_taskTable, channel);
-+        }
-+    }
-+    else /* Chained DMA */
-+    {
-+        /* Initialize the progress-querying stuff to show no progress:*/
-+#if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
-+            = (int)((MCD_bufDesc*) srcAddr)->srcAddr;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
-+            = (int)((MCD_bufDesc*) srcAddr)->destAddr;
-+#else /* if using address translation, need the virtual addr of the first buffdesc */
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
-+          = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
-+          = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr;
-+#endif
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] 
-+          = 0;
-+        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] 
-+          = (u32) srcAddr;
-+
-+        if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
-+        {
-+            /* TDTStart and TDTEnd */
-+            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart;
-+            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend;
-+            MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize,
-+                                    xferSizeIncr, cSave, MCD_taskTable, channel);
-+        }
-+        else
-+        {
-+            /* TDTStart and TDTEnd */
-+            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart;
-+            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend;
-+            MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize,
-+                                 xferSizeIncr, cSave, MCD_taskTable, channel);
-+        }
-+    }
-+
-+    MCD_chStatus[channel] = MCD_IDLE;
-+    return(MCD_OK);
-+}
-+
-+/************************ End of MCD_startDma() *********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_XferProgrQuery
-+ * Purpose:     Returns progress of DMA on requested channel
-+ * Arguments:   channel - channel to retrieve progress for
-+ *              progRep - pointer to user supplied MCD_XferProg struct
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ *
-+ * Notes:
-+ *  MCD_XferProgrQuery() upon completing or after aborting a DMA, or
-+ *  while the DMA is in progress, this function returns the first
-+ *  DMA-destination address not (or not yet) used in the DMA. When
-+ *  encountering a non-ready buffer descriptor, the information for
-+ *  the last completed descriptor is returned.
-+ *
-+ *  MCD_XferProgQuery() has to avoid the possibility of getting
-+ *  partially-updated information in the event that we should happen
-+ *  to query DMA progress just as the DMA is updating it. It does that
-+ *  by taking advantage of the fact context is not saved frequently for
-+ *  the most part. We therefore read it at least twice until we get the
-+ *  same information twice in a row.
-+ *
-+ *  Because a small, but not insignificant, amount of time is required
-+ *  to write out the progress-query information, especially upon
-+ *  completion of the DMA, it would be wise to guarantee some time lag
-+ *  between successive readings of the progress-query information.
-+ */
-+
-+/*
-+ * How many iterations of the loop below to execute to stabilize values
-+ */
-+#define STABTIME 0
-+
-+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep)
-+{
-+    MCD_XferProg prevRep;
-+    int again;  /* true if we are to try again to get consistent results */
-+    int i;  /* used as a time-waste counter */
-+    int destDiffBytes; /* Total number of bytes that we think actually got xfered. */
-+    int numIterations; /* number of iterations */
-+    int bytesNotXfered; /* bytes that did not get xfered. */
-+    s8 *LWAlignedInitDestAddr, *LWAlignedCurrDestAddr;
-+    int subModVal, addModVal; /* Mode values to added and subtracted from the
-+                                final destAddr */
-+
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    /* Read a trial value for the progress-reporting values*/
-+    prevRep.lastSrcAddr =
-+          (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
-+    prevRep.lastDestAddr =
-+          (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
-+    prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
-+    prevRep.currBufDesc =
-+          (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
-+
-+    /* Repeatedly reread those values until they match previous values: */
-+    do {
-+        /* Take a little bit of time to ensure stability: */
-+        for (i = 0;  i < STABTIME;  i++)
-+            i += i >> 2;  /* make sure this loop does something so that it 
-+                             doesn't get optimized out */
-+        /* Check them again: */
-+        progRep->lastSrcAddr =
-+            (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
-+        progRep->lastDestAddr =
-+            (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
-+        progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
-+        progRep->currBufDesc =
-+            (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
-+
-+        /* See if they match: */
-+        if (   prevRep.lastSrcAddr  != progRep->lastSrcAddr
-+            || prevRep.lastDestAddr != progRep->lastDestAddr
-+            || prevRep.dmaSize      != progRep->dmaSize
-+            || prevRep.currBufDesc  != progRep->currBufDesc)
-+        {
-+            /* If they don't match, remember previous values and try again:*/
-+            prevRep.lastSrcAddr = progRep->lastSrcAddr;
-+            prevRep.lastDestAddr = progRep->lastDestAddr;
-+            prevRep.dmaSize = progRep->dmaSize;
-+            prevRep.currBufDesc = progRep->currBufDesc;
-+            again = MCD_TRUE;
-+        }
-+        else
-+          again = MCD_FALSE;
-+    } while (again == MCD_TRUE);
-+
-+
-+    /* Update dmaSize and lastDestAddr */
-+    switch(MCD_remVariants.remDestRsdIncr[channel]) 
-+    {
-+        case MINUS1:
-+           subModVal = ((int)progRep->lastDestAddr) 
-+                        & ((MCD_remVariants.remXferSize[channel]) - 1);
-+           addModVal = ((int)progRep->currBufDesc->destAddr) 
-+                        & ((MCD_remVariants.remXferSize[channel]) - 1);
-+           LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal;
-+           LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal;
-+           destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr;
-+           bytesNotXfered = (destDiffBytes/MCD_remVariants.remDestIncr[channel]) *
-+                            ( MCD_remVariants.remDestIncr[channel]
-+                            + MCD_remVariants.remXferSize[channel]);
-+           progRep->dmaSize = destDiffBytes - bytesNotXfered + addModVal - subModVal;
-+           break;
-+        case ZERO:
-+           progRep->lastDestAddr = progRep->currBufDesc->destAddr;
-+           break;
-+        case PLUS1:
-+           /* This value has to be subtracted from the final calculated dmaSize. */
-+            subModVal = ((int)progRep->currBufDesc->destAddr) 
-+                        & ((MCD_remVariants.remXferSize[channel]) - 1);
-+           /* These bytes are already in lastDestAddr. */
-+            addModVal = ((int)progRep->lastDestAddr) 
-+                        & ((MCD_remVariants.remXferSize[channel]) - 1);
-+            LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal;
-+            LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal;
-+            destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr);
-+            numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel];
-+            bytesNotXfered =  numIterations *
-+                              (MCD_remVariants.remDestIncr[channel]
-+                             - MCD_remVariants.remXferSize[channel]);
-+            progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal;
-+            break;
-+        default:
-+            break;
-+    }
-+
-+    /* This covers M1,P1,Z for source */
-+    switch(MCD_remVariants.remSrcRsdIncr[channel]) 
-+    {
-+        case MINUS1:
-+            progRep->lastSrcAddr =
-+                progRep->currBufDesc->srcAddr +
-+                 ( MCD_remVariants.remSrcIncr[channel] *
-+                   (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
-+            break;
-+        case ZERO:
-+            progRep->lastSrcAddr = progRep->currBufDesc->srcAddr;
-+            break;
-+        case PLUS1:
-+            progRep->lastSrcAddr =
-+                progRep->currBufDesc->srcAddr +
-+                 ( MCD_remVariants.remSrcIncr[channel] *
-+                   (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
-+            break;
-+        default: 
-+            break;
-+    }
-+
-+    return(MCD_OK);
-+}
-+/******************* End of MCD_XferProgrQuery() ********************/
-+
-+/********************************************************************/
-+/* MCD_resmActions() does the majority of the actions of a DMA resume.
-+ * It is called from MCD_killDma() and MCD_resumeDma().  It has to be
-+ * a separate function because the kill function has to negate the task
-+ * enable before resuming it, but the resume function has to do nothing
-+ * if there is no DMA on that channel (i.e., if the enable bit is 0).
-+ */
-+static void MCD_resmActions (int channel)
-+{
-+   MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
-+   MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;
-+
-+   /* Determine which initiators are asserted */
-+   MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; 
-+
-+   if((MCD_dmaBar->ptdDebug >> channel ) & 0x1)
-+       MCD_chStatus[channel] = MCD_RUNNING;
-+   else
-+       MCD_chStatus[channel] = MCD_IDLE;
-+}
-+/********************* End of MCD_resmActions() *********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_killDma
-+ * Purpose:     Halt the DMA on the requested channel, without any
-+ *              intention of resuming the DMA.
-+ * Arguments:   channel - requested channel
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ *
-+ * Notes:
-+ *  A DMA may be killed from any state, including paused state, and it
-+ *  always goes to the MCD_HALTED state even if it is killed while in
-+ *  the MCD_NO_DMA or MCD_IDLE states.
-+ */
-+int MCD_killDma (int channel)
-+{
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    MCD_dmaBar->taskControl[channel] = 0x0;
-+    
-+    /* Clean up after a paused task */
-+    if (MCD_chStatus[channel] == MCD_PAUSED)
-+    {
-+        MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
-+        MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;        
-+    }
-+     
-+    MCD_chStatus[channel] = MCD_HALTED;
-+
-+    return(MCD_OK);
-+}
-+/************************ End of MCD_killDma() **********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_continDma
-+ * Purpose:     Continue a DMA which as stopped due to encountering an
-+ *              unready buffer descriptor.
-+ * Arguments:   channel - channel to continue the DMA on
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ *
-+ * Notes:
-+ *  This routine does not check to see if there is a task which can
-+ *  be continued. Also this routine should not be used with single DMAs.
-+ */
-+int MCD_continDma (int channel)
-+{
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    MCD_dmaBar->taskControl[channel] |= TASK_CTL_EN;
-+    MCD_chStatus[channel] = MCD_RUNNING;
-+
-+    return(MCD_OK);
-+}
-+/********************** End of MCD_continDma() **********************/
-+
-+/*********************************************************************
-+ * MCD_pauseDma() and MCD_resumeDma() below use the DMA's debug unit
-+ * to freeze a task and resume it.  We freeze a task by breakpointing
-+ * on the stated task.  That is, not any specific place in the task,
-+ * but any time that task executes.  In particular, when that task
-+ * executes, we want to freeze that task and only that task.
-+ *
-+ * The bits of the debug control register influence interrupts vs.
-+ * breakpoints as follows:
-+ * - Bits 14 and 0 enable or disable debug functions.  If enabled, you
-+ *   will get the interrupt but you may or may not get a breakpoint.
-+ * - Bits 2 and 1 decide whether you also get a breakpoint in addition
-+ *   to an interrupt.
-+ *
-+ * The debug unit can do these actions in response to either internally
-+ * detected breakpoint conditions from the comparators, or in response
-+ * to the external breakpoint pin, or both.
-+ * - Bits 14 and 1 perform the above-described functions for
-+ *   internally-generated conditions, i.e., the debug comparators.
-+ * - Bits 0 and 2 perform the above-described functions for external
-+ *   conditions, i.e., the breakpoint external pin.
-+ *
-+ * Note that, although you "always" get the interrupt when you turn
-+ * the debug functions, the interrupt can nevertheless, if desired, be
-+ * masked by the corresponding bit in the PTD's IMR. Note also that
-+ * this means that bits 14 and 0 must enable debug functions before
-+ * bits 1 and 2, respectively, have any effect.
-+ *
-+ * NOTE: It's extremely important to not pause more than one DMA channel
-+ *  at a time.
-+ ********************************************************************/
-+
-+/********************************************************************/
-+/* Function:    MCD_pauseDma
-+ * Purpose:     Pauses the DMA on a given channel (if any DMA is running
-+ *              on that channel).
-+ * Arguments:   channel
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ */
-+int MCD_pauseDma (int channel)
-+{
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
-+    {
-+        MCD_dmaBar->debugComp1 = channel;
-+        MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16));
-+        MCD_chStatus[channel] = MCD_PAUSED;
-+    }
-+    return(MCD_OK);
-+}
-+/************************* End of MCD_pauseDma() ********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_resumeDma
-+ * Purpose:     Resumes the DMA on a given channel (if any DMA is
-+ *              running on that channel).
-+ * Arguments:   channel - channel on which to resume DMA
-+ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
-+ */
-+int MCD_resumeDma (int channel)
-+{
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
-+        MCD_resmActions (channel);
-+
-+    return(MCD_OK);
-+}
-+/************************ End of MCD_resumeDma() ********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_csumQuery
-+ * Purpose:     Provide the checksum after performing a non-chained DMA
-+ * Arguments:   channel - channel to report on
-+ *              csum - pointer to where to write the checksum/CRC
-+ * Returns:     MCD_ERROR if the channel is invalid, else MCD_OK
-+ *
-+ * Notes:
-+ *
-+ */
-+int MCD_csumQuery (int channel, u32 *csum)
-+{
-+#ifdef MCD_INCLUDE_EU
-+    if((channel < 0) || (channel >= NCHANNELS))
-+        return(MCD_CHANNEL_INVALID);
-+
-+    *csum = MCD_relocBuffDesc[channel].csumResult;
-+    return(MCD_OK);
-+#else
-+    return(MCD_ERROR);
-+#endif
-+}
-+/*********************** End of MCD_resumeDma() *********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_getCodeSize
-+ * Purpose:     Provide the size requirements of the microcoded tasks
-+ * Returns:     Size in bytes
-+ */
-+int MCD_getCodeSize(void)
-+{
-+#ifdef MCD_INCLUDE_EU
-+    return(0x2b64);
-+#else
-+    return(0x1744);
-+#endif
-+}
-+/********************** End of MCD_getCodeSize() ********************/
-+
-+/********************************************************************/
-+/* Function:    MCD_getVersion
-+ * Purpose:     Provide the version string and number
-+ * Arguments:   longVersion - user supplied pointer to a pointer to a char
-+ *                    which points to the version string
-+ * Returns:     Version number and version string (by reference)
-+ */
-+char MCD_versionString[] = "Multi-channel DMA API v1.0";
-+#define MCD_REV_MAJOR   0x01
-+#define MCD_REV_MINOR   0x00
-+
-+int MCD_getVersion(char **longVersion)
-+{
-+    *longVersion = MCD_versionString;
-+    return((MCD_REV_MAJOR << 8) | MCD_REV_MINOR);
-+}
-+/********************** End of MCD_getVersion() *********************/
-+
-+/********************************************************************/
-+/* Private version of memcpy()
-+ * Note that everything this is used for is longword-aligned.
-+ */
-+static void MCD_memcpy (int *dest, int *src, u32 size)
-+{
-+    u32 i;
-+
-+    for (i = 0;  i < size;  i += sizeof(int), dest++, src++)
-+        *dest = *src;
-+}
-+/********************************************************************/
---- /dev/null
-+++ b/drivers/dma/MCD_dma.h
-@@ -0,0 +1,378 @@
-+/*
-+ * drivers/dma/MCD_dma.h
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+#ifndef _MCD_API_H
-+#define _MCD_API_H
-+
-+/*
-+ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
-+ */
-+#undef MCD_INCLUDE_EU
-+
-+/*
-+ * Number of DMA channels
-+ */
-+#define NCHANNELS 16
-+
-+/*
-+ * Total number of variants
-+ */
-+#ifdef MCD_INCLUDE_EU
-+#define NUMOFVARIANTS   6
-+#else
-+#define NUMOFVARIANTS   4
-+#endif
-+
-+/*
-+ * Define sizes of the various tables
-+ */
-+#define TASK_TABLE_SIZE     (NCHANNELS*32)
-+#define VAR_TAB_SIZE        (128)
-+#define CONTEXT_SAVE_SIZE   (128)
-+#define FUNCDESC_TAB_SIZE   (256)
-+
-+#ifdef MCD_INCLUDE_EU
-+#define FUNCDESC_TAB_NUM    16
-+#else
-+#define FUNCDESC_TAB_NUM    1
-+#endif
-+
-+
-+#ifndef DEFINESONLY
-+
-+/*
-+ * Portability typedefs
-+ */
-+typedef int s32;
-+typedef unsigned int u32;
-+typedef short s16;
-+typedef unsigned short u16;
-+typedef char s8;
-+typedef unsigned char u8;
-+
-+/*
-+ * These structures represent the internal registers of the
-+ * multi-channel DMA
-+ */
-+struct dmaRegs_s {
-+   u32 taskbar;         /* task table base address register */
-+   u32 currPtr;
-+   u32 endPtr;
-+   u32 varTablePtr;
-+   u16 dma_rsvd0;
-+   u16 ptdControl;      /* ptd control */
-+   u32 intPending;      /* interrupt pending register */
-+   u32 intMask;         /* interrupt mask register */
-+   u16 taskControl[16]; /* task control registers */
-+   u8  priority[32];    /* priority registers */
-+   u32 initiatorMux;    /* initiator mux control */
-+   u32 taskSize0;       /* task size control register 0. */
-+   u32 taskSize1;       /* task size control register 1. */
-+   u32 dma_rsvd1;       /* reserved */
-+   u32 dma_rsvd2;       /* reserved */
-+   u32 debugComp1;      /* debug comparator 1 */
-+   u32 debugComp2;      /* debug comparator 2 */
-+   u32 debugControl;    /* debug control */
-+   u32 debugStatus;     /* debug status */
-+   u32 ptdDebug;        /* priority task decode debug */
-+   u32 dma_rsvd3[31];   /* reserved */
-+};
-+typedef volatile struct dmaRegs_s dmaRegs;
-+
-+#endif
-+
-+/*
-+ * PTD contrl reg bits
-+ */
-+#define PTD_CTL_TSK_PRI         0x8000
-+#define PTD_CTL_COMM_PREFETCH   0x0001
-+
-+/*
-+ * Task Control reg bits and field masks
-+ */
-+#define TASK_CTL_EN             0x8000
-+#define TASK_CTL_VALID          0x4000
-+#define TASK_CTL_ALWAYS         0x2000
-+#define TASK_CTL_INIT_MASK      0x1f00
-+#define TASK_CTL_ASTRT          0x0080
-+#define TASK_CTL_HIPRITSKEN     0x0040
-+#define TASK_CTL_HLDINITNUM     0x0020
-+#define TASK_CTL_ASTSKNUM_MASK  0x000f
-+
-+/*
-+ * Priority reg bits and field masks
-+ */
-+#define PRIORITY_HLD            0x80
-+#define PRIORITY_PRI_MASK       0x07
-+
-+/*
-+ * Debug Control reg bits and field masks
-+ */
-+#define DBG_CTL_BLOCK_TASKS_MASK    0xffff0000
-+#define DBG_CTL_AUTO_ARM            0x00008000
-+#define DBG_CTL_BREAK               0x00004000
-+#define DBG_CTL_COMP1_TYP_MASK      0x00003800
-+#define DBG_CTL_COMP2_TYP_MASK      0x00000070
-+#define DBG_CTL_EXT_BREAK           0x00000004
-+#define DBG_CTL_INT_BREAK           0x00000002
-+
-+/*
-+ * PTD Debug reg selector addresses
-+ * This reg must be written with a value to show the contents of
-+ * one of the desired internal register.
-+ */
-+#define PTD_DBG_REQ             0x00 /* shows the state of 31 initiators */
-+#define PTD_DBG_TSK_VLD_INIT    0x01 /* shows which 16 tasks are valid and
-+                                        have initiators asserted */
-+
-+
-+/*
-+ * General return values
-+ */
-+#define MCD_OK                   0
-+#define MCD_ERROR               -1
-+#define MCD_TABLE_UNALIGNED     -2
-+#define MCD_CHANNEL_INVALID     -3
-+
-+/*
-+ * MCD_initDma input flags
-+ */
-+#define MCD_RELOC_TASKS         0x00000001
-+#define MCD_NO_RELOC_TASKS      0x00000000
-+#define MCD_COMM_PREFETCH_EN    0x00000002  /* Commbus Prefetching - MCF547x/548x ONLY */
-+
-+/*
-+ * MCD_dmaStatus Status Values for each channel
-+ */
-+#define MCD_NO_DMA  1 /* No DMA has been requested since reset */
-+#define MCD_IDLE    2 /* DMA active, but the initiator is currently inactive */
-+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
-+#define MCD_PAUSED  4 /* DMA active but it is currently paused */
-+#define MCD_HALTED  5 /* the most recent DMA has been killed with MCD_killTask() */
-+#define MCD_DONE    6 /* the most recent DMA has completed. */
-+
-+
-+/*
-+ * MCD_startDma parameter defines
-+ */
-+
-+/*
-+ * Constants for the funcDesc parameter
-+ */
-+/* Byte swapping: */
-+#define MCD_NO_BYTE_SWAP    0x00045670  /* to disable byte swapping. */
-+#define MCD_BYTE_REVERSE    0x00076540  /* to reverse the bytes of each u32 of the DMAed data. */
-+#define MCD_U16_REVERSE     0x00067450  /* to reverse the 16-bit halves of
-+                                           each 32-bit data value being DMAed.*/
-+#define MCD_U16_BYTE_REVERSE    0x00054760 /* to reverse the byte halves of each
-+                                            16-bit half of each 32-bit data value DMAed */
-+#define MCD_NO_BIT_REV  0x00000000  /* do not reverse the bits of each byte DMAed. */
-+#define MCD_BIT_REV     0x00088880  /* reverse the bits of each byte DMAed */
-+/* CRCing: */
-+#define MCD_CRC16       0xc0100000  /* to perform CRC-16 on DMAed data. */
-+#define MCD_CRCCCITT    0xc0200000  /* to perform CRC-CCITT on DMAed data. */
-+#define MCD_CRC32       0xc0300000  /* to perform CRC-32 on DMAed data. */
-+#define MCD_CSUMINET    0xc0400000  /* to perform internet checksums on DMAed data.*/
-+#define MCD_NO_CSUM     0xa0000000  /* to perform no checksumming. */
-+
-+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
-+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
-+
-+/*
-+ * Constants for the flags parameter
-+ */
-+#define MCD_TT_FLAGS_RL   0x00000001 /* Read line */
-+#define MCD_TT_FLAGS_CW   0x00000002 /* Combine Writes */
-+#define MCD_TT_FLAGS_SP   0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY  */
-+#define MCD_TT_FLAGS_PI   0x00000040 /* Precise Increment */
-+#define MCD_TT_FLAGS_MASK 0x000000ff
-+#define MCD_TT_FLAGS_DEF  (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
-+
-+#define MCD_SINGLE_DMA  0x00000100 /* Unchained DMA */
-+#define MCD_CHAIN_DMA              /* TBD */
-+#define MCD_EU_DMA                 /* TBD */
-+#define MCD_FECTX_DMA   0x00001000 /* FEC TX ring DMA */
-+#define MCD_FECRX_DMA   0x00002000 /* FEC RX ring DMA */
-+
-+
-+/* these flags are valid for MCD_startDma and the chained buffer descriptors */
-+#define MCD_BUF_READY   0x80000000 /* indicates that this buffer is now under the DMA's control */
-+#define MCD_WRAP        0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
-+#define MCD_INTERRUPT   0x10000000 /* to generate an interrupt after completion of the DMA. */
-+#define MCD_END_FRAME   0x08000000 /* tell the DMA to end the frame when transferring
-+                                      last byte of data in buffer */
-+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
-+                                      prior to performing the DMA. */
-+
-+/* Defines for the FEC buffer descriptor control/status word*/
-+#define MCD_FEC_BUF_READY   0x8000
-+#define MCD_FEC_WRAP        0x2000
-+#define MCD_FEC_INTERRUPT   0x1000
-+#define MCD_FEC_END_FRAME   0x0800
-+
-+
-+/*
-+ * Defines for general intuitiveness
-+ */
-+
-+#define MCD_TRUE  1
-+#define MCD_FALSE 0
-+
-+/*
-+ * Three different cases for destination and source.
-+ */
-+#define MINUS1          -1
-+#define ZERO            0
-+#define PLUS1           1
-+
-+#ifndef DEFINESONLY
-+
-+/* Task Table Entry struct*/
-+typedef struct {
-+    u32 TDTstart;   /* task descriptor table start */
-+    u32 TDTend;     /* task descriptor table end */
-+    u32 varTab;     /* variable table start */
-+    u32 FDTandFlags;    /* function descriptor table start and flags */
-+    volatile u32 descAddrAndStatus;
-+    volatile u32 modifiedVarTab;
-+    u32 contextSaveSpace;   /* context save space start */
-+    u32 literalBases;
-+} TaskTableEntry;
-+
-+
-+/* Chained buffer descriptor */
-+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
-+struct MCD_bufDesc_struct {
-+   u32 flags;         /* flags describing the DMA */
-+   u32 csumResult;    /* checksum from checksumming performed since last checksum reset */
-+   s8  *srcAddr;      /* the address to move data from */
-+   s8  *destAddr;     /* the address to move data to */
-+   s8  *lastDestAddr; /* the last address written to */
-+   u32 dmaSize;       /* the number of bytes to transfer independent of the transfer size */
-+   MCD_bufDesc *next; /* next buffer descriptor in chain */
-+   u32 info;          /* private information about this descriptor;  DMA does not affect it */
-+};
-+
-+/* Progress Query struct */
-+typedef volatile struct MCD_XferProg_struct {
-+   s8 *lastSrcAddr;         /* the most-recent or last, post-increment source address */
-+   s8 *lastDestAddr;        /* the most-recent or last, post-increment destination address */
-+   u32  dmaSize;            /* the amount of data transferred for the current buffer */
-+   MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
-+} MCD_XferProg;
-+
-+
-+/* FEC buffer descriptor */
-+typedef volatile struct MCD_bufDescFec_struct {
-+    u16 statCtrl;
-+    u16 length;
-+    u32 dataPointer;
-+} MCD_bufDescFec;
-+
-+
-+/*************************************************************************/
-+/*
-+ * API function Prototypes  - see MCD_dmaApi.c for further notes
-+ */
-+
-+/*
-+ * MCD_startDma starts a particular kind of DMA .
-+ */
-+int MCD_startDma (
-+   int channel,   /* the channel on which to run the DMA */
-+   s8  *srcAddr,  /* the address to move data from, or buffer-descriptor address */
-+   s16 srcIncr,   /* the amount to increment the source address per transfer */
-+   s8  *destAddr, /* the address to move data to */
-+   s16 destIncr,  /* the amount to increment the destination address per transfer */
-+   u32 dmaSize,   /* the number of bytes to transfer independent of the transfer size */
-+   u32 xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
-+   u32 initiator, /* what device initiates the DMA */
-+   int priority,  /* priority of the DMA */
-+   u32 flags,     /* flags describing the DMA */
-+   u32 funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
-+);
-+
-+/* 
-+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA 
-+ * registers, relocating and creating the appropriate task structures, and 
-+ * setting up some global settings
-+ */
-+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
-+
-+/* 
-+ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
-+ */
-+int MCD_dmaStatus (int channel);
-+
-+/* 
-+ * MCD_XferProgrQuery() returns progress of DMA on requested channel
-+ */
-+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
-+
-+/* 
-+ * MCD_killDma() halts the DMA on the requested channel, without any
-+ * intention of resuming the DMA.
-+ */
-+int MCD_killDma (int channel);
-+
-+/* 
-+ * MCD_continDma() continues a DMA which as stopped due to encountering an
-+ * unready buffer descriptor.
-+ */
-+int MCD_continDma (int channel);
-+
-+/* 
-+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
-+ * running on that channel). 
-+ */
-+int MCD_pauseDma (int channel);
-+
-+/* 
-+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
-+ * running on that channel).
-+ */
-+int MCD_resumeDma (int channel);
-+
-+/* 
-+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
-+ */
-+int MCD_csumQuery (int channel, u32 *csum);
-+
-+/* 
-+ * MCD_getCodeSize provides the packed size required by the microcoded task
-+ * and structures.
-+ */
-+int MCD_getCodeSize(void);
-+
-+/*
-+ * MCD_getVersion provides a pointer to a version string and returns a
-+ * version number.
-+ */
-+int MCD_getVersion(char **longVersion);
-+
-+/* macro for setting a location in the variable table */
-+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
-+   /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
-+      so I'm avoiding surrounding it with "do {} while(0)" */
-+
-+#endif  /* DEFINESONLY */
-+
-+#endif /* _MCD_API_H */
---- /dev/null
-+++ b/drivers/dma/MCD_progCheck.h
-@@ -0,0 +1,28 @@
-+/*
-+ * drivers/dma/MCD_progCheck.h
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/* This file is autogenerated. Do not change */
-+
-+#define CURRBD 4
-+#define DCOUNT 6
-+#define DESTPTR 5
-+#define SRCPTR 7
---- /dev/null
-+++ b/drivers/dma/MCD_tasks.c
-@@ -0,0 +1,2465 @@
-+/*
-+ * drivers/dma/MCD_tasks.c
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include "MCD_dma.h"
-+
-+u32 MCD_varTab0[];
-+u32 MCD_varTab1[];
-+u32 MCD_varTab2[];
-+u32 MCD_varTab3[];
-+u32 MCD_varTab4[];
-+u32 MCD_varTab5[];
-+u32 MCD_varTab6[];
-+u32 MCD_varTab7[];
-+u32 MCD_varTab8[];
-+u32 MCD_varTab9[];
-+u32 MCD_varTab10[];
-+u32 MCD_varTab11[];
-+u32 MCD_varTab12[];
-+u32 MCD_varTab13[];
-+u32 MCD_varTab14[];
-+u32 MCD_varTab15[];
-+
-+u32 MCD_funcDescTab0[];
-+#ifdef MCD_INCLUDE_EU
-+u32 MCD_funcDescTab1[];
-+u32 MCD_funcDescTab2[];
-+u32 MCD_funcDescTab3[];
-+u32 MCD_funcDescTab4[];
-+u32 MCD_funcDescTab5[];
-+u32 MCD_funcDescTab6[];
-+u32 MCD_funcDescTab7[];
-+u32 MCD_funcDescTab8[];
-+u32 MCD_funcDescTab9[];
-+u32 MCD_funcDescTab10[];
-+u32 MCD_funcDescTab11[];
-+u32 MCD_funcDescTab12[];
-+u32 MCD_funcDescTab13[];
-+u32 MCD_funcDescTab14[];
-+u32 MCD_funcDescTab15[];
-+#endif
-+
-+u32 MCD_contextSave0[];
-+u32 MCD_contextSave1[];
-+u32 MCD_contextSave2[];
-+u32 MCD_contextSave3[];
-+u32 MCD_contextSave4[];
-+u32 MCD_contextSave5[];
-+u32 MCD_contextSave6[];
-+u32 MCD_contextSave7[];
-+u32 MCD_contextSave8[];
-+u32 MCD_contextSave9[];
-+u32 MCD_contextSave10[];
-+u32 MCD_contextSave11[];
-+u32 MCD_contextSave12[];
-+u32 MCD_contextSave13[];
-+u32 MCD_contextSave14[];
-+u32 MCD_contextSave15[];
-+
-+u32 MCD_realTaskTableSrc[] =
-+{
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab0,   /* Task 0 Variable Table */
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave0,  /* Task 0 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab1,   /* Task 1 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab1,  /* Task 1 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave1,  /* Task 1 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab2,   /* Task 2 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab2,  /* Task 2 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave2,  /* Task 2 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab3,   /* Task 3 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab3,  /* Task 3 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave3,  /* Task 3 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab4,   /* Task 4 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab4,  /* Task 4 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave4,  /* Task 4 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab5,   /* Task 5 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab5,  /* Task 5 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave5,  /* Task 5 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab6,   /* Task 6 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab6,  /* Task 6 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave6,  /* Task 6 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab7,   /* Task 7 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab7,  /* Task 7 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave7,  /* Task 7 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab8,   /* Task 8 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab8,  /* Task 8 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave8,  /* Task 8 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab9,   /* Task 9 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab9,  /* Task 9 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave9,  /* Task 9 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab10,  /* Task 10 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab10, /* Task 10 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave10, /* Task 10 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab11,  /* Task 11 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab11, /* Task 11 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave11, /* Task 11 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab12,  /* Task 12 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab12, /* Task 12 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave12, /* Task 12 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab13,  /* Task 13 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab13, /* Task 13 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave13, /* Task 13 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab14,  /* Task 14 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab14, /* Task 14 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave14, /* Task 14 context save space */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_varTab15,  /* Task 15 Variable Table */
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_funcDescTab15, /* Task 15 Function Descriptor Table & Flags */
-+#else
-+    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
-+#endif
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_contextSave15, /* Task 15 context save space */
-+    0x00000000,
-+};
-+
-+
-+u32 MCD_varTab0[] =
-+{   /* Task 0 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+
-+u32 MCD_varTab1[] =
-+{   /* Task 1 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab2[]=
-+{   /* Task 2 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab3[]=
-+{   /* Task 3 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab4[]=
-+{   /* Task 4 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab5[]=
-+{   /* Task 5 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab6[]=
-+{   /* Task 6 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab7[]=
-+{   /* Task 7 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab8[]=
-+{   /* Task 8 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab9[]=
-+{   /* Task 9 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab10[]=
-+{   /* Task 10 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab11[]=
-+{   /* Task 11 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab12[]=
-+{   /* Task 12 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab13[]=
-+{   /* Task 13 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab14[]=
-+{   /* Task 14 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_varTab15[]=
-+{   /* Task 15 Variable Table */
-+    0x00000000, /* var[0] */
-+    0x00000000, /* var[1] */
-+    0x00000000, /* var[2] */
-+    0x00000000, /* var[3] */
-+    0x00000000, /* var[4] */
-+    0x00000000, /* var[5] */
-+    0x00000000, /* var[6] */
-+    0x00000000, /* var[7] */
-+    0x00000000, /* var[8] */
-+    0x00000000, /* var[9] */
-+    0x00000000, /* var[10] */
-+    0x00000000, /* var[11] */
-+    0x00000000, /* var[12] */
-+    0x00000000, /* var[13] */
-+    0x00000000, /* var[14] */
-+    0x00000000, /* var[15] */
-+    0x00000000, /* var[16] */
-+    0x00000000, /* var[17] */
-+    0x00000000, /* var[18] */
-+    0x00000000, /* var[19] */
-+    0x00000000, /* var[20] */
-+    0x00000000, /* var[21] */
-+    0x00000000, /* var[22] */
-+    0x00000000, /* var[23] */
-+    0xe0000000, /* inc[0] */
-+    0x20000000, /* inc[1] */
-+    0x2000ffff, /* inc[2] */
-+    0x00000000, /* inc[3] */
-+    0x00000000, /* inc[4] */
-+    0x00000000, /* inc[5] */
-+    0x00000000, /* inc[6] */
-+    0x00000000, /* inc[7] */
-+};
-+
-+u32 MCD_funcDescTab0[]=
-+{   /* Task 0 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+#ifdef MCD_INCLUDE_EU
-+u32 MCD_funcDescTab1[]=
-+{   /* Task 1 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab2[]=
-+{   /* Task 2 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab3[]=
-+{   /* Task 3 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab4[]=
-+{   /* Task 4 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab5[]=
-+{   /* Task 5 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab6[]=
-+{   /* Task 6 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab7[]=
-+{   /* Task 7 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab8[]=
-+{   /* Task 8 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab9[]=
-+{   /* Task 9 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab10[]=
-+{   /* Task 10 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab11[]=
-+{   /* Task 11 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab12[]=
-+{   /* Task 12 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab13[]=
-+{   /* Task 13 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab14[]=
-+{   /* Task 14 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+
-+u32 MCD_funcDescTab15[]=
-+{   /* Task 15 Function Descriptor Table */
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0xa0045670, /* mainFunc(), EU# 3 */
-+    0xa0000000, /* rsduFunc(), EU# 3 */
-+    0xa0000000, /* crcAccumVal(), EU# 3 */
-+    0x20000000, /* setCrcAccum(), EU# 3 */
-+    0x21800000, /* and(), EU# 3 */
-+    0x21e00000, /* or(), EU# 3 */
-+    0x20400000, /* add(), EU# 3 */
-+    0x20500000, /* sub(), EU# 3 */
-+    0x205a0000, /* andNot(), EU# 3 */
-+    0x20a00000, /* shiftR(), EU# 3 */
-+    0x202fa000, /* andReadyBit(), EU# 3 */
-+    0x202f9000, /* andNotReadyBit(), EU# 3 */
-+    0x202ea000, /* andWrapBit(), EU# 3 */
-+    0x202da000, /* andLastBit(), EU# 3 */
-+    0x202e2000, /* andInterruptBit(), EU# 3 */
-+    0x202f2000, /* andCrcRestartBit(), EU# 3 */
-+};
-+#endif /*MCD_INCLUDE_EU*/
-+
-+u32 MCD_contextSave0[128];  /* Task 0 context save space */
-+u32 MCD_contextSave1[128];  /* Task 1 context save space */
-+u32 MCD_contextSave2[128];  /* Task 2 context save space */
-+u32 MCD_contextSave3[128];  /* Task 3 context save space */
-+u32 MCD_contextSave4[128];  /* Task 4 context save space */
-+u32 MCD_contextSave5[128];  /* Task 5 context save space */
-+u32 MCD_contextSave6[128];  /* Task 6 context save space */
-+u32 MCD_contextSave7[128];  /* Task 7 context save space */
-+u32 MCD_contextSave8[128];  /* Task 8 context save space */
-+u32 MCD_contextSave9[128];  /* Task 9 context save space */
-+u32 MCD_contextSave10[128]; /* Task 10 context save space */
-+u32 MCD_contextSave11[128]; /* Task 11 context save space */
-+u32 MCD_contextSave12[128]; /* Task 12 context save space */
-+u32 MCD_contextSave13[128]; /* Task 13 context save space */
-+u32 MCD_contextSave14[128]; /* Task 14 context save space */
-+u32 MCD_contextSave15[128]; /* Task 15 context save space */
-+
-+u32 MCD_ChainNoEu_TDT[];
-+u32 MCD_SingleNoEu_TDT[];
-+#ifdef MCD_INCLUDE_EU
-+u32 MCD_ChainEu_TDT[];
-+u32 MCD_SingleEu_TDT[];
-+#endif
-+u32 MCD_ENetRcv_TDT[];
-+u32 MCD_ENetXmit_TDT[];
-+
-+u32 MCD_modelTaskTableSrc[]=
-+{
-+    (u32)MCD_ChainNoEu_TDT,
-+    (u32)&((u8*)MCD_ChainNoEu_TDT)[0x0000016c],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_SingleNoEu_TDT,
-+    (u32)&((u8*)MCD_SingleNoEu_TDT)[0x000000d4],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+#ifdef MCD_INCLUDE_EU
-+    (u32)MCD_ChainEu_TDT,
-+    (u32)&((u8*)MCD_ChainEu_TDT)[0x000001b4],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_SingleEu_TDT,
-+    (u32)&((u8*)MCD_SingleEu_TDT)[0x00000124],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+#endif
-+    (u32)MCD_ENetRcv_TDT,
-+    (u32)&((u8*)MCD_ENetRcv_TDT)[0x000000a4],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    (u32)MCD_ENetXmit_TDT,
-+    (u32)&((u8*)MCD_ENetXmit_TDT)[0x000000d0],
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+    0x00000000,
-+};
-+u32 MCD_ChainNoEu_TDT[]=
-+{
-+    0x80004000, /* 0000(:370):  LCDEXT: idx0 = 0x00000000; ; */
-+    0x8118801b, /* 0004(:370):  LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
-+    0xb8c60018, /* 0008(:371):    LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */
-+    0x10002b10, /* 000C(:372):      DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x7000000d, /* 0010(:373):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x018cf89f, /* 0014(:373):      DRD2B1: var6 = EU3(); EU3(idx2)  */
-+    0x6000000a, /* 0018(:374):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf89f, /* 001C(:374):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
-+    0x000001f8, /* 0020(:0):    NOP */
-+    0x98180364, /* 0024(:378):  LCD: idx0 = idx0; idx0 == var13; idx0 += inc4 */
-+    0x8118801b, /* 0028(:380):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
-+    0xf8c6001a, /* 002C(:381):      LCDEXT: idx2 = *(idx1 + var12 + 8); idx2 once var0; idx2 += inc3 */
-+    0xb8c6601b, /* 0030(:382):      LCD: idx3 = *(idx1 + var12 + 12); ; idx3 += inc3 */
-+    0x10002710, /* 0034(:384):        DRD1A: var9 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x00000f18, /* 0038(:385):        DRD1A: var3 = idx3; FN=0 init=0 WS=0 RS=0 */
-+    0xb8c6001d, /* 003C(:387):      LCD: idx2 = *(idx1 + var12 + 20); idx2 once var0; idx2 += inc3 */
-+    0x10001310, /* 0040(:388):        DRD1A: var4 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x60000007, /* 0044(:389):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
-+    0x014cf88b, /* 0048(:389):        DRD2B1: var5 = EU3(); EU3(idx2,var11)  */
-+    0x98c6001c, /* 004C(:391):      LCD: idx2 = idx1 + var12 + 4; idx2 once var0; idx2 += inc3 */
-+    0x00000710, /* 0050(:392):        DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
-+    0x98c70018, /* 0054(:393):      LCD: idx2 = idx1 + var14; idx2 once var0; idx2 += inc3 */
-+    0x10001f10, /* 0058(:394):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c818, /* 005C(:395):        DRD1A: *idx2 = var3; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0060(:0):      NOP */
-+    0xc1476018, /* 0064(:399):    LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */
-+    0xc003231d, /* 0068(:399):    LCDEXT: idx2 = var0, idx3 = var6; idx3 == var12; idx2 += inc3, idx3 += inc5 */
-+    0x811a601b, /* 006C(:400):    LCD: idx4 = var2; ; idx4 += inc3 */
-+    0xc1862102, /* 0070(:403):      LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */
-+    0x849be009, /* 0074(:403):      LCD: idx7 = var9; ; idx7 += inc1 */
-+    0x03fed7b8, /* 0078(:406):        DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
-+    0xda9b001b, /* 007C(:408):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 0080(:408):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x1000cb20, /* 0084(:409):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0088(:410):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 008C(:410):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb28, /* 0090(:411):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0094(:412):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 0098(:412):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb30, /* 009C(:413):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00A0(:414):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 00A4(:414):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb38, /* 00A8(:415):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c728, /* 00AC(:416):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00B0(:0):      NOP */
-+    0xc1476018, /* 00B4(:420):    LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */
-+    0xc003241d, /* 00B8(:420):    LCDEXT: idx2 = var0, idx3 = var6; idx3 == var16; idx2 += inc3, idx3 += inc5 */
-+    0x811a601b, /* 00BC(:421):    LCD: idx4 = var2; ; idx4 += inc3 */
-+    0xda9b001b, /* 00C0(:424):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00C4(:424):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x0000d3a0, /* 00C8(:425):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
-+    0xc1862102, /* 00CC(:427):      LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */
-+    0x849be009, /* 00D0(:427):      LCD: idx7 = var9; ; idx7 += inc1 */
-+    0x0bfed7b8, /* 00D4(:430):        DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
-+    0xda9b001b, /* 00D8(:432):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00DC(:432):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x1000cb20, /* 00E0(:433):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00E4(:434):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 00E8(:434):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb28, /* 00EC(:435):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00F0(:436):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 00F4(:436):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb30, /* 00F8(:437):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00FC(:438):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88f, /* 0100(:438):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
-+    0x1000cb38, /* 0104(:439):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c728, /* 0108(:440):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 010C(:0):      NOP */
-+    0x8118801b, /* 0110(:444):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
-+    0xd8c60018, /* 0114(:446):      LCDEXT: idx2 = idx1 + var12; idx2 once var0; idx2 += inc3 */
-+    0x98c6601c, /* 0118(:446):      LCD: idx3 = idx1 + var12 + 4; ; idx3 += inc3 */
-+    0x6000000b, /* 011C(:447):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
-+    0x0c8cfc9f, /* 0120(:447):        DRD2B1: *idx2 = EU3(); EU3(*idx2)  */
-+    0x000001f8, /* 0124(:0):      NOP */
-+    0xa146001e, /* 0128(:450):    LCD: idx1 = *(var2 + var12 + 24); idx1 once var0; idx1 += inc3 */
-+    0x10000b08, /* 012C(:451):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x10002050, /* 0130(:452):      DRD1A: var8 = var10; FN=0 MORE init=0 WS=0 RS=0 */
-+    0xb8c60018, /* 0134(:453):      LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */
-+    0x10002b10, /* 0138(:454):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x7000000a, /* 013C(:455):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */
-+    0x080cf89f, /* 0140(:455):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
-+    0x6000000d, /* 0144(:456):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
-+    0x018cf89f, /* 0148(:456):        DRD2B1: var6 = EU3(); EU3(idx2)  */
-+    0x000001f8, /* 014C(:0):      NOP */
-+    0x8618801b, /* 0150(:462):    LCD: idx1 = var12; idx1 once var0; idx1 += inc3 */
-+    0x7000000e, /* 0154(:463):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
-+    0x084cf21f, /* 0158(:463):      DRD2B1: idx1 = EU3(); EU3(var8)  */
-+    0xd8990336, /* 015C(:464):      LCDEXT: idx2 = idx1; idx2 > var12; idx2 += inc6 */
-+    0x8019801b, /* 0160(:464):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
-+    0x040001f8, /* 0164(:465):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0168(:0):      NOP */
-+    0x000001f8, /* 016C(:0):    NOP */
-+};
-+u32 MCD_SingleNoEu_TDT[]=
-+{
-+    0x8198001b, /* 0000(:657):  LCD: idx0 = var3; idx0 once var0; idx0 += inc3 */
-+    0x7000000d, /* 0004(:658):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x080cf81f, /* 0008(:658):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
-+    0x8198801b, /* 000C(:659):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
-+    0x6000000e, /* 0010(:660):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
-+    0x084cf85f, /* 0014(:660):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
-+    0x000001f8, /* 0018(:0):    NOP */
-+    0x8298001b, /* 001C(:664):  LCD: idx0 = var5; idx0 once var0; idx0 += inc3 */
-+    0x7000000d, /* 0020(:665):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x010cf81f, /* 0024(:665):    DRD2B1: var4 = EU3(); EU3(idx0)  */
-+    0x6000000e, /* 0028(:666):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
-+    0x018cf81f, /* 002C(:666):    DRD2B1: var6 = EU3(); EU3(idx0)  */
-+    0xc202601b, /* 0030(:669):  LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */
-+    0xc002221c, /* 0034(:669):  LCDEXT: idx2 = var0, idx3 = var4; idx3 == var8; idx2 += inc3, idx3 += inc4 */
-+    0x809a601b, /* 0038(:670):  LCD: idx4 = var1; ; idx4 += inc3 */
-+    0xc10420c2, /* 003C(:673):    LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */
-+    0x839be009, /* 0040(:673):    LCD: idx7 = var7; ; idx7 += inc1 */
-+    0x03fed7b8, /* 0044(:676):      DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
-+    0xda9b001b, /* 0048(:678):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 004C(:678):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000006, /* 0050(:680):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 0054(:680):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x1000cb28, /* 0058(:681):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 005C(:682):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 0060(:682):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x1000cb30, /* 0064(:683):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0068(:684):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 006C(:684):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x0000cb38, /* 0070(:685):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0074(:0):    NOP */
-+    0xc202601b, /* 0078(:689):  LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */
-+    0xc002229c, /* 007C(:689):  LCDEXT: idx2 = var0, idx3 = var4; idx3 == var10; idx2 += inc3, idx3 += inc4 */
-+    0x809a601b, /* 0080(:690):  LCD: idx4 = var1; ; idx4 += inc3 */
-+    0xda9b001b, /* 0084(:693):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 0088(:693):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x0000d3a0, /* 008C(:694):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
-+    0xc10420c2, /* 0090(:696):    LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */
-+    0x839be009, /* 0094(:696):    LCD: idx7 = var7; ; idx7 += inc1 */
-+    0x0bfed7b8, /* 0098(:699):      DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
-+    0xda9b001b, /* 009C(:701):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00A0(:701):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000006, /* 00A4(:703):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 00A8(:703):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x1000cb28, /* 00AC(:704):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00B0(:705):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 00B4(:705):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x1000cb30, /* 00B8(:706):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00BC(:707):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf889, /* 00C0(:707):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
-+    0x0000cb38, /* 00C4(:708):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00C8(:0):    NOP */
-+    0xc318022d, /* 00CC(:712):  LCDEXT: idx0 = var6; idx0 > var8; idx0 += inc5 */
-+    0x8018801b, /* 00D0(:712):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
-+    0x040001f8, /* 00D4(:713):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+};
-+#ifdef MCD_INCLUDE_EU
-+u32 MCD_ChainEu_TDT[]=
-+{
-+    0x80004000, /* 0000(:947):  LCDEXT: idx0 = 0x00000000; ; */
-+    0x8198801b, /* 0004(:947):  LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
-+    0xb8c68018, /* 0008(:948):    LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */
-+    0x10002f10, /* 000C(:949):      DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x7000000d, /* 0010(:950):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x01ccf89f, /* 0014(:950):      DRD2B1: var7 = EU3(); EU3(idx2)  */
-+    0x6000000a, /* 0018(:951):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf89f, /* 001C(:951):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
-+    0x000001f8, /* 0020(:0):    NOP */
-+    0x981803a4, /* 0024(:955):  LCD: idx0 = idx0; idx0 == var14; idx0 += inc4 */
-+    0x8198801b, /* 0028(:957):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
-+    0xf8c6801a, /* 002C(:958):      LCDEXT: idx2 = *(idx1 + var13 + 8); idx2 once var0; idx2 += inc3 */
-+    0xb8c6e01b, /* 0030(:959):      LCD: idx3 = *(idx1 + var13 + 12); ; idx3 += inc3 */
-+    0x10002b10, /* 0034(:961):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x00001318, /* 0038(:962):        DRD1A: var4 = idx3; FN=0 init=0 WS=0 RS=0 */
-+    0xb8c6801d, /* 003C(:964):      LCD: idx2 = *(idx1 + var13 + 20); idx2 once var0; idx2 += inc3 */
-+    0x10001710, /* 0040(:965):        DRD1A: var5 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x60000007, /* 0044(:966):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
-+    0x018cf88c, /* 0048(:966):        DRD2B1: var6 = EU3(); EU3(idx2,var12)  */
-+    0x98c6801c, /* 004C(:968):      LCD: idx2 = idx1 + var13 + 4; idx2 once var0; idx2 += inc3 */
-+    0x00000b10, /* 0050(:969):        DRD1A: var2 = idx2; FN=0 init=0 WS=0 RS=0 */
-+    0x98c78018, /* 0054(:970):      LCD: idx2 = idx1 + var15; idx2 once var0; idx2 += inc3 */
-+    0x10002310, /* 0058(:971):        DRD1A: var8 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c820, /* 005C(:972):        DRD1A: *idx2 = var4; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0060(:0):      NOP */
-+    0x8698801b, /* 0064(:976):    LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */
-+    0x7000000f, /* 0068(:977):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */
-+    0x084cf2df, /* 006C(:977):      DRD2B1: idx1 = EU3(); EU3(var11)  */
-+    0xd899042d, /* 0070(:978):      LCDEXT: idx2 = idx1; idx2 >= var16; idx2 += inc5 */
-+    0x8019801b, /* 0074(:978):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
-+    0x60000003, /* 0078(:979):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
-+    0x2cd7c7df, /* 007C(:979):        DRD2B2: EU3(var13)  */
-+    0xd8990364, /* 0080(:980):      LCDEXT: idx2 = idx1; idx2 == var13; idx2 += inc4 */
-+    0x8019801b, /* 0084(:980):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
-+    0x60000003, /* 0088(:981):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
-+    0x2c17c7df, /* 008C(:981):        DRD2B2: EU3(var1)  */
-+    0x000001f8, /* 0090(:0):      NOP */
-+    0xc1c7e018, /* 0094(:984):    LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */
-+    0xc003a35e, /* 0098(:984):    LCDEXT: idx2 = var0, idx3 = var7; idx3 == var13; idx2 += inc3, idx3 += inc6 */
-+    0x819a601b, /* 009C(:985):    LCD: idx4 = var3; ; idx4 += inc3 */
-+    0xc206a142, /* 00A0(:988):      LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */
-+    0x851be009, /* 00A4(:988):      LCD: idx7 = var10; ; idx7 += inc1 */
-+    0x63fe0000, /* 00A8(:991):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
-+    0x0d4cfddf, /* 00AC(:991):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
-+    0xda9b001b, /* 00B0(:993):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00B4(:993):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000002, /* 00B8(:994):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-+    0x004cf81f, /* 00BC(:994):        DRD2B1: var1 = EU3(); EU3(idx0)  */
-+    0x1000cb20, /* 00C0(:995):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00C4(:996):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 00C8(:996):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb28, /* 00CC(:997):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00D0(:998):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 00D4(:998):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb30, /* 00D8(:999):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00DC(:1000):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 00E0(:1000):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb38, /* 00E4(:1001):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c728, /* 00E8(:1002):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00EC(:0):      NOP */
-+    0xc1c7e018, /* 00F0(:1006):    LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */
-+    0xc003a49e, /* 00F4(:1006):    LCDEXT: idx2 = var0, idx3 = var7; idx3 == var18; idx2 += inc3, idx3 += inc6 */
-+    0x819a601b, /* 00F8(:1007):    LCD: idx4 = var3; ; idx4 += inc3 */
-+    0xda9b001b, /* 00FC(:1010):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 0100(:1010):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x0000d3a0, /* 0104(:1011):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
-+    0xc206a142, /* 0108(:1013):      LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */
-+    0x851be009, /* 010C(:1013):      LCD: idx7 = var10; ; idx7 += inc1 */
-+    0x6bfe0000, /* 0110(:1016):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
-+    0x0d4cfddf, /* 0114(:1016):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
-+    0xda9b001b, /* 0118(:1018):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 011C(:1018):      LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000002, /* 0120(:1019):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-+    0x004cf81f, /* 0124(:1019):        DRD2B1: var1 = EU3(); EU3(idx0)  */
-+    0x1000cb20, /* 0128(:1020):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 012C(:1021):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 0130(:1021):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb28, /* 0134(:1022):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0138(:1023):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 013C(:1023):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb30, /* 0140(:1024):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0144(:1025):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf891, /* 0148(:1025):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
-+    0x1000cb38, /* 014C(:1026):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x0000c728, /* 0150(:1027):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0154(:0):      NOP */
-+    0x8198801b, /* 0158(:1031):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
-+    0xd8c68018, /* 015C(:1033):      LCDEXT: idx2 = idx1 + var13; idx2 once var0; idx2 += inc3 */
-+    0x98c6e01c, /* 0160(:1033):      LCD: idx3 = idx1 + var13 + 4; ; idx3 += inc3 */
-+    0x6000000b, /* 0164(:1034):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
-+    0x0c8cfc9f, /* 0168(:1034):        DRD2B1: *idx2 = EU3(); EU3(*idx2)  */
-+    0x0000cc08, /* 016C(:1035):      DRD1A: *idx3 = var1; FN=0 init=0 WS=0 RS=0 */
-+    0xa1c6801e, /* 0170(:1038):    LCD: idx1 = *(var3 + var13 + 24); idx1 once var0; idx1 += inc3 */
-+    0x10000f08, /* 0174(:1039):      DRD1A: var3 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x10002458, /* 0178(:1040):      DRD1A: var9 = var11; FN=0 MORE init=0 WS=0 RS=0 */
-+    0xb8c68018, /* 017C(:1041):      LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */
-+    0x10002f10, /* 0180(:1042):        DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x7000000a, /* 0184(:1043):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */
-+    0x080cf89f, /* 0188(:1043):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
-+    0x6000000d, /* 018C(:1044):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
-+    0x01ccf89f, /* 0190(:1044):        DRD2B1: var7 = EU3(); EU3(idx2)  */
-+    0x000001f8, /* 0194(:0):      NOP */
-+    0x8698801b, /* 0198(:1050):    LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */
-+    0x7000000e, /* 019C(:1051):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
-+    0x084cf25f, /* 01A0(:1051):      DRD2B1: idx1 = EU3(); EU3(var9)  */
-+    0xd899037f, /* 01A4(:1052):      LCDEXT: idx2 = idx1; idx2 > var13; idx2 += inc7 */
-+    0x8019801b, /* 01A8(:1052):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
-+    0x040001f8, /* 01AC(:1053):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+    0x000001f8, /* 01B0(:0):      NOP */
-+    0x000001f8, /* 01B4(:0):    NOP */
-+};
-+u32 MCD_SingleEu_TDT[]=
-+{
-+    0x8218001b, /* 0000(:1248):  LCD: idx0 = var4; idx0 once var0; idx0 += inc3 */
-+    0x7000000d, /* 0004(:1249):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x080cf81f, /* 0008(:1249):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
-+    0x8218801b, /* 000C(:1250):    LCD: idx1 = var4; idx1 once var0; idx1 += inc3 */
-+    0x6000000e, /* 0010(:1251):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
-+    0x084cf85f, /* 0014(:1251):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
-+    0x000001f8, /* 0018(:0):    NOP */
-+    0x8318001b, /* 001C(:1255):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
-+    0x7000000d, /* 0020(:1256):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x014cf81f, /* 0024(:1256):    DRD2B1: var5 = EU3(); EU3(idx0)  */
-+    0x6000000e, /* 0028(:1257):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
-+    0x01ccf81f, /* 002C(:1257):    DRD2B1: var7 = EU3(); EU3(idx0)  */
-+    0x8498001b, /* 0030(:1260):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
-+    0x7000000f, /* 0034(:1261):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */
-+    0x080cf19f, /* 0038(:1261):    DRD2B1: idx0 = EU3(); EU3(var6)  */
-+    0xd81882a4, /* 003C(:1262):    LCDEXT: idx1 = idx0; idx1 >= var10; idx1 += inc4 */
-+    0x8019001b, /* 0040(:1262):    LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */
-+    0x60000003, /* 0044(:1263):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
-+    0x2c97c7df, /* 0048(:1263):      DRD2B2: EU3(var9)  */
-+    0xd818826d, /* 004C(:1264):    LCDEXT: idx1 = idx0; idx1 == var9; idx1 += inc5 */
-+    0x8019001b, /* 0050(:1264):    LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */
-+    0x60000003, /* 0054(:1265):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
-+    0x2c17c7df, /* 0058(:1265):      DRD2B2: EU3(var1)  */
-+    0x000001f8, /* 005C(:0):    NOP */
-+    0xc282e01b, /* 0060(:1268):  LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */
-+    0xc002a25e, /* 0064(:1268):  LCDEXT: idx2 = var0, idx3 = var5; idx3 == var9; idx2 += inc3, idx3 += inc6 */
-+    0x811a601b, /* 0068(:1269):  LCD: idx4 = var2; ; idx4 += inc3 */
-+    0xc184a102, /* 006C(:1272):    LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */
-+    0x841be009, /* 0070(:1272):    LCD: idx7 = var8; ; idx7 += inc1 */
-+    0x63fe0000, /* 0074(:1275):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
-+    0x0d4cfddf, /* 0078(:1275):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
-+    0xda9b001b, /* 007C(:1277):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 0080(:1277):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000002, /* 0084(:1279):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-+    0x004cf99f, /* 0088(:1279):      DRD2B1: var1 = EU3(); EU3(idx6)  */
-+    0x70000006, /* 008C(:1280):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 0090(:1280):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x1000cb28, /* 0094(:1281):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0098(:1282):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 009C(:1282):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x1000cb30, /* 00A0(:1283):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00A4(:1284):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 00A8(:1284):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x0000cb38, /* 00AC(:1285):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00B0(:0):    NOP */
-+    0xc282e01b, /* 00B4(:1289):  LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */
-+    0xc002a31e, /* 00B8(:1289):  LCDEXT: idx2 = var0, idx3 = var5; idx3 == var12; idx2 += inc3, idx3 += inc6 */
-+    0x811a601b, /* 00BC(:1290):  LCD: idx4 = var2; ; idx4 += inc3 */
-+    0xda9b001b, /* 00C0(:1293):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00C4(:1293):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x0000d3a0, /* 00C8(:1294):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
-+    0xc184a102, /* 00CC(:1296):    LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */
-+    0x841be009, /* 00D0(:1296):    LCD: idx7 = var8; ; idx7 += inc1 */
-+    0x6bfe0000, /* 00D4(:1299):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
-+    0x0d4cfddf, /* 00D8(:1299):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
-+    0xda9b001b, /* 00DC(:1301):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
-+    0x9b9be01b, /* 00E0(:1301):    LCD: idx7 = idx7; ; idx7 += inc3 */
-+    0x70000002, /* 00E4(:1303):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
-+    0x004cf99f, /* 00E8(:1303):      DRD2B1: var1 = EU3(); EU3(idx6)  */
-+    0x70000006, /* 00EC(:1304):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 00F0(:1304):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x1000cb28, /* 00F4(:1305):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 00F8(:1306):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 00FC(:1306):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x1000cb30, /* 0100(:1307):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x70000006, /* 0104(:1308):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
-+    0x088cf88b, /* 0108(:1308):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
-+    0x0000cb38, /* 010C(:1309):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
-+    0x000001f8, /* 0110(:0):    NOP */
-+    0x8144801c, /* 0114(:1312):  LCD: idx0 = var2 + var9 + 4; idx0 once var0; idx0 += inc3 */
-+    0x0000c008, /* 0118(:1313):    DRD1A: *idx0 = var1; FN=0 init=0 WS=0 RS=0 */
-+    0xc398027f, /* 011C(:1315):  LCDEXT: idx0 = var7; idx0 > var9; idx0 += inc7 */
-+    0x8018801b, /* 0120(:1315):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
-+    0x040001f8, /* 0124(:1316):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+};
-+#endif
-+u32 MCD_ENetRcv_TDT[]=
-+{
-+    0x80004000, /* 0000(:1389):  LCDEXT: idx0 = 0x00000000; ; */
-+    0x81988000, /* 0004(:1389):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
-+    0x10000788, /* 0008(:1390):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x6000000a, /* 000C(:1391):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf05f, /* 0010(:1391):    DRD2B1: idx0 = EU3(); EU3(var1)  */
-+    0x98180209, /* 0014(:1394):  LCD: idx0 = idx0; idx0 != var8; idx0 += inc1 */
-+    0x81c40004, /* 0018(:1396):    LCD: idx1 = var3 + var8 + 4; idx1 once var0; idx1 += inc0 */
-+    0x7000000e, /* 001C(:1397):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
-+    0x010cf05f, /* 0020(:1397):      DRD2B1: var4 = EU3(); EU3(var1)  */
-+    0x7000000c, /* 0024(:1398):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
-+    0x01ccf05f, /* 0028(:1398):      DRD2B1: var7 = EU3(); EU3(var1)  */
-+    0x70000004, /* 002C(:1399):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
-+    0x014cf049, /* 0030(:1399):      DRD2B1: var5 = EU3(); EU3(var1,var9)  */
-+    0x70000004, /* 0034(:1400):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
-+    0x004cf04a, /* 0038(:1400):      DRD2B1: var1 = EU3(); EU3(var1,var10)  */
-+    0x00000b88, /* 003C(:1403):      DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */
-+    0xc4030150, /* 0040(:1406):    LCDEXT: idx1 = var8, idx2 = var6; idx1 < var5; idx1 += inc2, idx2 += inc0 */
-+    0x8119e012, /* 0044(:1406):    LCD: idx3 = var2; ; idx3 += inc2 */
-+    0x03e0cf90, /* 0048(:1409):      DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */
-+    0x81188000, /* 004C(:1412):    LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */
-+    0x000ac788, /* 0050(:1413):      DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */
-+    0xc4030000, /* 0054(:1415):    LCDEXT: idx1 = var8, idx2 = var6; idx1 once var0; idx1 += inc0, idx2 += inc0 */
-+    0x8199e000, /* 0058(:1415):    LCD: idx3 = var3; ; idx3 += inc0 */
-+    0x63e00004, /* 005C(:1418):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=31 WS=0 RS=0 */
-+    0x084cfc8b, /* 0060(:1418):      DRD2B1: idx1 = EU3(); EU3(*idx2,var11)  */
-+    0xd8990000, /* 0064(:1421):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
-+    0x9999e000, /* 0068(:1421):    LCD: idx3 = idx3; ; idx3 += inc0 */
-+    0x60000005, /* 006C(:1422):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
-+    0x0cccf841, /* 0070(:1422):      DRD2B1: *idx3 = EU3(); EU3(idx1,var1)  */
-+    0x81c60000, /* 0074(:1427):    LCD: idx1 = var3 + var12; idx1 once var0; idx1 += inc0 */
-+    0xc399021b, /* 0078(:1429):      LCDEXT: idx2 = var7; idx2 > var8; idx2 += inc3 */
-+    0x80198000, /* 007C(:1429):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
-+    0x00008400, /* 0080(:1430):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
-+    0x00000f08, /* 0084(:1431):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
-+    0x81988000, /* 0088(:1434):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
-+    0x10000788, /* 008C(:1435):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x6000000a, /* 0090(:1436):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf05f, /* 0094(:1436):      DRD2B1: idx0 = EU3(); EU3(var1)  */
-+    0xc2188209, /* 0098(:1439):    LCDEXT: idx1 = var4; idx1 != var8; idx1 += inc1 */
-+    0x80190000, /* 009C(:1439):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
-+    0x040001f8, /* 00A0(:1440):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00A4(:0):    NOP */
-+};
-+u32 MCD_ENetXmit_TDT[]=
-+{
-+    0x80004000, /* 0000(:1515):  LCDEXT: idx0 = 0x00000000; ; */
-+    0x81988000, /* 0004(:1515):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
-+    0x10000788, /* 0008(:1516):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x6000000a, /* 000C(:1517):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf05f, /* 0010(:1517):    DRD2B1: idx0 = EU3(); EU3(var1)  */
-+    0x98180309, /* 0014(:1520):  LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */
-+    0x80004003, /* 0018(:1522):    LCDEXT: idx1 = 0x00000003; ; */
-+    0x81c60004, /* 001C(:1522):    LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */
-+    0x7000000e, /* 0020(:1523):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
-+    0x014cf05f, /* 0024(:1523):      DRD2B1: var5 = EU3(); EU3(var1)  */
-+    0x7000000c, /* 0028(:1524):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
-+    0x028cf05f, /* 002C(:1524):      DRD2B1: var10 = EU3(); EU3(var1)  */
-+    0x7000000d, /* 0030(:1525):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
-+    0x018cf05f, /* 0034(:1525):      DRD2B1: var6 = EU3(); EU3(var1)  */
-+    0x70000004, /* 0038(:1526):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
-+    0x01ccf04d, /* 003C(:1526):      DRD2B1: var7 = EU3(); EU3(var1,var13)  */
-+    0x10000b90, /* 0040(:1527):      DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x60000004, /* 0044(:1528):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */
-+    0x020cf0a1, /* 0048(:1528):      DRD2B1: var8 = EU3(); EU3(var2,idx1)  */
-+    0xc3188312, /* 004C(:1531):    LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */
-+    0x83c70000, /* 0050(:1531):    LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */
-+    0x00001f10, /* 0054(:1532):      DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */
-+    0xc583a3c3, /* 0058(:1534):    LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */
-+    0x81042325, /* 005C(:1534):    LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */
-+    0x03e0c798, /* 0060(:1539):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */
-+    0xd8990000, /* 0064(:1542):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
-+    0x9999e000, /* 0068(:1542):    LCD: idx3 = idx3; ; idx3 += inc0 */
-+    0x000acf98, /* 006C(:1543):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
-+    0xd8992306, /* 0070(:1545):    LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */
-+    0x9999e03f, /* 0074(:1545):    LCD: idx3 = idx3; ; idx3 += inc7 */
-+    0x03eac798, /* 0078(:1548):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */
-+    0xd8990000, /* 007C(:1551):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
-+    0x9999e000, /* 0080(:1551):    LCD: idx3 = idx3; ; idx3 += inc0 */
-+    0x000acf98, /* 0084(:1552):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
-+    0xd8990000, /* 0088(:1554):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
-+    0x99832302, /* 008C(:1554):    LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */
-+    0x0beac798, /* 0090(:1557):      DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */
-+    0x81988000, /* 0094(:1559):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
-+    0x6000000b, /* 0098(:1560):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
-+    0x0c4cfc5f, /* 009C(:1560):      DRD2B1: *idx1 = EU3(); EU3(*idx1)  */
-+    0x81c80000, /* 00A0(:1562):    LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */
-+    0xc5190312, /* 00A4(:1564):      LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */
-+    0x80198000, /* 00A8(:1564):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
-+    0x00008400, /* 00AC(:1565):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
-+    0x00000f08, /* 00B0(:1566):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
-+    0x81988000, /* 00B4(:1569):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
-+    0x10000788, /* 00B8(:1570):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
-+    0x6000000a, /* 00BC(:1571):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
-+    0x080cf05f, /* 00C0(:1571):      DRD2B1: idx0 = EU3(); EU3(var1)  */
-+    0xc2988309, /* 00C4(:1574):    LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */
-+    0x80190000, /* 00C8(:1574):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
-+    0x040001f8, /* 00CC(:1575):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
-+    0x000001f8, /* 00D0(:0):    NOP */
-+};
-+
-+#ifdef MCD_INCLUDE_EU
-+MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
-+#endif
---- /dev/null
-+++ b/drivers/dma/MCD_tasksInit.c
-@@ -0,0 +1,238 @@
-+/*
-+ * drivers/dma/MCD_tasksInit.c
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/*
-+ * Autogenerated - Do not edit!
-+ */
-+
-+#include "MCD_dma.h"
-+
-+extern dmaRegs *MCD_dmaBar;
-+
-+
-+/*
-+ * Task 0
-+ */
-+
-+void  MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 11, (u32)xferSize);  /* var[11] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
-+    MCD_SET_VAR(taskTable+channel, 13, (u32)0x80000000);    /* var[13] */
-+    MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000010);    /* var[14] */
-+    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
-+    MCD_SET_VAR(taskTable+channel, 16, (u32)0x08000000);    /* var[16] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
-+    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000);    /* inc[4] */
-+    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
-+    MCD_SET_VAR(taskTable+channel, 30, (u32)0x40000000);    /* inc[6] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
-+
-+
-+/*
-+ * Task 1
-+ */
-+
-+void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)srcAddr);    /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)destAddr);   /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)dmaSize);    /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)flags);  /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000004); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x08000000);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
-+    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
-+    MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
-+
-+
-+/*
-+ * Task 2
-+ */
-+
-+void  MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 12, (u32)xferSize);  /* var[12] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
-+    MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
-+    MCD_SET_VAR(taskTable+channel, 14, (u32)0x80000000);    /* var[14] */
-+    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000010);    /* var[15] */
-+    MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000001);    /* var[16] */
-+    MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000004);    /* var[17] */
-+    MCD_SET_VAR(taskTable+channel, 18, (u32)0x08000000);    /* var[18] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
-+    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000);    /* inc[4] */
-+    MCD_SET_VAR(taskTable+channel, 29, (u32)0xc0000000);    /* inc[5] */
-+    MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001);    /* inc[6] */
-+    MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
-+
-+
-+/*
-+ * Task 3
-+ */
-+
-+void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)srcAddr);    /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)destAddr);   /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)dmaSize);    /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)flags);  /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000001);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000004);    /* var[11] */
-+    MCD_SET_VAR(taskTable+channel, 12, (u32)0x08000000);    /* var[12] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
-+    MCD_SET_VAR(taskTable+channel, 28, (u32)0xc0000000);    /* inc[4] */
-+    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
-+    MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001);    /* inc[6] */
-+    MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
-+
-+
-+/*
-+ * Task 4
-+ */
-+
-+void  MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)rcvFifoPtr); /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x0000ffff); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x30000000);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 11, (u32)0x0fffffff);    /* var[11] */
-+    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000008);    /* var[12] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004);    /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000);    /* inc[3] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
-+
-+
-+/*
-+ * Task 5
-+ */
-+
-+void  MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel)
-+{
-+
-+    MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
-+    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
-+    MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr);   /* var[11] */
-+    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
-+    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
-+    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
-+    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
-+    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
-+    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
-+    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
-+    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
-+    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
-+    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
-+    MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff);    /* var[13] */
-+    MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff);    /* var[14] */
-+    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
-+    MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008);    /* var[16] */
-+    MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
-+    MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
-+    MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000);    /* inc[2] */
-+    MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc);    /* inc[3] */
-+    MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004);    /* inc[4] */
-+    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
-+    MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff);    /* inc[6] */
-+    MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001);    /* inc[7] */
-+
-+    /* Set the task's Enable bit in its Task Control Register */
-+    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
-+}
---- /dev/null
-+++ b/drivers/dma/MCD_tasksInit.h
-@@ -0,0 +1,64 @@
-+/*
-+ * drivers/dma/MCD_tasksInit.h
-+ *
-+ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
-+ *     Kurt Mahan <kmahan@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+#ifndef MCD_TSK_INIT_H
-+#define MCD_TSK_INIT_H 1
-+
-+/*
-+ * Autogenerated - Do not edit!
-+ */
-+
-+/*
-+ * Task 0
-+ */
-+void  MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
-+
-+
-+/*
-+ * Task 1
-+ */
-+void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
-+
-+
-+/*
-+ * Task 2
-+ */
-+void  MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
-+
-+
-+/*
-+ * Task 3
-+ */
-+void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
-+
-+
-+/*
-+ * Task 4
-+ */
-+void  MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel);
-+
-+
-+/*
-+ * Task 5
-+ */
-+void  MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel);
-+
-+#endif  /* MCD_TSK_INIT_H */
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-algo-mcf.h
-@@ -0,0 +1,23 @@
-+#ifndef I2C_ALGO_MCF_H
-+#define I2C_ALGO_MCF_H 1
-+
-+/* --- Defines for pcf-adapters ---------------------------------------       */
-+#include <linux/i2c.h>
-+
-+struct i2c_algo_mcf_data {
-+      void *data;             /* private data for lolevel routines    */
-+      void (*setmcf) (void *data, int ctl, int val);
-+      int (*getmcf) (void *data, int ctl);
-+      int (*getown) (void *data);
-+      int (*getclock) (void *data);
-+      void (*waitforpin) (void);
-+      /* local settings */
-+      int udelay;
-+      int mdelay;
-+      int timeout;
-+};
-+
-+int i2c_mcf_add_bus(struct i2c_adapter *);
-+int i2c_mcf_del_bus(struct i2c_adapter *);
-+
-+#endif /* I2C_ALGO_MCF_H */
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-mcf548x.c
-@@ -0,0 +1,595 @@
-+/*
-+ *    Performance and stability improvements: (C) Copyright 2008,
-+ *    Adrian Cox <adrian@humboldt.co.uk>
-+ *    ColdFire 547x/548x I2C master support
-+ *    Shrek Wu (b16972@freescale.com )moved the code driver/i2c/alg/mcf.c
-+ *      into driver/i2c/busses.And changed the driver to a platform driver.
-+ */
-+#include <linux/i2c.h>
-+#include "i2c-algo-mcf.h"
-+
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <asm/io.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/m5485sim.h>
-+#include <asm/m5485i2c.h>
-+
-+#define get_clock(adap) (clock)
-+#define get_own(adap)         (own)
-+
-+static int clock = 0x3b;  /*50000 / 1024 ~ 49 KHz*/
-+module_param(clock, int, 0);
-+MODULE_PARM_DESC(clock,
-+      "Set I2C clock in kHz: 400=fast mode (default == 49khz)");
-+
-+static int own = 0x78;
-+module_param(own, int, 0);
-+MODULE_PARM_DESC(clock, "Set I2C Master controller address(0x78)");
-+
-+static struct i2c_algo_mcf_data i2c_mcf_board_data = {
-+      .timeout =      10000,
-+};
-+
-+static struct i2c_adapter i2c_mcf_board_adapter = {
-+      .owner = THIS_MODULE,
-+      .name = "MCF5485 adapter",
-+      .id = I2C_HW_MPC107,
-+      .algo_data = &i2c_mcf_board_data,
-+      .class = I2C_CLASS_HWMON,
-+      .timeout = 100,
-+      .retries = 2
-+};
-+/*
-+ *  static void i2c_start()
-+ *
-+ *  Generates START signal
-+ */
-+static void
-+i2c_start(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      MCF_I2CR |= MCF_I2CR_MSTA;
-+}
-+
-+
-+/*
-+ *  static void i2c_stop()
-+ *
-+ *  Generates STOP signal
-+ */
-+static void
-+i2c_stop(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      MCF_I2CR &= ~MCF_I2CR_MSTA;
-+}
-+
-+static int
-+i2c_getack(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      return !(MCF_I2SR & MCF_I2SR_RXAK);
-+}
-+
-+/*
-+ *  static void i2c_repstart()
-+ *
-+ *  Generates repeated start signal (without STOP while mastering the bus)
-+ */
-+static void
-+i2c_repstart(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      MCF_I2CR |= MCF_I2CR_RSTA;
-+      MCF_I2CR |= MCF_I2CR_MTX;
-+}
-+
-+
-+/*
-+ *  static void wait_for_bb()
-+ *
-+ *  Wait for bus idle state
-+ */
-+static int
-+wait_for_bb(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      int i;
-+      for (i = 0; i < adap->timeout; i++) {
-+              if (!(MCF_I2SR & MCF_I2SR_IBB))
-+                      return 0;
-+              udelay(100);
-+      }
-+      printk(KERN_ERR "%s: timeout", __FUNCTION__);
-+      return -ETIMEDOUT;
-+}
-+
-+/*
-+ *  static void wait_for_not_bb()
-+ *
-+ *  Wait for bus busy state
-+ */
-+static int
-+wait_for_not_bb(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      int i;
-+      for (i = 0; i < adap->timeout; i++) {
-+              if (MCF_I2SR & MCF_I2SR_IBB)
-+                      return 0;
-+              udelay(100);
-+      }
-+      printk(KERN_ERR "%s: timeout", __FUNCTION__);
-+      return -ETIMEDOUT;
-+}
-+
-+/*
-+ *  static void wait_xfer_done()
-+ *
-+ *  Wait for transfer to complete
-+ */
-+static int
-+wait_xfer_done(
-+      struct i2c_algo_mcf_data *adap
-+) {
-+      int i;
-+
-+      for (i = 0; i < adap->timeout; i++) {
-+              if (MCF_I2SR & MCF_I2SR_IIF) {
-+                      MCF_I2SR &= ~MCF_I2SR_IIF;
-+                      return 0;
-+              }
-+              udelay(10);
-+      }
-+      printk(KERN_ERR "%s: timeout", __FUNCTION__);
-+      return -ETIMEDOUT;
-+}
-+
-+
-+/*
-+ *  static void i2c_set_addr()
-+ *
-+ *  Sets slave address to communicate
-+ */
-+static int
-+i2c_set_addr(
-+      struct i2c_algo_mcf_data *adap,
-+      struct i2c_msg *msg,
-+      int retries
-+) {
-+      unsigned short flags = msg->flags;
-+      unsigned char addr;
-+      MCF_I2CR |= MCF_I2CR_MTX;
-+      if ((flags & I2C_M_TEN)) {
-+              /* 10 bit address not supported yet */
-+              return -EIO;
-+      } else {
-+              /* normal 7bit address */
-+              addr = (msg->addr << 1);
-+              if (flags & I2C_M_RD)
-+                      addr |= 1;
-+              if (flags & I2C_M_REV_DIR_ADDR)
-+                      addr ^= 1;
-+
-+              MCF_I2DR = addr;
-+      }
-+      return 0;
-+}
-+
-+
-+/*
-+ *  static void mcf_i2c_init()
-+ *
-+ *  Perform ColdFire i2c initialization
-+ */
-+static void
-+mcf_i2c_init(struct i2c_algo_mcf_data *adap)
-+{
-+      u8 dummy;
-+      /* Setup GPIO lines */
-+      MCF_PAR_FECI2CIRQ |= MCF_PAR_SDA;
-+      MCF_PAR_FECI2CIRQ |= MCF_PAR_SCL;
-+
-+      /*  Ensure slaves are in idle state */
-+      if (MCF_I2SR & MCF_I2SR_IBB) {
-+              MCF_I2ICR = 0x00;
-+              MCF_I2CR  = 0x00;
-+              MCF_I2CR  = 0x0A;
-+              dummy = MCF_I2DR;
-+              MCF_I2SR  = 0x00;
-+              MCF_I2CR  = 0x00;
-+              MCF_I2ICR = 0x01;
-+      }
-+
-+      /* setup SCL clock */
-+      MCF_I2FDR = get_clock(adap);
-+
-+      /* set slave address */
-+      MCF_I2AR = get_own(adap);
-+
-+      /* enable I2C module */
-+      MCF_I2CR = MCF_I2CR_IEN;
-+}
-+
-+static int i2c_outb(
-+      struct i2c_adapter *i2c_adap,
-+      char c
-+) {
-+
-+      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
-+      int timeout;
-+      /* Put data to be sent */
-+      MCF_I2DR = c;
-+      /* Wait for xfer completed*/
-+      timeout = wait_xfer_done(adap);
-+      if (timeout) {
-+              i2c_stop(adap);
-+              wait_for_bb(adap);
-+              printk(KERN_ERR "i2c-algo-mcf: %s i2c_write: "
-+                      "error - timeout.\n", i2c_adap->name);
-+              return -EREMOTEIO; /* got a better one ?? */
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/*
-+ *  static void mcf_sendbytes()
-+ *
-+ *  Perform tx data transfer
-+ */
-+static int
-+mcf_sendbytes(
-+      struct i2c_adapter *i2c_adap,
-+      const char *buf,
-+      int count, int last
-+) {
-+      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
-+      int ret, i;
-+
-+      /* Set master TX mode */
-+      MCF_I2CR |= MCF_I2CR_MTX;
-+
-+      for (i = 0; i < count; ++i) {
-+              printk(KERN_DEBUG "i2c-algo-mcf: %s i2c_write: writing %2.2X\n",
-+                    i2c_adap->name, buf[i]&0xff);
-+              ret = i2c_outb(i2c_adap, buf[i]);
-+              if (ret < 0)
-+                      return ret;
-+      }
-+      if (last) {
-+              i2c_stop(adap);
-+              wait_for_bb(adap);
-+      } else {
-+      /*      i2c_repstart(adap);*/
-+      }
-+
-+      return (i);
-+}
-+
-+
-+/*
-+ *  static void mcf_readbytes()
-+ *
-+ *  Perform rx data transfer
-+ */
-+static int
-+mcf_readbytes(
-+      struct i2c_adapter *i2c_adap,
-+      char *buf,
-+      int count, int last
-+) {
-+      int i;
-+      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
-+      u8 dummy;
-+
-+      /* Set master RX mode */
-+      MCF_I2CR &= ~MCF_I2CR_MTX;
-+      MCF_I2CR &= ~MCF_I2CR_TXAK;
-+      dummy = MCF_I2DR;
-+
-+      for (i = 0; i < count-1; i++) {
-+              if (wait_xfer_done(adap)) {
-+                      i2c_stop(adap);
-+                      wait_for_bb(adap);
-+                      printk(KERN_DEBUG
-+                          "i2c-algo-mcf: mcf_readbytes timed out.\n");
-+                      return (-1);
-+              }
-+
-+              /* store next data byte */
-+              buf[i] = MCF_I2DR;
-+      }
-+
-+      if (wait_xfer_done(adap)) {
-+              i2c_stop(adap);
-+              wait_for_bb(adap);
-+              printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n");
-+              return (-1);
-+      }
-+
-+      /* Disable acknowlege (set I2CR.TXAK) */
-+      MCF_I2CR |= MCF_I2CR_TXAK;
-+      buf[i] = MCF_I2DR;
-+      if (wait_xfer_done(adap)) {
-+              i2c_stop(adap);
-+              wait_for_bb(adap);
-+              printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n");
-+              return (-1);
-+      }
-+
-+      if (last) {
-+              i2c_stop(adap);
-+              wait_for_bb(adap);
-+      } else {
-+      /*      i2c_repstart(adap);*/
-+      }
-+
-+      return (i+1);
-+}
-+
-+
-+/*
-+ *  static void mcf_xfer()
-+ *
-+ *  Perform master data I/O transfer
-+ */
-+static int
-+mcf_xfer(
-+      struct i2c_adapter *i2c_adap,
-+      struct i2c_msg *msgs,
-+      int num
-+) {
-+      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
-+      struct i2c_msg *pmsg;
-+      int i;
-+      int ret = 0, timeout;
-+
-+      /* Skip own address */
-+      if (get_own(adap) == (msgs[0].addr << 1))
-+              return -EIO;
-+
-+      /*  Ensure slaves are in idle state */
-+      if (MCF_I2SR & MCF_I2SR_IBB) {
-+              MCF_I2ICR = 0x00;
-+              MCF_I2CR  = 0x00;
-+              MCF_I2CR  = 0x0A;
-+              timeout = MCF_I2DR;
-+              MCF_I2SR  = 0x00;
-+              MCF_I2CR  = 0x00;
-+              MCF_I2ICR = 0x01;
-+      }
-+      /* setup SCL clock */
-+      MCF_I2FDR = get_clock(adap);
-+      /* set slave address */
-+      MCF_I2AR = get_own(adap);
-+      /* enable I2C module */
-+      MCF_I2CR = MCF_I2CR_IEN;
-+
-+      MCF_I2CR |= MCF_I2CR_TXAK;
-+
-+      /* Check for bus busy */
-+      wait_for_bb(adap);
-+
-+      for (i = 0; ret >= 0 && i < num; i++) {
-+              if (MCF_I2SR & MCF_I2SR_IBB) {
-+                      MCF_I2ICR = 0x00;
-+                      MCF_I2CR  = 0x00;
-+                      MCF_I2CR  = 0x0A;
-+                      timeout = MCF_I2DR;
-+                      MCF_I2SR  = 0x00;
-+                      MCF_I2CR  = 0x00;
-+                      MCF_I2ICR = 0x01;
-+              }
-+              /* setup SCL clock */
-+              MCF_I2FDR = get_clock(adap);
-+              /* set slave address */
-+              MCF_I2AR = get_own(adap);
-+              /* enable I2C module */
-+              MCF_I2CR = MCF_I2CR_IEN;
-+
-+              MCF_I2CR |= MCF_I2CR_TXAK;
-+
-+              /* Check for bus busy */
-+              wait_for_bb(adap);
-+
-+              pmsg = &msgs[i];
-+
-+              printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes "
-+                      "to 0x%02x - %d of %d messages\n",
-+                      pmsg->flags & I2C_M_RD ? "read" : "write",
-+                      pmsg->len, pmsg->addr, i + 1, num);
-+
-+              /* Send START */
-+              /*if (i == 0)*/
-+                      i2c_start(adap);
-+
-+              /* Wait for Bus Busy */
-+              wait_for_not_bb(adap);
-+
-+              MCF_I2CR |= MCF_I2CR_MTX;
-+
-+              ret = i2c_set_addr(adap, pmsg, i2c_adap->retries);
-+              if (ret < 0)
-+                      return ret;
-+
-+              /* Wait for address transfer completion */
-+              wait_xfer_done(adap);
-+
-+              /* Check for ACK */
-+              if (!i2c_getack(adap)) {
-+                      i2c_stop(adap);
-+                      wait_for_bb(adap);
-+                      printk(KERN_DEBUG "i2c-algo-mcf: No ack after "
-+                                  "send address in mcf_xfer\n");
-+                      return (-EREMOTEIO);
-+              }
-+
-+              printk(KERN_DEBUG "i2c-algo-mcf: Msg %d, "
-+                                "addr = 0x%x, flags = 0x%x, len = %d\n",
-+                              i, msgs[i].addr, msgs[i].flags, msgs[i].len);
-+              /* Read */
-+              if (pmsg->flags & I2C_M_RD) {
-+                      /* read bytes into buffer*/
-+                      ret = mcf_readbytes(i2c_adap, pmsg->buf, pmsg->len,
-+                                              (i + 1 == num));
-+
-+                      if (ret != pmsg->len) {
-+                              printk(KERN_DEBUG "i2c-algo-mcf: fail: "
-+                                          "only read %d bytes.\n", ret);
-+                      } else {
-+                              printk(KERN_DEBUG "i2c-algo-mcf: "
-+                                                "read %d bytes.\n", ret);
-+                      }
-+              } else {
-+                      /* write bytes into buffer*/
-+                      ret = mcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len,
-+                                              (i + 1 == num));
-+                      if (ret != pmsg->len) {
-+                              printk(KERN_DEBUG "i2c-algo-mcf: fail: "
-+                                          "only wrote %d bytes.\n", ret);
-+                      } else {
-+                              printk(KERN_DEBUG "i2c-algo-mcf: wrote"
-+                                      "%d bytes.\n", ret);
-+                      }
-+              }
-+      MCF_I2CR = 0;
-+      }
-+
-+      /* Disable I2C module */
-+      MCF_I2CR = 0;
-+      return (i);
-+}
-+
-+
-+/*
-+ *  static void mcf_func()
-+ *
-+ *  Return algorithm funtionality
-+ */
-+static u32
-+mcf_func(
-+      struct i2c_adapter *i2c_adap
-+) {
-+      return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
-+}
-+
-+/*
-+ *  ColdFire bus algorithm callbacks
-+ */
-+static struct i2c_algorithm mcf_algo = {
-+      .master_xfer    = mcf_xfer,
-+      .functionality  = mcf_func,
-+};
-+
-+/***********************************************************/
-+struct coldfire_i2c {
-+      void __iomem *base;
-+      struct resource *irqarea;
-+      struct resource *ioarea;
-+      u32 irq;
-+      struct i2c_adapter *adap;
-+      u32 flags;
-+};
-+
-+/*
-+ *  registering functions to load algorithms at runtime
-+ */
-+int i2c_mcf_add_bus(struct i2c_adapter *adap)
-+{
-+      struct i2c_algo_mcf_data *mcf_adap = adap->algo_data;
-+
-+      /*adap->id |= mcf_algo.id;*/
-+      adap->algo = &mcf_algo;
-+      adap->timeout = 100;
-+
-+      mcf_i2c_init(mcf_adap);
-+
-+#ifdef MODULE
-+      MOD_INC_USE_COUNT;
-+#endif
-+
-+      i2c_add_adapter(adap);
-+
-+      return 0;
-+}
-+
-+static int mcf548x_i2c_probe(struct platform_device *pdev)
-+{
-+      struct coldfire_i2c *i2c;
-+      int rc = 0;
-+
-+      /************************************************************/
-+      i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
-+      if (!i2c) {
-+              printk(KERN_ERR "%s kzalloc coldfire_i2c faile\n",
-+                              __FUNCTION__);
-+              return -ENOMEM;
-+      }
-+      /****************************************************************/
-+      platform_set_drvdata(pdev, i2c);
-+
-+      i2c->adap = &i2c_mcf_board_adapter;
-+      i2c->adap->dev.parent = &pdev->dev;
-+      rc = i2c_mcf_add_bus(i2c->adap);
-+      if (rc < 0) {
-+              printk(KERN_ERR "%s - failed to add adapter\n", __FUNCTION__);
-+              rc = -ENODEV;
-+              goto fail_add;
-+      }
-+
-+      printk(KERN_INFO "i2c-algo-mcf.o: I2C ColdFire algorithm"
-+                      " module is loaded.\n");
-+      return rc;
-+
-+fail_add:
-+      kfree(i2c);
-+      return rc;
-+};
-+
-+static int mcf548x_i2c_remove(struct platform_device *pdev)
-+{
-+      struct coldfire_i2c *i2c = platform_get_drvdata(pdev);
-+
-+      i2c_del_adapter(i2c->adap);
-+      platform_set_drvdata(pdev, NULL);
-+      iounmap(i2c->base);
-+      kfree(i2c);
-+      return 0;
-+};
-+
-+/* Structure for a device driver */
-+static struct platform_driver mcf548x_i2c_driver = {
-+      .probe  = mcf548x_i2c_probe,
-+      .remove = mcf548x_i2c_remove,
-+      .driver = {
-+              .owner = THIS_MODULE,
-+              .name = "MCF548X-i2c",
-+      },
-+};
-+
-+static int __init coldfire_i2c_init(void)
-+{
-+      return platform_driver_register(&mcf548x_i2c_driver);
-+}
-+
-+static void __exit coldfire_i2c_exit(void)
-+{
-+      platform_driver_unregister(&mcf548x_i2c_driver);
-+}
-+
-+module_init(coldfire_i2c_init);
-+module_exit(coldfire_i2c_exit);
-+
-+MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
-+MODULE_DESCRIPTION
-+    ("I2C-Bus adapter for MCF547x and MCF548x processors");
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-mcf.c
-@@ -0,0 +1,573 @@
-+/*
-+    i2c-mcf.c - Part of lm_sensors, Linux kernel modules for hardware monitoring
-+
-+    Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca>
-+                                      <http://www3.sympatico.ca/derek.cheung>
-+
-+    Copyright (c) 2006-2007, emlix
-+                      Sebastian Hess <sh@emlix.com>
-+
-+    Copyright (c) 2006-2007 Freescale Semiconductor, Inc
-+                      Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com>
-+                      Matt Waddel <Matt.Waddel@freescale.com>
-+
-+    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.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+
-+    Changes:
-+    v0.1      26 March 2005
-+              Initial Release - developed on uClinux with 2.6.9 kernel
-+
-+    v0.2      29 May 2006
-+              Modified to be more generic and added support for
-+              i2c_master_xfer
-+
-+    This I2C adaptor supports the ColdFire CPU I2C module. Since most Coldfire
-+    CPUs' I2C module use the same register set (e.g., MCF5249), the code is very
-+    portable and re-usable to other Coldfire CPUs.
-+
-+    The transmission frequency is set at about 100KHz for the CPU board with
-+    8MHz crystal. If the CPU board uses different system clock frequency, you 
-+    should change the following line:
-+                static int __init i2c_coldfire_init(void)
-+                {
-+                                .........
-+                        // Set transmission frequency 0x15 = ~100kHz
-+                        *MCF_I2C_I2FDR = 0x15;
-+                                ........
-+                }
-+
-+    Remember to perform a dummy read to set the ColdFire CPU's I2C module for 
-+    read before reading the actual byte from a device
-+
-+    The I2C_SM_BUS_BLOCK_DATA function are not yet ready but most lm_senors 
-+    do not care
-+*/
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/i2c.h>
-+#include <linux/delay.h>
-+#include <linux/string.h>
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+#include <asm/types.h>
-+#include <linux/platform_device.h>
-+#include "i2c-mcf.h"
-+
-+
-+static struct i2c_algorithm coldfire_algorithm = {
-+      /*.name         = "ColdFire I2C algorithm",
-+      .id             = I2C_ALGO_SMBUS,*/
-+      .smbus_xfer     = coldfire_i2c_access,
-+      .master_xfer    = coldfire_i2c_master,
-+      .functionality  = coldfire_func,
-+};
-+
-+
-+static struct i2c_adapter coldfire_adapter = {
-+      .owner          = THIS_MODULE,
-+      .class          = I2C_CLASS_HWMON,
-+      .algo           = &coldfire_algorithm,
-+      .name           = "ColdFire I2C adapter",
-+};
-+
-+
-+__u16 lastaddr;
-+__u16 lastop;
-+
-+static inline int coldfire_do_first_start(__u16 addr,__u16 flags)
-+{
-+      int err;
-+      /*
-+       * Generate a stop and put the I2C module into slave mode
-+       */
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
-+
-+      /*
-+       * Generate a new Start signal
-+       */
-+      err = coldfire_i2c_start(flags & I2C_M_RD ? I2C_SMBUS_READ : I2C_SMBUS_WRITE,
-+                              addr, FIRST_START);
-+      if(err) return err;
-+
-+      lastaddr = addr;
-+      lastop = flags & I2C_M_RD;      /* Ensure everything for new start */
-+      return 0;
-+}
-+
-+
-+/*
-+ *  read one byte data from the I2C bus
-+ */
-+static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType) {
-+
-+      int timeout;
-+
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MTX;             /* master receive mode*/
-+
-+      if (ackType == NACK)
-+              *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK;     /* generate NA */
-+      else
-+              *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;    /* generate ACK */
-+
-+
-+      /* read data from the I2C bus */
-+      *rxData = *MCF_I2C_I2DR;
-+
-+      /* printk(">>> %s I2DR data is %.2x \n", __FUNCTION__, *rxData); */
-+
-+      /* wait for data transfer to complete */
-+      timeout = 500;
-+      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
-+              udelay(1);
-+      if (timeout <= 0)
-+              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__,
-+                      timeout);
-+
-+
-+      /* reset the interrupt bit */
-+      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
-+
-+      if (timeout <= 0 )
-+              return -1;
-+      else
-+              return 0;
-+
-+};
-+
-+
-+/*
-+ *  write one byte data onto the I2C bus
-+ */
-+static int coldfire_write_data(const u8 txData) {
-+
-+      int timeout;
-+
-+      timeout = 500;
-+
-+      *MCF_I2C_I2CR |= MCF_I2C_I2CR_MTX;      /* I2C module into TX mode */
-+      *MCF_I2C_I2DR = txData;                 /* send the data */
-+
-+      /* wait for data transfer to complete */
-+      /* rely on the interrupt handling bit */
-+      timeout = 500;
-+      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
-+              udelay(1);
-+      if (timeout <=0)
-+              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__,
-+                      timeout);
-+
-+
-+      /* reset the interrupt bit */
-+      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
-+
-+      if (timeout <= 0 )
-+              return -1;
-+      else
-+              return 0;
-+
-+};
-+
-+
-+
-+
-+/*
-+ *  Generate I2C start or repeat start signal
-+ *  Combine the 7 bit target_address and the R/W bit and put it onto the I2C bus
-+ */
-+static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE start_type) {
-+
-+      int timeout;
-+
-+      /* printk(">>> %s START TYPE %s \n", __FUNCTION__, 
-+                 start_type == FIRST_START ? "FIRST_START":"REPEAT_START");*/
-+
-+      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN;
-+
-+      if (start_type == FIRST_START) {
-+              /* Make sure the I2C bus is idle */
-+              timeout = 500;          /* 500us timeout */
-+              while (timeout-- && (*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB))
-+                      udelay(1);
-+              if (timeout <= 0) {
-+                      printk("%s - I2C bus always busy in the past 500us timeout is %d \n", __FUNCTION__, timeout);
-+                      goto check_rc;
-+              }
-+              /* generate a START and put the I2C module into MASTER TX mode*/
-+              *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX);
-+
-+              /* wait for bus busy to be set */
-+              timeout = 500;
-+              while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB))
-+                      udelay(1);
-+              if (timeout <= 0) {
-+                      printk("%s - I2C bus is never busy after START. Timeout is %d \n", __FUNCTION__, timeout);
-+                      goto check_rc;
-+              }
-+
-+      } else {
-+              /* this is repeat START */
-+              udelay(500);    /* need some delay before repeat start */
-+              *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_RSTA);
-+      }
-+
-+
-+      /* combine the R/W bit and the 7 bit target address and put it onto 
-+         the I2C bus */
-+      *MCF_I2C_I2DR = ((target_address & 0x7F) << 1) | (read_write == I2C_SMBUS_WRITE ? 0x00 : 0x01);
-+
-+      /* wait for bus transfer to complete */
-+      /* when one byte transfer is completed, IIF set at the faling edge of 
-+         the 9th clock */
-+      timeout = 500;
-+      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
-+              udelay(1);
-+      if (timeout <= 0)
-+              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, timeout);
-+
-+
-+check_rc:
-+      /* reset the interrupt bit */
-+      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
-+
-+      if (timeout <= 0)
-+              return -1;
-+      else
-+              return 0;
-+};
-+
-+
-+/*
-+ *  5282 SMBUS supporting functions
-+ */
-+
-+static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 addr,
-+                            unsigned short flags, char read_write,
-+                            u8 command, int size, union i2c_smbus_data *data)
-+{
-+      int rc = 0;
-+      u8 rxData, tempRxData[2];
-+
-+      switch (size) {
-+              case I2C_SMBUS_QUICK:
-+                      rc = coldfire_i2c_start(read_write, addr, FIRST_START);         /* generate START */
-+                        break;
-+              case I2C_SMBUS_BYTE:
-+                      rc = coldfire_i2c_start(read_write, addr, FIRST_START);
-+                      *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK;     /*generate NA */
-+                      if (read_write == I2C_SMBUS_WRITE)
-+                              rc += coldfire_write_data(command);
-+                      else {
-+                              coldfire_read_data(&rxData, NACK);/*dummy read*/
-+                              rc += coldfire_read_data(&rxData, NACK);
-+                              data->byte = rxData;
-+                      }
-+                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset ACK bit */
-+                      break;
-+              case I2C_SMBUS_BYTE_DATA:
-+                      rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, FIRST_START);
-+                      rc += coldfire_write_data(command);
-+                      if (read_write == I2C_SMBUS_WRITE)
-+                              rc += coldfire_write_data(data->byte);
-+                      else {
-+                              /* This is SMBus READ Byte Data Request. 
-+                                 Perform REPEAT START */
-+                              rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, 
-+                                                       REPEAT_START);
-+                              coldfire_read_data(&rxData, ACK);/* dummy read*/
-+                              /* Disable Acknowledge, generate STOP after 
-+                                 next byte transfer */
-+                              rc += coldfire_read_data(&rxData, NACK);
-+                              data->byte = rxData;
-+                      }
-+                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;/* reset to normal ACk */
-+                      break;
-+              case I2C_SMBUS_PROC_CALL:
-+              case I2C_SMBUS_WORD_DATA:
-+                      dev_info(&adap->dev, "size = I2C_SMBUS_WORD_DATA \n");
-+                      rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, 
-+                                              FIRST_START);
-+                      rc += coldfire_write_data(command);
-+                      if (read_write == I2C_SMBUS_WRITE) {
-+                              rc += coldfire_write_data(data->word & 0x00FF);
-+                              rc += coldfire_write_data((data->word & 0x00FF) >> 8);
-+                      } else {
-+                              /* This is SMBUS READ WORD request. 
-+                                 Peform REPEAT START */
-+                              rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, 
-+                                                       REPEAT_START);
-+                              coldfire_read_data(&rxData, ACK);/* dummy read*/
-+                              /* Disable Acknowledge, generate STOP after 
-+                                 next byte transfer */
-+                              /* read the MS byte from the device */
-+                              rc += coldfire_read_data(&rxData, NACK);
-+                              tempRxData[1] = rxData;
-+                              /* read the LS byte from the device */
-+                              rc += coldfire_read_data(&rxData, NACK);
-+                              tempRxData[0] = rxData;
-+                              /* the host driver expect little endian 
-+                                 convention. Swap the byte */
-+                              data->word = (tempRxData[0] << 8)|tempRxData[1];
-+                      }
-+                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;
-+                      break;
-+              case I2C_SMBUS_BLOCK_DATA:
-+                      /* Not done yet */
-+                      break;
-+              default:
-+                      printk("Unsupported I2C size \n");
-+                      rc = -1;
-+                      break;
-+      };
-+
-+      /* Generate a STOP and put I2C module into slave mode */
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
-+
-+      /* restore interrupt */
-+      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN;
-+
-+      if (rc < 0)
-+              return -1;
-+      else
-+              return 0;
-+};
-+
-+
-+/*
-+ *  List the SMBUS functions supported by this I2C adaptor
-+ *  Also tell the I2C Subsystem that we are able of master_xfer()
-+ */
-+static u32 coldfire_func(struct i2c_adapter *adapter)
-+{
-+      return(I2C_FUNC_SMBUS_QUICK |
-+             I2C_FUNC_SMBUS_BYTE |
-+             I2C_FUNC_SMBUS_PROC_CALL |
-+             I2C_FUNC_SMBUS_BYTE_DATA |
-+             I2C_FUNC_SMBUS_WORD_DATA |
-+             I2C_FUNC_I2C |
-+             I2C_FUNC_SMBUS_BLOCK_DATA);
-+};
-+
-+static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs,
-+                             int num)
-+{
-+      u8 dummyRead;
-+      struct i2c_msg *p;
-+      int i, err = 0;
-+      int ic=0;
-+
-+      lastaddr = 0;
-+      lastop = 8;
-+
-+      /* disable the IRQ, we are doing polling */
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_IIEN;
-+
-+      dev_dbg(&adap->dev,"Num of actions: %d\n", num);
-+
-+      for (i = 0; !err && i < num; i++) {
-+              p = &msgs[i];
-+
-+
-+              if (!p->len)
-+              {
-+                      dev_dbg(&adap->dev,"p->len == 0!\n");
-+                      continue;
-+              }
-+              /*
-+               * Generate a new Start, if the target address differs from 
-+               * the last target, generate a stop in this case first
-+               */
-+              if(p->addr != lastaddr)
-+              {
-+                      err = coldfire_do_first_start(p->addr,p->flags);
-+                      if(err)
-+                      {
-+                              dev_dbg(&adap->dev,"First Init failed!\n");
-+                              break;
-+                      }
-+              }
-+
-+              else if((p->flags & I2C_M_RD)  != lastop)
-+              {
-+                      /*
-+                       * If the Operational Mode changed, we need to do this 
-+                       * here ...
-+                       */
-+                      dev_dbg(&adap->dev,"%s(): Direction changed, was: %d; is now: %d\n", __FUNCTION__, lastop, p->flags & I2C_M_RD);
-+
-+                      /* Last op was an read, now it's write: complete stop 
-+                         and reinit */
-+                      if (lastop & I2C_M_RD)
-+                      {
-+                              dev_dbg(&adap->dev,"%s(): The device is in read state, we must reset!\n", __FUNCTION__);
-+                              if((err = coldfire_do_first_start(p->addr,p->flags)))
-+                                      break;
-+                      }
-+                      else
-+                      {
-+                              dev_dbg(&adap->dev,"%s(): We switchted to read mode\n",__FUNCTION__);
-+                              if((err = coldfire_i2c_start((p->flags & I2C_M_RD) ? I2C_SMBUS_READ : I2C_SMBUS_WRITE,
-+                                        p->addr, REPEAT_START)))
-+                                      break;
-+                      }
-+
-+                      lastop = p->flags & I2C_M_RD;   /* Save the last op */
-+              }
-+
-+              if (p->flags & I2C_M_RD)
-+              {
-+                      /*
-+                       * When ever we get here, a new session was activated, 
-+                       * so read a dummy byte
-+                       */
-+                      coldfire_read_data(&dummyRead, ACK);
-+                      /*
-+                       * read p->len -1 bytes with ACK to the slave,
-+                       * read the last byte without the ACK, to inform him 
-+                       * about the stop afterwards
-+                       */
-+                      ic = 0;
-+                      while(!err && (ic < p->len-1 ))
-+                      {
-+                              err = coldfire_read_data(p->buf+ic, ACK );
-+                              ic++;
-+                      }
-+                      if(!err)
-+                              err = coldfire_read_data(p->buf+ic, NACK);
-+                      dev_dbg(&coldfire_adapter.dev,"read: %2x\n",p->buf[ic]);
-+              }
-+              else
-+              {
-+                      if(p->len == 2)
-+                              dev_dbg(&coldfire_adapter.dev,"writing: 0x %2x %2x\n", p->buf[0], p->buf[1]);
-+
-+                      /*
-+                       * Write data to the slave
-+                       */
-+                      for(ic=0; !err && ic < p->len; ic++)
-+                      {
-+                              err = coldfire_write_data(p->buf[ic]);
-+                              if(err)
-+                              {
-+                                      dev_dbg(&coldfire_adapter.dev, "Failed to write data\n");
-+                              }
-+                      }
-+              }
-+      }
-+
-+      /*
-+       * Put the device into slave mode to enable the STOP Generation 
-+       * (the RTC needs this)
-+       */
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
-+
-+      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;    /* reset the ACK bit */
-+
-+      /* restore interrupt */
-+      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN;
-+
-+      /* Return the number of messages processed, or the error code. */
-+      if (err == 0)
-+              err = num;
-+      return err;
-+}
-+
-+
-+/*
-+ *  Initalize the 5282 I2C module
-+ *  Disable the 5282 I2C interrupt capability. Just use callback
-+ */
-+
-+static int __init i2c_coldfire_init(void)
-+{
-+      int retval;
-+      u8  dummyRead;
-+
-+#if defined(CONFIG_M532x) || defined(CONFIG_M5445X)
-+      /*
-+       * Initialize the GPIOs for I2C
-+       */
-+      MCF_GPIO_PAR_FECI2C |= (0
-+                          | MCF_GPIO_PAR_FECI2C_PAR_SDA(3)
-+                          | MCF_GPIO_PAR_FECI2C_PAR_SCL(3));
-+#elif defined(CONFIG_M5253)
-+      {
-+      volatile u32 *reg;
-+      /* GPIO Bit 41 = SCL0, Bit 42 = SDA0 */
-+      reg = (volatile u32 *)(MCF_MBAR2 + MCFSIM2_GPIO1FUNC);
-+      *reg &= 0xFFFFF9FF;
-+      }
-+#else
-+      /* Initialize PASP0 and PASP1 to I2C functions, 5282 user guide 26-19 */
-+      /* Port AS Pin Assignment Register (PASPAR)             */
-+      /*              PASPA1 = 11 = AS1 pin is I2C SDA        */
-+      /*              PASPA0 = 11 = AS0 pin is I2C SCL        */
-+      *MCF_GPIO_PASPAR |= 0x000F;             /* u16 declaration */
-+#endif
-+
-+
-+      /* Set transmission frequency 0x15 = ~100kHz */
-+      *MCF_I2C_I2FDR = 0x15;
-+
-+      /* set the 5282 I2C slave address though we never use it */
-+      *MCF_I2C_I2ADR = 0x6A;
-+
-+      /* Enable I2C module and if IBB is set, do the special initialzation */
-+      /* procedures as are documented at the 5282 User Guide page 24-11 */
-+      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN;
-+      if ((*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB) == 1) {
-+              printk("%s - do special 5282 I2C init procedures \n", 
-+                      __FUNCTION__);
-+              *MCF_I2C_I2CR = 0x00;
-+              *MCF_I2C_I2CR = 0xA0;
-+              dummyRead = *MCF_I2C_I2DR;
-+              *MCF_I2C_I2SR = 0x00;
-+              *MCF_I2C_I2CR = 0x00;
-+      }
-+
-+      /* default I2C mode is - slave and receive */
-+      *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX);
-+
-+      coldfire_adapter.dev.parent = &platform_bus;
-+      retval = i2c_add_adapter(&coldfire_adapter);
-+
-+      if (retval < 0)
-+              printk("%s - return code is: %d \n", __FUNCTION__, retval);
-+
-+      return retval;
-+};
-+
-+
-+/*
-+ *  I2C module exit function
-+ */
-+
-+static void __exit i2c_coldfire_exit(void)
-+{
-+      /* disable I2C and Interrupt */
-+      *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_IEN | MCF_I2C_I2CR_IIEN);
-+      i2c_del_adapter(&coldfire_adapter);
-+
-+};
-+
-+
-+MODULE_AUTHOR("Derek CL Cheung <derek.cheung@sympatico.ca>");
-+MODULE_DESCRIPTION("MCF5282 I2C adaptor");
-+MODULE_LICENSE("GPL");
-+
-+module_init(i2c_coldfire_init);
-+module_exit(i2c_coldfire_exit);
---- /dev/null
-+++ b/drivers/i2c/busses/i2c-mcf.h
-@@ -0,0 +1,75 @@
-+/*
-+    i2c-mcf.h - header file for i2c-mcf.c
-+
-+    Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca>
-+                                        <http://www3.sympatico.ca/derek.cheung>
-+
-+    Copyright (c) 2006-2007, emlix
-+                      Sebastian Hess <sh@emlix.com>
-+
-+    Copyright (c) 2006-2007 Freescale Semiconductor, Inc
-+                      Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com>
-+                      Matt Waddel <Matt.Waddel@freescale.com>
-+
-+    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.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+
-+    Changes:
-+    v0.1      26 March 2005
-+              Initial Release - developed on uClinux with 2.6.9 kernel
-+    v0.2      29 May 2006
-+              Modified to be more generic and added support for
-+              i2c_master_xfer
-+*/
-+
-+
-+#ifndef __I2C_MCF_H__
-+#define __I2C_MCF_H__
-+
-+enum I2C_START_TYPE { FIRST_START, REPEAT_START };
-+enum I2C_ACK_TYPE { ACK, NACK};
-+
-+/* Function prototypes */
-+static u32 coldfire_func(struct i2c_adapter *adapter);
-+static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 address,
-+                              unsigned short flags, char read_write,
-+                              u8 command, int size, union i2c_smbus_data *data);
-+static int coldfire_write_data(const u8 data);
-+static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE i2c_start);
-+static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType);
-+static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, int num);
-+void dumpReg(char *, u16 addr, u8 data);
-+
-+#define MCF_I2C_I2ADR_ADDR(x) (((x)&0x7F)<<0x01)
-+#define MCF_I2C_I2FDR_IC(x)   (((x)&0x3F))
-+
-+/* I2C Control Register */
-+#define MCF_I2C_I2CR_IEN      (0x80)  /* I2C enable */
-+#define MCF_I2C_I2CR_IIEN     (0x40)  /* interrupt enable */
-+#define MCF_I2C_I2CR_MSTA     (0x20)  /* master/slave mode */
-+#define MCF_I2C_I2CR_MTX      (0x10)  /* transmit/receive mode */
-+#define MCF_I2C_I2CR_TXAK     (0x08)  /* transmit acknowledge enable */
-+#define MCF_I2C_I2CR_RSTA     (0x04)  /* repeat start */
-+
-+/* I2C Status Register */
-+#define MCF_I2C_I2SR_ICF      (0x80)  /* data transfer bit */
-+#define MCF_I2C_I2SR_IAAS     (0x40)  /* I2C addressed as a slave */
-+#define MCF_I2C_I2SR_IBB      (0x20)  /* I2C bus busy */
-+#define MCF_I2C_I2SR_IAL      (0x10)  /* aribitration lost */
-+#define MCF_I2C_I2SR_SRW      (0x04)  /* slave read/write */
-+#define MCF_I2C_I2SR_IIF      (0x02)  /* I2C interrupt */
-+#define MCF_I2C_I2SR_RXAK     (0x01)  /* received acknowledge */
-+
-+/********************************************************************/
-+#endif /*  __I2C_MCF_H__ */
---- a/drivers/i2c/busses/Kconfig
-+++ b/drivers/i2c/busses/Kconfig
-@@ -4,6 +4,18 @@
- menu "I2C Hardware Bus support"
-+config I2C_MCF548x
-+      tristate "I2C MCF547x/548x interfaces"
-+      depends on I2C
-+      help
-+        This allows you to use the I2C adapters found on the Freescale
-+        MCF547x/548x microcontrollers.
-+        Say Y if you own an I2C adapter belonging to this class and then say
-+        Y to the specific driver for you adapter below.
-+
-+        This support is also available as a module.  If so, the module
-+        will be called i2c-algo-mcf.
-+
- config I2C_ALI1535
-       tristate "ALI 1535"
-       depends on PCI
-@@ -290,6 +302,16 @@ config I2C_POWERMAC
-         This support is also available as a module.  If so, the module
-         will be called i2c-powermac.
-+config I2C_MCF
-+      tristate "MCF ColdFire"
-+      depends on I2C && EXPERIMENTAL
-+      help
-+        If you say yes to this option, support will be included for the
-+        I2C on most ColdFire CPUs
-+
-+        This driver can also be built as a module.  If so, the module
-+        will be called i2c-mcf.
-+ 
- config I2C_MPC
-       tristate "MPC107/824x/85xx/52xx/86xx"
-       depends on PPC32
---- a/drivers/i2c/busses/Makefile
-+++ b/drivers/i2c/busses/Makefile
-@@ -52,6 +52,8 @@ obj-$(CONFIG_I2C_VIAPRO)     += i2c-viapro.o
- obj-$(CONFIG_I2C_VOODOO3)     += i2c-voodoo3.o
- obj-$(CONFIG_SCx200_ACB)      += scx200_acb.o
- obj-$(CONFIG_SCx200_I2C)      += scx200_i2c.o
-+obj-$(CONFIG_I2C_MCF548x)       += i2c-mcf548x.o
-+obj-$(CONFIG_I2C_MCF)         += i2c-mcf.o
- ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
- EXTRA_CFLAGS += -DDEBUG
---- a/drivers/macintosh/Kconfig
-+++ b/drivers/macintosh/Kconfig
-@@ -118,7 +118,6 @@ config PMAC_SMU
- config PMAC_APM_EMU
-       tristate "APM emulation"
--      select APM_EMULATION
-       depends on ADB_PMU && PM && PPC32
- config PMAC_MEDIABAY
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -93,3 +93,5 @@ obj-$(CONFIG_PPC_PS3)                += ps3/
- obj-$(CONFIG_OF)              += of/
- obj-$(CONFIG_SSB)             += ssb/
- obj-$(CONFIG_VIRTIO)          += virtio/
-+
-+obj-$(CONFIG_MCD_DMA)         += dma/
---- /dev/null
-+++ b/drivers/net/can/flexcan/flexcan.c
-@@ -0,0 +1,378 @@
-+/*
-+ * flexcan.c
-+ *
-+ * DESCRIPTION:
-+ *  CAN bus driver for the alone generic (as possible as) FLEXCAN controller.
-+ *
-+ * AUTHOR:
-+ *  Andrey Volkov <avolkov@varma-el.com>
-+ *
-+ * COPYRIGHT:
-+ *  2005-2006, Varma Electronics Oy
-+ *
-+ * LICENCE:
-+ *  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.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ *  HISTORY:
-+ *    2008-06-23 Support for MCF548x's FlexCAN
-+ *                    Huan, Wang <b18965@freescale.com>
-+ */
-+
-+
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/delay.h>
-+#include <linux/netdevice.h>
-+#include <linux/if_arp.h>
-+#include <linux/if_ether.h>
-+#include <linux/can.h>
-+#include <linux/list.h>
-+#include <linux/io.h>
-+
-+#include <linux/can/dev.h>
-+#include <linux/can/error.h>
-+#include "flexcan.h"
-+#include <asm/coldfire.h>
-+#include <asm/m5485sim.h>
-+#include <linux/can/version.h>        /* for RCSID. Removed by mkpatch script */
-+RCSID("$Id$");
-+
-+struct flexcan_priv {
-+      struct can_priv can;
-+      volatile unsigned long flags;
-+      u8 shadow_statflg;
-+      u8 shadow_canrier;
-+      u8 cur_pri;
-+      u8 tx_active;
-+
-+      struct list_head tx_head;
-+      struct napi_struct napi;
-+      struct net_device *dev;
-+};
-+
-+
-+static int flexcan_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+      struct can_frame *frame = (struct can_frame *)skb->data;
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+      int i, len;
-+      int txbuf = 0;
-+      u32 can_id, can_ext, tmp, tmp1;
-+
-+      /* Transmission inactive */
-+      regs->cantxfg[txbuf].can_dlc = MB_CNT_CODE(0x08);
-+
-+      can_ext = frame->can_id;
-+      if (can_ext & CAN_EFF_FLAG) {
-+              /* Frame format is extended */
-+              regs->cantxfg[txbuf].can_dlc |= (1 << 21);
-+              regs->cantxfg[txbuf].can_dlc |= (1 << 22);
-+              can_id = frame->can_id & MB_ID_EXT;
-+              if (frame->can_id & CAN_RTR_FLAG)
-+                      regs->cantxfg[txbuf].can_dlc |= (1 << 20);
-+
-+              tmp = (can_id & CAN_SFF_MASK) << 18;
-+              tmp1 = can_id >> 11;
-+              can_id = tmp | tmp1;
-+              regs->cantxfg[txbuf].can_id = can_id;
-+      } else {
-+              /* Frame format is standard */
-+              can_id = frame->can_id & MB_ID_EXT;
-+              if (frame->can_id & CAN_RTR_FLAG)
-+                      regs->cantxfg[txbuf].can_dlc |= (1 << 20);
-+
-+              regs->cantxfg[txbuf].can_id = can_id << 18;
-+      }
-+
-+      len = 8;
-+      for (i = 0; i < len; i++)
-+              regs->cantxfg[txbuf].data[i] = frame->data[i];
-+
-+      regs->cantxfg[txbuf].can_dlc |= len << 16;
-+      /* Transmission active */
-+      regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c);
-+      kfree_skb(skb);
-+      return NETDEV_TX_OK;
-+}
-+
-+static void flexcan_tx_timeout(struct net_device *dev)
-+{
-+      struct sk_buff *skb;
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+      struct can_frame *frame;
-+      int length = 8;
-+
-+      /* Diable the interrupts */
-+      regs->imask = IMASK_BUFF_DISABLE_ALL;
-+
-+      skb = dev_alloc_skb(sizeof(struct can_frame));
-+      if (!skb) {
-+              if (printk_ratelimit())
-+                      dev_notice(ND2D(dev), "TIMEOUT packet dropped.\n");
-+              return;
-+      }
-+      frame = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
-+
-+      frame->can_dlc = length;
-+
-+      skb->dev = dev;
-+      skb->protocol = __constant_htons(ETH_P_CAN);
-+      skb->pkt_type = PACKET_BROADCAST;
-+      skb->ip_summed = CHECKSUM_UNNECESSARY;
-+
-+      netif_rx(skb);
-+}
-+
-+static irqreturn_t flexcan_isr(int irq, void *dev_id)
-+{
-+      struct net_device *dev = (struct net_device *)dev_id;
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+      struct net_device_stats *stats = dev->get_stats(dev);
-+      struct sk_buff *skb;
-+      struct can_frame *frame;
-+      u32 iflags, oflags;
-+      int i, k;
-+      int retval = 1;
-+
-+      iflags = regs->iflag;
-+      oflags = iflags;
-+      for (i = 0; i < 16; i++) {
-+              if (iflags & (0x01 << i)) {
-+                      struct flexcan_mb *mb = &regs->cantxfg[i];
-+                      int ctrl = mb->can_dlc;
-+                      int code = (ctrl >> 24) & 0x0f;
-+                      int length = (ctrl >> 16) & 0x0f;
-+                      u32 tmp, tmp1;
-+
-+                      if (code < 8 && (length > 0)) {
-+                              /* receive frame */
-+                              skb = dev_alloc_skb(sizeof(struct can_frame));
-+                              if (!skb)
-+                                      dev_notice(ND2D(dev),
-+                                                      "Packets dropped.\n");
-+                              skb->dev = dev;
-+                              frame = (struct can_frame *)skb_put(skb,
-+                                              sizeof(struct can_frame));
-+
-+                              frame->can_id &= 0x0;
-+                              frame->can_dlc = length;
-+                              tmp1 = mb->can_id & MB_ID_EXT;
-+                              if (ctrl & MB_CNT_IDE) {
-+                                      tmp = tmp1;
-+                                      tmp = (tmp >> 18) & CAN_SFF_MASK;
-+                                      frame->can_id = (tmp1 << 11) | tmp;
-+                                      frame->can_id &= CAN_EFF_MASK;
-+                                      frame->can_id |= CAN_EFF_FLAG;
-+                                      if (ctrl & MB_CNT_RTR)
-+                                              frame->can_id |= CAN_RTR_FLAG;
-+                              } else {
-+                                      frame->can_id  = tmp1 >> 18;
-+                                      if (ctrl & MB_CNT_RTR)
-+                                              frame->can_id |= CAN_RTR_FLAG;
-+                              }
-+
-+                              for (k = 0; k < 8; k++)
-+                                      frame->data[k] = mb->data[k];
-+
-+                              mb->can_dlc &= MB_CODE_MASK;
-+                              mb->can_dlc |= MB_CNT_CODE(0x04);
-+
-+                              stats->rx_packets++;
-+                              stats->rx_bytes += frame->can_dlc;
-+                              skb->dev = dev;
-+                              skb->protocol = __constant_htons(ETH_P_CAN);
-+                              skb->ip_summed = CHECKSUM_UNNECESSARY;
-+
-+                              retval = netif_rx(skb);
-+                              if (retval == NET_RX_DROP)
-+                                      dev_notice(ND2D(dev),
-+                                                      "Packets dropped.\n");
-+                      } else {
-+                              /* transmit frame */
-+                              mb->can_dlc = MB_CNT_CODE(0x04);
-+                      }
-+              }
-+      }
-+      regs->iflag = oflags;
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static int flexcan_do_set_bit_time(struct net_device *dev,
-+                               struct can_bittime *bt)
-+{
-+      struct flexcan_priv *priv = netdev_priv(dev);
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+      int ret = 0;
-+      u32 reg;
-+
-+      if (bt->type != CAN_BITTIME_STD)
-+              return -EINVAL;
-+
-+      spin_lock_irq(&priv->can.irq_lock);
-+
-+      reg = CANCTRL_PRESDIV(bt->std.brp) | CANCTRL_PSEG1(bt->std.phase_seg1
-+                      - 1) | CANCTRL_PSEG2(bt->std.phase_seg2 - 1);
-+      regs->canctrl &= CANCTRL_BITTIME;
-+      regs->canctrl |= (reg | CANCTRL_SAMP(bt->std.sam) |
-+              CANCTRL_PROPSEG(bt->std.prop_seg - 1));
-+
-+      spin_unlock_irq(&priv->can.irq_lock);
-+      return ret;
-+}
-+
-+
-+static int flexcan_open(struct net_device *dev)
-+{
-+      int ret, i, j;
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+
-+#if defined(CONFIG_M547X_8X)
-+      MCF_PAR_TIMER = MCF_PAR_TIMER | 0x28;
-+      MCF_PAR_TIMER = MCF_PAR_TIMER & 0xf8;
-+      MCF_PAR_DSPI = MCF_PAR_DSPI | 0x0a00;
-+      MCF_PAR_FECI2CIRQ = MCF_PAR_FECI2CIRQ | 0x0283;
-+      MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) & 0x0f;
-+      MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) | 0x50;
-+#endif
-+
-+      regs->canmcr |= CANMCR_SOFTRST;
-+      regs->canmcr |= CANMCR_MDIS;
-+      udelay(10);
-+
-+      if ((regs->canmcr & CANMCR_SOFTRST) != 0x0) {
-+              dev_err(ND2D(dev), "Failed to softreset can module.\n");
-+              return -1;
-+      }
-+
-+      /* Enable error and bus off interrupt */
-+      regs->canctrl |= (CANCTRL_RJW(3) | CANCTRL_ERRMSK |
-+                      CANCTRL_BOFFMSK);
-+
-+      /* Set lowest buffer transmitted first */
-+      regs->canctrl |= CANCTRL_LBUF;
-+
-+      for (i = 0; i < 16; i++) {
-+              regs->cantxfg[i].can_dlc = 0;
-+              regs->cantxfg[i].can_id = 0;
-+              for (j = 0; j < 8; j++)
-+                      regs->cantxfg[i].data[j] = 0;
-+
-+              /* Put MB into rx queue */
-+              regs->cantxfg[i].can_dlc = MB_CNT_CODE(0x04);
-+      }
-+
-+      /* acceptance mask/acceptance code (accept everything) */
-+      regs->rxgmask = 0x00000000;
-+      regs->rx14mask = 0x00000000;
-+      regs->rx15mask = 0x00000000;
-+      /* extended frame */
-+      regs->cantxfg[14].can_dlc |= 0x600000;
-+      /* Enable flexcan module */
-+      regs->canmcr &= ~CANMCR_MDIS;
-+      /* Synchronize with the can bus */
-+      regs->canmcr &= ~CANMCR_HALT;
-+
-+#if defined(CONFIG_M547X_8X)
-+      for (i = 0; i < 2; i++) {
-+              MCF_ICR(ISC_CANn_MBOR(i)) = 0x33;
-+              MCF_ICR(ISC_CANn_ERR(i)) = 0x33;
-+              MCF_ICR(ISC_CANn_BUSOFF(i)) = 0x33;
-+      }
-+
-+      ret = request_irq(dev->irq + 64, flexcan_isr, IRQF_DISABLED,
-+                      dev->name, dev);
-+      ret = request_irq(dev->irq + 1 + 64, flexcan_isr, IRQF_DISABLED,
-+                      dev->name, dev);
-+      ret = request_irq(dev->irq + 2 + 64, flexcan_isr, IRQF_DISABLED,
-+                      dev->name, dev);
-+      if (ret < 0) {
-+              printk(KERN_ERR "%s - failed to attach interrupt.\n",
-+                     dev->name);
-+              return ret;
-+      }
-+#endif
-+
-+      /* Enable all interrupts */
-+      regs->imask = IMASK_BUFF_ENABLE_ALL;
-+      netif_start_queue(dev);
-+      return 0;
-+}
-+
-+static int flexcan_close(struct net_device *dev)
-+{
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+
-+      netif_stop_queue(dev);
-+
-+      /* Disable all interrupts */
-+      regs->imask = IMASK_BUFF_DISABLE_ALL;
-+      free_irq(dev->irq + 64, dev);
-+      free_irq(dev->irq + 1 + 64, dev);
-+      free_irq(dev->irq + 2 + 64, dev);
-+
-+      /* Disable module */
-+      regs->canmcr |= CANMCR_MDIS;
-+      return 0;
-+}
-+
-+int register_flexcandev(struct net_device *dev, int clock_src)
-+{
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+
-+      regs->canmcr &= ~CANMCR_MDIS;
-+      udelay(100);
-+      regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT);
-+      return register_netdev(dev);
-+}
-+EXPORT_SYMBOL(register_flexcandev);
-+
-+void unregister_flexcandev(struct net_device *dev)
-+{
-+      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
-+
-+      regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT);
-+      regs->canmcr |= CANMCR_MDIS;
-+
-+      unregister_netdev(dev);
-+}
-+EXPORT_SYMBOL(unregister_flexcandev);
-+
-+struct net_device *alloc_flexcandev(void)
-+{
-+      struct net_device *dev;
-+      struct flexcan_priv *priv;
-+
-+      dev = alloc_candev(sizeof(struct flexcan_priv));
-+      if (!dev)
-+              return NULL;
-+
-+      priv = netdev_priv(dev);
-+      priv->dev = dev;
-+      dev->open = flexcan_open;
-+      dev->stop = flexcan_close;
-+      dev->hard_start_xmit = flexcan_hard_start_xmit;
-+      dev->tx_timeout = flexcan_tx_timeout;
-+      dev->flags |= IFF_NOARP;
-+      priv->can.do_set_bit_time = flexcan_do_set_bit_time;
-+      return dev;
-+}
-+EXPORT_SYMBOL(alloc_flexcandev);
-+
-+MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
-+MODULE_LICENSE("GPL v2");
-+MODULE_DESCRIPTION("CAN port driver for flexcan based chip");
---- /dev/null
-+++ b/drivers/net/can/flexcan/flexcan.h
-@@ -0,0 +1,148 @@
-+/*
-+ * flexcan.h
-+ *
-+ * DESCRIPTION:
-+ *  Definitions of consts/structs to drive the Freescale FLEXCAN.
-+ *
-+ */
-+
-+#ifndef __FLEXCAN_H__
-+#define __FLEXCAN_H__
-+
-+#include <linux/autoconf.h>
-+#include <linux/types.h>
-+
-+/* FLEXCAN module configuration register (CANMCR) bits */
-+#define CANMCR_MDIS                           0x80000000
-+#define CANMCR_FRZ                            0x40000000
-+#define CANMCR_HALT                           0x10000000
-+#define CANMCR_SOFTRST                                0x02000000
-+#define CANMCR_FRZACK                         0x01000000
-+#define CANMCR_SUPV                           0x00800000
-+#define CANMCR_MAXMB(x)                               ((x)&0x0f)
-+
-+/* FLEXCAN control register (CANCTRL) bits */
-+#define CANCTRL_PRESDIV(x)                    (((x)&0xff)<<24)
-+#define CANCTRL_RJW(x)                                (((x)&0x03)<<22)
-+#define CANCTRL_PSEG1(x)                      (((x)&0x07)<<19)
-+#define CANCTRL_PSEG2(x)                      (((x)&0x07)<<16)
-+#define CANCTRL_BOFFMSK                               0x00008000
-+#define CANCTRL_ERRMSK                                0x00004000
-+#define CANCTRL_LPB                           0x00001000
-+#define CANCTRL_SAMP(x)                               (((x)&0x1)<<7)
-+#define CANCTRL_BOFFREC                               0x00000040
-+#define CANCTRL_TSYNC                         0x00000020
-+#define CANCTRL_LBUF                          0x00000010
-+#define CANCTRL_LOM                           0x00000008
-+#define CANCTRL_PROPSEG(x)                    ((x)&0x07)
-+#define CANCTRL_BITTIME                               0x00c0d078
-+
-+/* FLEXCAN error counter register (ERRCNT) bits */
-+#define ERRCNT_REXECTR(x)                     (((x)&0xff)<<8)
-+#define ERRCNT_TXECTR(x)                      ((x)&0xff)
-+
-+/* FLEXCAN error and status register (ERRSTAT) bits */
-+#define ERRSTAT_BITERR(x)                     (((x)&0x03)<<14)
-+#define ERRSTAT_ACKERR                                0x00002000
-+#define ERRSTAT_CRCERR                                0x00001000
-+#define ERRSTAT_FRMERR                                0x00000800
-+#define ERRSTAT_STFERR                                0x00000400
-+#define ERRSTAT_TXWRN                         0x00000200
-+#define ERRSTAT_RXWRN                         0x00000100
-+#define ERRSTAT_IDLE                          0x00000080
-+#define ERRSTAT_TXRX                          0x00000040
-+#define ERRSTAT_FLTCONF(x)                    (((x)&0x03)<<4)
-+#define ERRSTAT_BOFFINT                               0x00000004
-+#define ERRSTAT_ERRINT                        0x00000002
-+
-+/* FLEXCAN interrupt mask register (IMASK) bits */
-+#define IMASK_BUF15M                          0x8000
-+#define IMASK_BUF14M                          0x4000
-+#define IMASK_BUF13M                          0x2000
-+#define IMASK_BUF12M                          0x1000
-+#define IMASK_BUF11M                          0x0800
-+#define IMASK_BUF10M                          0x0400
-+#define IMASK_BUF9M                           0x0200
-+#define IMASK_BUF8M                           0x0100
-+#define IMASK_BUF7M                           0x0080
-+#define IMASK_BUF6M                           0x0040
-+#define IMASK_BUF5M                           0x0020
-+#define IMASK_BUF4M                           0x0010
-+#define IMASK_BUF3M                           0x0008
-+#define IMASK_BUF2M                           0x0004
-+#define IMASK_BUF1M                           0x0002
-+#define IMASK_BUF0M                           0x0001
-+#define IMASK_BUFnM(x)                                (0x1<<(x))
-+#define IMASK_BUFF_ENABLE_ALL                 0xffff
-+#define IMASK_BUFF_DISABLE_ALL                        0x0000
-+
-+/* FLEXCAN interrupt flag register (IFLAG) bits */
-+#define IFLAG_BUF15M                          0x8000
-+#define IFLAG_BUF14M                          0x4000
-+#define IFLAG_BUF13M                          0x2000
-+#define IFLAG_BUF12M                          0x1000
-+#define IFLAG_BUF11M                          0x0800
-+#define IFLAG_BUF10M                          0x0400
-+#define IFLAG_BUF9M                           0x0200
-+#define IFLAG_BUF8M                           0x0100
-+#define IFLAG_BUF7M                           0x0080
-+#define IFLAG_BUF6M                           0x0040
-+#define IFLAG_BUF5M                           0x0020
-+#define IFLAG_BUF4M                           0x0010
-+#define IFLAG_BUF3M                           0x0008
-+#define IFLAG_BUF2M                           0x0004
-+#define IFLAG_BUF1M                           0x0002
-+#define IFLAG_BUF0M                           0x0001
-+#define IFLAG_BUFnM(x)                                (0x1<<(x))
-+#define IFLAG_BUFF_SET_ALL                    0xffff
-+#define IFLAG_BUFF_DISABLE_ALL                        0x0000
-+
-+/* FLEXCAN message buffers */
-+#define MB_CNT_CODE(x)                                (((x)&0x0f)<<24)
-+#define MB_CNT_SRR                            0x00400000
-+#define MB_CNT_IDE                            0x00200000
-+#define MB_CNT_RTR                            0x00100000
-+#define MB_CNT_LENGTH(x)                      (((x)&0x0f)<<16)
-+#define MB_CNT_TIMESTAMP(x)                   ((x)&0xffff)
-+
-+#define MB_ID_STD                             ((0x7ff)<<18)
-+#define MB_ID_EXT                             0x1fffffff
-+#define MB_CODE_MASK                          0xf0ffffff
-+
-+/* Structure of the message buffer */
-+struct flexcan_mb {
-+      u32     can_dlc;
-+      u32     can_id;
-+      u8      data[8];
-+};
-+
-+/* Structure of the hardware registers */
-+struct flexcan_regs {
-+      u32     canmcr;
-+      u32     canctrl;
-+      u32     timer;
-+      u32     reserved1;
-+      u32     rxgmask;
-+      u32     rx14mask;
-+      u32     rx15mask;
-+      u32     errcnt;
-+      u32     errstat;
-+      u32     reserved2;
-+      u32     imask;
-+      u32     reserved3;
-+      u32     iflag;
-+      u32     reserved4[19];
-+      struct  flexcan_mb cantxfg[16];
-+};
-+
-+struct flexcan_platform_data {
-+      u8 clock_src;           /* FLEXCAN clock source CRIN or SYSCLK */
-+      u32 clock_frq;          /* can ref. clock, in Hz */
-+};
-+
-+struct net_device *alloc_flexcandev(void);
-+
-+extern int register_flexcandev(struct net_device *dev, int clock_src);
-+extern void unregister_flexcandev(struct net_device *dev);
-+
-+#endif                                /* __FLEXCAN_H__ */
---- /dev/null
-+++ b/drivers/net/can/flexcan/Makefile
-@@ -0,0 +1,5 @@
-+
-+obj-$(CONFIG_CAN_MCF547X_8X)  += flexcan-mcf548x.o
-+
-+flexcan-mcf548x-objs  := flexcan.o mcf548x_can.o
-+
---- /dev/null
-+++ b/drivers/net/can/flexcan/mcf548x_can.c
-@@ -0,0 +1,213 @@
-+/*
-+ * DESCRIPTION:
-+ *  CAN bus driver for the Freescale MCF548x embedded CPU.
-+ *
-+ * AUTHOR:
-+ *  Andrey Volkov <avolkov@varma-el.com>
-+ *
-+ * COPYRIGHT:
-+ *  2004-2005, Varma Electronics Oy
-+ *
-+ * LICENCE:
-+ *  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.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ * HISTORY:
-+ *    2008-06-23 support for MCF548x's FlexCAN
-+ *            Huan, Wang  <b18965@freescale.com>
-+ *    2005-02-03 created
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <linux/netdevice.h>
-+#include <linux/can.h>
-+#include <linux/can/dev.h>
-+#include <linux/io.h>
-+
-+#include "flexcan.h"
-+#include <asm/coldfire.h>
-+#include <asm/m5485sim.h>
-+#include <linux/can/version.h>        /* for RCSID. Removed by mkpatch script */
-+
-+RCSID("$Id$");
-+
-+#define PDEV_MAX 2
-+
-+struct platform_device *pdev[PDEV_MAX];
-+
-+static int __devinit mcf548x_can_probe(struct platform_device *pdev)
-+{
-+      struct resource *mem;
-+      struct net_device *dev;
-+      struct flexcan_platform_data *pdata = pdev->dev.platform_data;
-+      struct can_priv *can;
-+      u32 mem_size;
-+      int ret = -ENODEV;
-+
-+      if (!pdata)
-+              return ret;
-+
-+      dev = alloc_flexcandev();
-+      if (!dev)
-+              return -ENOMEM;
-+      can = netdev_priv(dev);
-+
-+      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+
-+      dev->irq = platform_get_irq(pdev, 0);
-+      if (!mem || !dev->irq)
-+              goto req_error;
-+
-+      mem_size = mem->end - mem->start + 1;
-+      if (!request_mem_region(mem->start, mem_size, pdev->dev.driver->name)) {
-+              dev_err(&pdev->dev, "resource unavailable\n");
-+              goto req_error;
-+      }
-+      SET_NETDEV_DEV(dev, &pdev->dev);
-+
-+      dev->base_addr = (unsigned long)ioremap_nocache(mem->start, mem_size);
-+      if (!dev->base_addr) {
-+              dev_err(&pdev->dev, "failed to map can port\n");
-+              ret = -ENOMEM;
-+              goto fail_map;
-+      }
-+      can->can_sys_clock = pdata->clock_frq;
-+      platform_set_drvdata(pdev, dev);
-+      ret = register_flexcandev(dev, pdata->clock_src);
-+      if (ret >= 0) {
-+              dev_info(&pdev->dev, "probe for port 0x%lX done\n",
-+                       dev->base_addr);
-+              return ret;
-+      }
-+
-+      iounmap((unsigned long *)dev->base_addr);
-+fail_map:
-+      release_mem_region(mem->start, mem_size);
-+req_error:
-+      free_candev(dev);
-+      dev_err(&pdev->dev, "probe failed\n");
-+      return ret;
-+}
-+
-+static int __devexit mcf548x_can_remove(struct platform_device *pdev)
-+{
-+      struct net_device *dev = platform_get_drvdata(pdev);
-+      struct resource *mem;
-+
-+      platform_set_drvdata(pdev, NULL);
-+      unregister_flexcandev(dev);
-+      iounmap((unsigned long *)dev->base_addr);
-+
-+      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      release_mem_region(mem->start, mem->end - mem->start + 1);
-+      free_candev(dev);
-+      return 0;
-+}
-+
-+static struct platform_driver mcf548x_can_driver = {
-+      .driver = {
-+                 .name = "mcf548x-flexcan",
-+                 },
-+      .probe = mcf548x_can_probe,
-+      .remove = __devexit_p(mcf548x_can_remove),
-+};
-+
-+static struct resource mcf548x_can0_resources[] = {
-+      [0] = {
-+              .start          = MCF_MBAR + 0x0000A000,
-+              .end            = MCF_MBAR + 0x0000A7FF,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start          = 49,
-+              .end            = 49,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+
-+static struct resource mcf548x_can1_resources[] = {
-+      [0] = {
-+              .start          = MCF_MBAR + 0x0000A800,
-+              .end            = MCF_MBAR + 0x0000AFFF,
-+              .flags          = IORESOURCE_MEM,
-+      },
-+      [1] = {
-+              .start          = 55,
-+              .end            = 55,
-+              .flags          = IORESOURCE_IRQ,
-+      },
-+};
-+
-+
-+static int __init mcf548x_of_to_pdev(void)
-+{
-+      unsigned int i;
-+      int err = -ENODEV;
-+      struct flexcan_platform_data pdata;
-+
-+      pdev[0] = platform_device_register_simple("mcf548x-flexcan", 0,
-+                      mcf548x_can0_resources, 2);
-+      if (IS_ERR(pdev[0])) {
-+              err = PTR_ERR(pdev[0]);
-+              return err;
-+      }
-+      pdev[1] = platform_device_register_simple("mcf548x-flexcan", 1,
-+                      mcf548x_can1_resources, 2);
-+      if (IS_ERR(pdev[1])) {
-+              err = PTR_ERR(pdev[1]);
-+              return err;
-+      }
-+
-+      /* FlexCAN clock */
-+      pdata.clock_frq = 100000000;
-+
-+      for (i = 0; i < PDEV_MAX; i++) {
-+              err = platform_device_add_data(pdev[i], &pdata, sizeof(pdata));
-+              if (err)
-+                      return err;
-+      }
-+      return err;
-+}
-+
-+int __init mcf548x_can_init(void)
-+{
-+      int err = mcf548x_of_to_pdev();
-+
-+      if (err) {
-+              printk(KERN_ERR "%s init failed with err=%d\n",
-+                      mcf548x_can_driver.driver.name, err);
-+              return err;
-+      }
-+
-+      return platform_driver_register(&mcf548x_can_driver);
-+}
-+
-+void __exit mcf548x_can_exit(void)
-+{
-+      int i;
-+      platform_driver_unregister(&mcf548x_can_driver);
-+      for (i = 0; i < PDEV_MAX; i++)
-+              platform_device_unregister(pdev[i]);
-+}
-+
-+module_init(mcf548x_can_init);
-+module_exit(mcf548x_can_exit);
-+
-+MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
-+MODULE_DESCRIPTION("Freescale MCF548x CAN driver");
-+MODULE_LICENSE("GPL v2");
---- a/drivers/net/can/Kconfig
-+++ b/drivers/net/can/Kconfig
-@@ -12,6 +12,19 @@ config CAN_VCAN
-         This driver can also be built as a module.  If so, the module
-         will be called vcan.
-+config CAN_FLEXCAN
-+      tristate "Support for Freescale FLEXCAN based chips"
-+      depends on CAN && (PPC || M68K || M68KNOMMU)
-+      ---help---
-+        Say Y here if you want to support for Freescale FlexCAN.
-+
-+config CAN_MCF547X_8X
-+      tristate "Freescale MCF547X/MCF548X onboard CAN controller"
-+      depends on CAN_FLEXCAN && (M547X || M548X)
-+      ---help---
-+        Say Y here if you want to support for Freescale MCF547x/MCF548x
-+        onboard dualCAN controller.
-+
- config CAN_DEBUG_DEVICES
-       bool "CAN devices debugging messages"
-       depends on CAN
---- a/drivers/net/can/Makefile
-+++ b/drivers/net/can/Makefile
-@@ -3,3 +3,4 @@
- #
- obj-$(CONFIG_CAN_VCAN)                += vcan.o
-+obj-$(CONFIG_CAN_FLEXCAN)     += flexcan/
---- /dev/null
-+++ b/drivers/net/fec/fec.c
-@@ -0,0 +1,1306 @@
-+/*
-+ * Performance and stability improvements: (C) Copyright 2008,
-+ *      Daniel Krueger, SYSTEC electronic GmbH
-+ *
-+ * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming
-+ * soon -- Kurt Mahan
-+ */
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/ptrace.h>
-+#include <linux/errno.h>
-+#include <linux/ioport.h>
-+#include <linux/slab.h>
-+#include <linux/interrupt.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/spinlock.h>
-+#include <linux/workqueue.h>
-+#include <linux/bitops.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+
-+#include <asm/dma.h>
-+#include <asm/MCD_dma.h>
-+#include <asm/m5485sram.h>
-+#include <asm/virtconvert.h>
-+#include <asm/irq.h>
-+
-+#include "fec.h"
-+#include "ks8721.h"
-+
-+#ifdef        CONFIG_FEC_548x_ENABLE_FEC2
-+#define       FEC_MAX_PORTS   2
-+#define       FEC_2
-+#else
-+#define       FEC_MAX_PORTS   1
-+#undef        FEC_2
-+#endif
-+
-+#define VERSION "0.20"
-+MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION);
-+
-+/* fec private */
-+struct fec_priv {
-+      struct net_device *netdev;              /* owning net device */
-+      void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; /* tx buffer ptrs */
-+      MCD_bufDescFec *fecpriv_txdesc;         /* tx descriptor ptrs */
-+      volatile unsigned int fecpriv_current_tx; /* current tx desc index */
-+      volatile unsigned int fecpriv_next_tx;  /* next tx desc index */
-+      unsigned int fecpriv_current_rx;        /* current rx desc index */
-+      MCD_bufDescFec *fecpriv_rxdesc;         /* rx descriptor ptrs */
-+      struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; /* rx SKB ptrs */
-+      unsigned int fecpriv_initiator_rx;      /* rx dma initiator */
-+      unsigned int fecpriv_initiator_tx;      /* tx dma initiator */
-+      int fecpriv_fec_rx_channel;             /* rx dma channel */
-+      int fecpriv_fec_tx_channel;             /* tx dma channel */
-+      int fecpriv_rx_requestor;               /* rx dma requestor */
-+      int fecpriv_tx_requestor;               /* tx dma requestor */
-+      void *fecpriv_interrupt_fec_rx_handler; /* dma rx handler */
-+      void *fecpriv_interrupt_fec_tx_handler; /* dma tx handler */
-+      unsigned char *fecpriv_mac_addr;        /* private fec mac addr */
-+      struct net_device_stats fecpriv_stat;   /* stats ptr */
-+      spinlock_t fecpriv_lock;
-+      int fecpriv_rxflag;
-+      struct tasklet_struct fecpriv_tasklet_reinit;
-+      int index;                              /* fec hw number */
-+};
-+
-+struct net_device *fec_dev[FEC_MAX_PORTS];
-+
-+/* FEC functions */
-+int __init fec_init(void);
-+struct net_device_stats *fec_get_stat(struct net_device *dev);
-+int fec_open(struct net_device *dev);
-+int fec_close(struct net_device *nd);
-+int fec_tx(struct sk_buff *skb, struct net_device *dev);
-+void fec_set_multicast_list(struct net_device *nd);
-+int fec_set_mac_address(struct net_device *dev, void *p);
-+void fec_tx_timeout(struct net_device *dev);
-+void fec_interrupt_fec_tx_handler(struct net_device *dev);
-+void fec_interrupt_fec_rx_handler(struct net_device *dev);
-+irqreturn_t fec_interrupt_handler(int irq, void *dev_id);
-+void fec_interrupt_fec_tx_handler_fec0(void);
-+void fec_interrupt_fec_rx_handler_fec0(void);
-+void fec_interrupt_fec_reinit(unsigned long data);
-+
-+/* default fec0 address */
-+unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 };
-+
-+#ifdef   FEC_2
-+/* default fec1 address */
-+unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 };
-+#endif
-+
-+extern unsigned char uboot_enet0[];
-+extern unsigned char uboot_enet1[];
-+
-+#ifndef MODULE
-+int fec_str_to_mac( char *str_mac, unsigned char* addr);
-+int __init fec_mac_setup0 (char *s);
-+#endif
-+
-+
-+#ifdef   FEC_2
-+void fec_interrupt_fec_tx_handler_fec1(void);
-+void fec_interrupt_fec_rx_handler_fec1(void);
-+#endif
-+
-+#ifndef MODULE
-+int __init fec_mac_setup1 (char *s);
-+#endif
-+
-+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data);
-+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data);
-+
-+module_init(fec_init);
-+/* module_exit(fec_cleanup); */
-+
-+__setup("mac0=", fec_mac_setup0);
-+
-+#ifdef   FEC_2
-+__setup("mac1=", fec_mac_setup1);
-+#endif
-+
-+/*
-+ * Initialize a FEC device
-+ */
-+int fec_enet_init(struct net_device *dev)
-+{
-+      static int index = 0;
-+      struct fec_priv *fp = netdev_priv(dev);
-+      int i;
-+
-+      fp->index = index;
-+      fp->netdev = dev;
-+      fec_dev[ index ] = dev;
-+
-+      if (index == 0) {
-+              /* disable fec0 */
-+              FEC_ECR(FEC_BASE_ADDR_FEC0) = FEC_ECR_DISABLE;
-+
-+              /* setup the interrupt handler */
-+              dev->irq = 64 + ISC_FEC0;
-+
-+              if (request_irq(dev->irq, fec_interrupt_handler,
-+                              IRQF_DISABLED, "ColdFire FEC 0", dev)) {
-+                      dev->irq = 0;
-+                      printk("Cannot allocate FEC0 IRQ\n");
-+              } else {
-+                      /* interrupt priority and level */
-+                      MCF_ICR(ISC_FEC0) = ILP_FEC0;
-+              }
-+
-+              /* fec base address */
-+              dev->base_addr = FEC_BASE_ADDR_FEC0;
-+
-+              /* requestor numbers */
-+              fp->fecpriv_rx_requestor = DMA_FEC0_RX;
-+              fp->fecpriv_tx_requestor = DMA_FEC0_TX;
-+
-+              /* fec0 handlers */
-+              fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec0;
-+              fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec0;
-+
-+              /* tx descriptors */
-+              fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC0;
-+
-+              /* rx descriptors */
-+              fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0;
-+
-+              /* mac addr */
-+              if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] ||
-+                  uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) {
-+                      /* use uboot enet 0 addr */
-+                      memcpy(fec_mac_addr_fec0, uboot_enet0, 6);
-+              }
-+
-+              fp->fecpriv_mac_addr = fec_mac_addr_fec0;
-+      }
-+      else {
-+              /* disable fec1 */
-+              FEC_ECR(FEC_BASE_ADDR_FEC1) = FEC_ECR_DISABLE;
-+#ifdef FEC_2
-+              /* setup the interrupt handler */
-+              dev->irq = 64 + ISC_FEC1;
-+
-+              if (request_irq(dev->irq, fec_interrupt_handler,
-+                              IRQF_DISABLED, "ColdFire FEC 1", dev)) {
-+                      dev->irq = 0;
-+                      printk("Cannot allocate FEC1 IRQ\n");
-+              } else {
-+                      /* interrupt priority and level */
-+                      MCF_ICR(ISC_FEC1) = ILP_FEC1;
-+              }
-+
-+              /* fec base address */
-+              dev->base_addr = FEC_BASE_ADDR_FEC1;
-+
-+              /* requestor numbers */
-+              fp->fecpriv_rx_requestor = DMA_FEC1_RX;
-+              fp->fecpriv_tx_requestor = DMA_FEC1_TX;
-+
-+              /* fec1 handlers */
-+              fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec1;
-+              fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec1;
-+
-+              /* tx descriptors */
-+              fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC1;
-+
-+              /* rx descriptors */
-+              fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1;
-+
-+              /* mac addr */
-+              if (uboot_enet1[0] || uboot_enet1[1] || uboot_enet1[2] ||
-+                  uboot_enet1[3] || uboot_enet1[4] || uboot_enet1[5]) {
-+                      /* use uboot enet 1 addr */
-+                      memcpy(fec_mac_addr_fec1, uboot_enet1, 6);
-+              }
-+              fp->fecpriv_mac_addr = fec_mac_addr_fec1;
-+#endif
-+      }
-+
-+      /* clear MIB */
-+      memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN);
-+
-+      /* clear the statistics structure */
-+      memset((void *) &(fp->fecpriv_stat), 0,
-+             sizeof(struct net_device_stats));
-+
-+      /* grab the FEC initiators */
-+      dma_set_initiator(fp->fecpriv_tx_requestor);
-+      fp->fecpriv_initiator_tx = dma_get_initiator(fp->fecpriv_tx_requestor);
-+      dma_set_initiator(fp->fecpriv_rx_requestor);
-+      fp->fecpriv_initiator_rx = dma_get_initiator(fp->fecpriv_rx_requestor);
-+
-+      /* reset the DMA channels */
-+      fp->fecpriv_fec_rx_channel = -1;
-+      fp->fecpriv_fec_tx_channel = -1;
-+
-+      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
-+              fp->askb_rx[i] = NULL;
-+
-+      /* initialize the pointers to the socket buffers */
-+      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
-+              fp->fecpriv_txbuf[i] = NULL;
-+
-+      ether_setup(dev);
-+
-+      dev->open = fec_open;
-+      dev->stop = fec_close;
-+      dev->hard_start_xmit = fec_tx;
-+      dev->get_stats = fec_get_stat;
-+      dev->set_multicast_list = fec_set_multicast_list;
-+      dev->set_mac_address = fec_set_mac_address;
-+      dev->tx_timeout = fec_tx_timeout;
-+      dev->watchdog_timeo = FEC_TX_TIMEOUT * HZ;
-+
-+      memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
-+
-+      spin_lock_init(&fp->fecpriv_lock);
-+
-+      // Initialize FEC/I2C/IRQ Pin Assignment Register
-+      FEC_GPIO_PAR_FECI2CIRQ &= 0xF;
-+      FEC_GPIO_PAR_FECI2CIRQ |= FEC_FECI2CIRQ;
-+
-+      index++;
-+      return 0;
-+}
-+
-+/*
-+ * Module Initialization
-+ */
-+int __init fec_init(void)
-+{
-+      struct net_device *dev;
-+      int i;
-+      int err;
-+      DECLARE_MAC_BUF(mac);
-+
-+      printk(KERN_INFO "FEC ENET (DMA) Version %s\n", VERSION);
-+
-+      for (i = 0; i < FEC_MAX_PORTS; i++) {
-+              dev = alloc_etherdev(sizeof(struct fec_priv));
-+              if (!dev)
-+                      return -ENOMEM;
-+              err = fec_enet_init(dev);
-+              if (err) {
-+                      free_netdev(dev);
-+                      continue;
-+              }
-+              if (register_netdev(dev) != 0) {
-+                      free_netdev(dev);
-+                      return -EIO;
-+              }
-+
-+              printk(KERN_INFO "%s: ethernet %s\n",
-+                     dev->name, print_mac(mac, dev->dev_addr));
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * Stop a device
-+ */
-+void fec_stop(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+
-+      dma_remove_initiator(fp->fecpriv_initiator_tx);
-+      dma_remove_initiator(fp->fecpriv_initiator_rx);
-+
-+      if (dev->irq)
-+              free_irq(dev->irq, dev);
-+}
-+
-+/************************************************************************
-+* NAME: fec_open
-+*
-+* DESCRIPTION: This function performs the initialization of
-+*                             of FEC and corresponding KS8721 transiver
-+*
-+* RETURNS: If no error occurs, this function returns zero.
-+*************************************************************************/
-+int fec_open(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+      int fduplex;
-+      int i;
-+      int channel;
-+      int error_code = -EBUSY;
-+
-+      /* Receive the DMA channels */
-+      channel = dma_set_channel_fec(fp->fecpriv_rx_requestor);
-+
-+      if (channel == -1) {
-+              printk("Dma channel cannot be reserved\n");
-+              goto ERRORS;
-+      }
-+
-+      fp->fecpriv_fec_rx_channel = channel;
-+
-+      dma_connect(channel, (int) fp->fecpriv_interrupt_fec_rx_handler);
-+
-+      channel = dma_set_channel_fec(fp->fecpriv_tx_requestor);
-+
-+      if (channel == -1) {
-+              printk("Dma channel cannot be reserved\n");
-+              goto ERRORS;
-+      }
-+
-+      fp->fecpriv_fec_tx_channel = channel;
-+
-+      dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler);
-+
-+      /* init tasklet for controller reinitialization */
-+      tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev);
-+
-+      /* Reset FIFOs */
-+      FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL;
-+      FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
-+
-+      /* Reset and disable FEC */
-+      FEC_ECR(base_addr) = FEC_ECR_RESET;
-+
-+      udelay(10);
-+
-+      /* Clear all events */
-+      FEC_EIR(base_addr) = FEC_EIR_CLEAR;
-+
-+      /* Reset FIFO status */
-+      FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK;
-+      FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK;
-+
-+      /* Set the default address */
-+      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) |
-+                            (fp->fecpriv_mac_addr[1] << 16) |
-+                            (fp->fecpriv_mac_addr[2] << 8) |
-+                            fp->fecpriv_mac_addr[3];
-+      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) |
-+                            (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
-+
-+      /* Reset the group address descriptor */
-+      FEC_GALR(base_addr) = 0x00000000;
-+      FEC_GAUR(base_addr) = 0x00000000;
-+
-+      /* Reset the individual address descriptor */
-+      FEC_IALR(base_addr) = 0x00000000;
-+      FEC_IAUR(base_addr) = 0x00000000;
-+
-+      /* Set the receive control register */
-+      FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII;
-+
-+      /* Set the receive FIFO control register */
-+//    FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK;
-+      FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR
-+                             | (FEC_FECRFCR_MSK     // disable all but ...
-+                                & ~FEC_FECRFCR_FAE  // enable frame accept error
-+                                & ~FEC_FECRFCR_RXW  // enable receive wait condition
-+//                                & ~FEC_FECRFCR_UF   // enable FIFO underflow
-+                             );
-+
-+      /* Set the receive FIFO alarm register */
-+      FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM;
-+
-+      /* Set the transmit FIFO control register */
-+//    FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK;
-+      FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR
-+                             | (FEC_FECTFCR_MSK     // disable all but ...
-+                                & ~FEC_FECTFCR_FAE  // enable frame accept error
-+//                                & ~FEC_FECTFCR_TXW  // enable transmit wait condition
-+//                                & ~FEC_FECTFCR_UF   // enable FIFO underflow
-+                                & ~FEC_FECTFCR_OF); // enable FIFO overflow
-+
-+      /* Set the transmit FIFO alarm register */
-+      FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM;
-+
-+      /* Set the Tx FIFO watermark */
-+      FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK;
-+
-+      /* Enable the transmitter to append the CRC */
-+      FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC;
-+
-+      /* Enable the ethernet interrupts */
-+//    FEC_EIMR(base_addr) = FEC_EIMR_MASK;
-+      FEC_EIMR(base_addr) = FEC_EIMR_DISABLE
-+                            | FEC_EIR_LC
-+                            | FEC_EIR_RL
-+                            | FEC_EIR_HBERR
-+                            | FEC_EIR_XFUN
-+                            | FEC_EIR_XFERR
-+                            | FEC_EIR_RFERR
-+                            ;
-+
-+/*
-+ * JKM --
-+ *
-+ * There's a problem with the PHY initialization code -- 
-+ * for now assume uboot left it in an initialized state.
-+ */
-+// printk(KERN_INFO "FECOPEN: starting auto-negotiation\n");
-+// #ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
-+#if 0
-+      if ((error_code = init_transceiver(base_addr, &fduplex)) != 0)
-+      {
-+              printk("Initialization of the transceiver is failed\n");
-+              goto ERRORS;
-+      }
-+#else
-+      fduplex = 1;
-+#endif
-+// printk(KERN_INFO "FECOPEN: done with auto-negotiation\n");
-+
-+      if (fduplex)
-+              /* Enable the full duplex mode */
-+              FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC;
-+      else
-+              /* Disable reception of frames while transmitting */
-+              FEC_RCR(base_addr) |= FEC_RCR_DRT;
-+
-+      /* Enable MIB */
-+      FEC_MIBC(base_addr) = FEC_MIBC_ENABLE;
-+
-+      /* Enable FEC */
-+      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
-+
-+      /* Initialize tx descriptors and start DMA for the transmission */
-+      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
-+              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
-+
-+      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
-+
-+      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
-+
-+      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
-+                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
-+                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
-+                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
-+                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
-+
-+      /* Initialize rx descriptors and start DMA for the reception */
-+      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
-+              fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA);
-+              if (!fp->askb_rx[i]) {
-+                      fp->fecpriv_rxdesc[i].dataPointer = 0;
-+                      fp->fecpriv_rxdesc[i].statCtrl = 0;
-+                      fp->fecpriv_rxdesc[i].length = 0;
-+              }
-+              else {
-+                      skb_reserve(fp->askb_rx[i], 16);
-+                      fp->askb_rx[i]->dev = dev;
-+                      fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
-+                      fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
-+                      fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
-+              }
-+      }
-+
-+      fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
-+      fp->fecpriv_current_rx = 0;
-+
-+      /* flush entire data cache before restarting the DMA */
-+#if 0
-+/* JKM -- currently running with cache turned off */
-+      DcacheFlushInvalidate();
-+#endif
-+      
-+      MCD_startDma(fp->fecpriv_fec_rx_channel, (char *) fp->fecpriv_rxdesc, 0,
-+                   (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
-+                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
-+                   FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
-+                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
-+
-+      netif_start_queue(dev);
-+      return 0;
-+
-+ERRORS:
-+
-+      /* Remove the channels and return with the error code */
-+      if (fp->fecpriv_fec_rx_channel != -1) {
-+              dma_disconnect(fp->fecpriv_fec_rx_channel);
-+              dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
-+              fp->fecpriv_fec_rx_channel = -1;
-+      }
-+
-+      if (fp->fecpriv_fec_tx_channel != -1) {
-+              dma_disconnect(fp->fecpriv_fec_tx_channel);
-+              dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
-+              fp->fecpriv_fec_tx_channel = -1;
-+      }
-+
-+      return error_code;
-+}
-+
-+/************************************************************************
-+* NAME: fec_close
-+*
-+* DESCRIPTION: This function performs the graceful stop of the
-+*                             transmission and disables FEC
-+*
-+* RETURNS: This function always returns zero.
-+*************************************************************************/
-+int fec_close(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+      unsigned long time;
-+      int i;
-+
-+      netif_stop_queue(dev);
-+
-+      /* Perform the graceful stop */
-+      FEC_TCR(base_addr) |= FEC_TCR_GTS;
-+
-+      time = jiffies;
-+
-+      /* Wait for the graceful stop */
-+      while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ)
-+              schedule();
-+
-+      /* Disable FEC */
-+      FEC_ECR(base_addr) = FEC_ECR_DISABLE;
-+
-+      /* Reset the DMA channels */
-+      spin_lock_irq(&fp->fecpriv_lock);
-+      MCD_killDma(fp->fecpriv_fec_tx_channel);
-+      spin_unlock_irq(&fp->fecpriv_lock);
-+      dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
-+      dma_disconnect(fp->fecpriv_fec_tx_channel);
-+      fp->fecpriv_fec_tx_channel = -1;
-+
-+      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
-+              if (fp->fecpriv_txbuf[i]) {
-+                      kfree(fp->fecpriv_txbuf[i]);
-+                      fp->fecpriv_txbuf[i] = NULL;
-+              }
-+      }
-+
-+      spin_lock_irq(&fp->fecpriv_lock);
-+      MCD_killDma(fp->fecpriv_fec_rx_channel);
-+      spin_unlock_irq(&fp->fecpriv_lock);
-+
-+      dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
-+      dma_disconnect(fp->fecpriv_fec_rx_channel);
-+      fp->fecpriv_fec_rx_channel = -1;
-+
-+      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
-+              if (fp->askb_rx[i]) {
-+                      kfree_skb(fp->askb_rx[i]);
-+                      fp->askb_rx[i] = NULL;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+/************************************************************************
-+* +NAME: fec_get_stat
-+*
-+* RETURNS: This function returns the statistical information.
-+*************************************************************************/
-+struct net_device_stats * fec_get_stat(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = dev->base_addr;
-+
-+      /* Receive the statistical information */
-+      fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr);
-+      fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr);
-+      fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr);
-+      fp->fecpriv_stat.tx_bytes = FECSTAT_RMON_T_OCTETS(base_addr);
-+
-+      fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr);
-+      fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr);
-+
-+      fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) +
-+              FECSTAT_RMON_R_OVERSIZE(base_addr) +
-+              FECSTAT_RMON_R_FRAG(base_addr) +
-+              FECSTAT_RMON_R_JAB(base_addr);
-+      fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr);
-+      fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr);
-+      fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr);
-+
-+      fp->fecpriv_stat.tx_carrier_errors = FECSTAT_IEEE_T_CSERR(base_addr);
-+      fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr);
-+      fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr);
-+
-+      /* I hope that one frame doesn't have more than one error */
-+      fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors +
-+              fp->fecpriv_stat.rx_crc_errors +
-+              fp->fecpriv_stat.rx_frame_errors +
-+              fp->fecpriv_stat.rx_over_errors +
-+              fp->fecpriv_stat.rx_dropped;
-+      fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors +
-+              fp->fecpriv_stat.tx_fifo_errors +
-+              fp->fecpriv_stat.tx_window_errors +
-+              fp->fecpriv_stat.tx_aborted_errors +
-+              fp->fecpriv_stat.tx_heartbeat_errors +
-+              fp->fecpriv_stat.tx_dropped;
-+
-+      return &fp->fecpriv_stat;
-+}
-+
-+/************************************************************************
-+* NAME: fec_set_multicast_list
-+*
-+* DESCRIPTION: This function sets the frame filtering parameters
-+*************************************************************************/
-+void fec_set_multicast_list(struct net_device *dev)
-+{
-+      struct dev_mc_list *dmi;
-+      unsigned int crc, data;
-+      int i, j, k;
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+
-+      if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) {
-+              /* Allow all incoming frames */
-+              FEC_GALR(base_addr) = 0xFFFFFFFF;
-+              FEC_GAUR(base_addr) = 0xFFFFFFFF;
-+              return;
-+      }
-+
-+      /* Reset the group address register */
-+      FEC_GALR(base_addr) = 0x00000000;
-+      FEC_GAUR(base_addr) = 0x00000000;
-+
-+      /* Process all addresses */
-+      for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) {
-+              /* Processing must be only for the group addresses */
-+              if (!(dmi->dmi_addr[0] & 1))
-+                      continue;
-+
-+              /* Calculate crc value for the current address */
-+              crc = 0xFFFFFFFF;
-+              for (j = 0; j < dmi->dmi_addrlen; j++) {
-+                      for (k = 0, data = dmi->dmi_addr[j]; k < 8;  k++, data >>= 1) {
-+                              if ((crc ^ data) & 1)
-+                                      crc = (crc >> 1) ^ FEC_CRCPOL;
-+                              else
-+                                      crc >>= 1;
-+                      }
-+              }
-+
-+              /* Add this value */
-+              crc >>= 26;
-+              crc &= 0x3F;
-+              if (crc > 31)
-+                      FEC_GAUR(base_addr) |= 0x1 << (crc - 32);
-+              else
-+                      FEC_GALR(base_addr) |= 0x1 << crc;
-+      }
-+}
-+
-+/************************************************************************
-+* NAME: fec_set_mac_address
-+*
-+* DESCRIPTION: This function sets the MAC address
-+*************************************************************************/
-+int fec_set_mac_address(struct net_device *dev, void *p)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+      struct sockaddr *addr = p;
-+
-+      if (netif_running(dev))
-+              return -EBUSY;
-+
-+      /* Copy a new address to the device structure */
-+      memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
-+
-+      /* Copy a new address to the private structure */
-+      memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6);
-+
-+      /* Set the address to the registers */
-+      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) |
-+              (fp->fecpriv_mac_addr[1] << 16) |
-+              (fp->fecpriv_mac_addr[2] << 8) |
-+              fp->fecpriv_mac_addr[3];
-+      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) |
-+              (fp->fecpriv_mac_addr[5] << 16) |
-+              0x8808;
-+
-+      return 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_tx
-+*
-+* DESCRIPTION: This function starts transmission of the frame using DMA
-+*
-+* RETURNS: This function always returns zero.
-+*************************************************************************/
-+int fec_tx(struct sk_buff *skb, struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      void *data, *data_aligned;
-+      int offset;
-+
-+      data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
-+
-+      if (!data) {
-+              fp->fecpriv_stat.tx_dropped++;
-+              dev_kfree_skb(skb);
-+              return 0;
-+      }
-+
-+      offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) -
-+              (unsigned long)virt_to_phys(data);
-+      data_aligned = (void*)((unsigned long)data + offset);
-+      memcpy(data_aligned, skb->data, skb->len);
-+
-+      /* flush data cache before initializing the descriptor and starting DMA */
-+#if 0
-+/* JKM -- currently running with cache turned off */
-+      DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len);
-+#endif
-+
-+      spin_lock_irq(&fp->fecpriv_lock);
-+
-+      /* Initialize the descriptor */
-+      fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data;
-+      fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned);
-+      fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len;
-+      fp->fecpriv_txdesc[fp->fecpriv_next_tx].statCtrl |= (MCD_FEC_END_FRAME | MCD_FEC_BUF_READY);
-+      fp->fecpriv_next_tx = (fp->fecpriv_next_tx + 1) & FEC_TX_INDEX_MASK;
-+
-+      if (fp->fecpriv_txbuf[fp->fecpriv_current_tx] && fp->fecpriv_current_tx == fp->fecpriv_next_tx)
-+              netif_stop_queue(dev);
-+
-+      spin_unlock_irq(&fp->fecpriv_lock);
-+
-+      /* Tell the DMA to continue the transmission */
-+      MCD_continDma(fp->fecpriv_fec_tx_channel);
-+
-+      dev_kfree_skb(skb);
-+
-+      dev->trans_start = jiffies;
-+
-+      return 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_tx_timeout
-+*
-+* DESCRIPTION: If the interrupt processing of received frames was lost
-+*              and DMA stopped the reception, this function clears
-+*              the transmission descriptors and starts DMA
-+*
-+*************************************************************************/
-+void fec_tx_timeout(struct net_device *dev)
-+{
-+      int i;
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+
-+      spin_lock_irq(&fp->fecpriv_lock);
-+      MCD_killDma(fp->fecpriv_fec_tx_channel);
-+      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
-+              if (fp->fecpriv_txbuf[i]) {
-+                      kfree(fp->fecpriv_txbuf[i]);
-+                      fp->fecpriv_txbuf[i] = NULL;
-+              }
-+              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
-+      }
-+      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
-+
-+      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
-+
-+    /* Reset FIFOs */
-+    FEC_FECFRST(base_addr) |= FEC_SW_RST;
-+    FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
-+
-+      /* Reset and disable FEC */
-+//    FEC_ECR(base_addr) = FEC_ECR_RESET;
-+
-+      /* Enable FEC */
-+      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
-+
-+      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
-+                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
-+                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
-+                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
-+                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
-+
-+      spin_unlock_irq(&fp->fecpriv_lock);
-+
-+      netif_wake_queue(dev);
-+
-+}
-+
-+/************************************************************************
-+* NAME: fec_read_mii
-+*
-+* DESCRIPTION: This function reads the value from the MII register
-+*
-+* RETURNS: If no error occurs, this function returns zero.
-+*************************************************************************/
-+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data)
-+{
-+      unsigned long time;
-+
-+      /* Clear the MII interrupt bit */
-+      FEC_EIR(base_addr) = FEC_EIR_MII;
-+
-+      /* Write to the MII management frame register */
-+      FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18);
-+
-+      time = jiffies;
-+
-+      /* Wait for the reading */
-+      while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) {
-+              if (jiffies - time > FEC_MII_TIMEOUT * HZ)
-+                      return -ETIME;
-+              schedule();
-+      }
-+
-+      /* Clear the MII interrupt bit */
-+      FEC_EIR(base_addr) = FEC_EIR_MII;
-+
-+      *data = FEC_MMFR(base_addr) & 0x0000FFFF;
-+
-+      return 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_write_mii
-+*
-+* DESCRIPTION: This function writes the value to the MII register
-+*
-+* RETURNS: If no error occurs, this function returns zero.
-+*************************************************************************/
-+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data)
-+{
-+      unsigned long time;
-+
-+      /* Clear the MII interrupt bit */
-+      FEC_EIR(base_addr) = FEC_EIR_MII;
-+
-+      /* Write to the MII management frame register */
-+      FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data;
-+
-+      time = jiffies;
-+
-+      /* Wait for the writing */
-+      while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) {
-+              if (jiffies - time > FEC_MII_TIMEOUT * HZ)
-+                      return -ETIME;
-+              schedule();
-+      }
-+
-+      /* Clear the MII interrupt bit */
-+      FEC_EIR(base_addr) = FEC_EIR_MII;
-+
-+      return 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_interrupt_tx_handler
-+*
-+* DESCRIPTION: This function is called when the data
-+*              transmission from the buffer to the FEC is completed.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_tx_handler(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+
-+      /* Release the socket buffer */
-+      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) {
-+              kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
-+              fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
-+      }
-+      fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK;
-+
-+      if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) {
-+              for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) {
-+                      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) {
-+                              kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
-+                              fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
-+                      }
-+              }
-+      }
-+
-+      if (netif_queue_stopped(dev))
-+              netif_wake_queue(dev);
-+}
-+
-+/************************************************************************
-+* NAME: fec_interrupt_rx_handler
-+*
-+* DESCRIPTION: This function is called when the data
-+*              reception from the FEC to the reception buffer is completed.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_rx_handler(struct net_device *dev)
-+{
-+      struct fec_priv *fp = netdev_priv(dev);
-+      struct sk_buff *skb;
-+      int i;
-+
-+      fp->fecpriv_rxflag = 1;
-+      // Some buffers can be missed
-+      if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME))
-+      {
-+              // Find a valid index
-+              for(i = 0; i < FEC_RX_BUF_NUMBER && !(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME); i++, fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK);
-+
-+              if(i == FEC_RX_BUF_NUMBER)
-+              {
-+                      // There are no data to process
-+                      // Tell the DMA to continue the reception
-+                      MCD_continDma(fp->fecpriv_fec_rx_channel);
-+
-+                      fp->fecpriv_rxflag = 0;
-+
-+                      return;
-+              }
-+      }
-+
-+      for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) {
-+          if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) &&
-+                  (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */
-+              skb = fp->askb_rx[fp->fecpriv_current_rx];
-+              if (!skb)
-+                      fp->fecpriv_stat.rx_dropped++;
-+              else {
-+                  /* flush data cache before initializing the descriptor and starting DMA */
-+//                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len);
-+
-+                      skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4);
-+                      skb->protocol = eth_type_trans(skb, dev);
-+                      netif_rx(skb);
-+              }
-+              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME;
-+              /* allocate new skbuff */
-+              fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA);
-+              if (!fp->askb_rx[fp->fecpriv_current_rx]) {
-+                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0;
-+                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0;
-+                      fp->fecpriv_stat.rx_dropped++;
-+              }
-+              else {
-+                      skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16);
-+                      fp->askb_rx[fp->fecpriv_current_rx]->dev = dev;
-+
-+                      /* flush data cache before initializing the descriptor and starting DMA */
-+#if 0
-+/* JKM -- currently running with cache turned off */
-+                      DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
-+#endif
-+
-+              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail);
-+              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE;
-+              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY;
-+
-+                  // flush data cache before initializing the descriptor and starting DMA
-+//                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
-+          }
-+        }
-+
-+      }
-+
-+      /* Tell the DMA to continue the reception */
-+      MCD_continDma(fp->fecpriv_fec_rx_channel);
-+
-+      fp->fecpriv_rxflag = 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_interrupt_handler
-+*
-+* DESCRIPTION: This function is called when some special errors occur
-+*
-+*************************************************************************/
-+irqreturn_t fec_interrupt_handler(int irq, void *dev_id)
-+{
-+
-+      struct net_device *dev = (struct net_device *)dev_id;
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+      unsigned long events;
-+
-+      /* Read and clear the events */
-+      events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
-+
-+      if (events & FEC_EIR_HBERR) {
-+              fp->fecpriv_stat.tx_heartbeat_errors++;
-+              FEC_EIR(base_addr) = FEC_EIR_HBERR;
-+      }
-+
-+      /* receive/transmit FIFO error */
-+      if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) {
-+              /* kill DMA receive channel */
-+              MCD_killDma (fp->fecpriv_fec_rx_channel);
-+
-+              /* kill running transmission by DMA */
-+              MCD_killDma (fp->fecpriv_fec_tx_channel);
-+
-+              /* Reset FIFOs */
-+              FEC_FECFRST(base_addr) |= FEC_SW_RST;
-+              FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
-+
-+              /* reset receive FIFO status register */
-+              FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE |
-+                                       FEC_FECRFSR_RXW |
-+                                       FEC_FECRFSR_UF;
-+
-+              /* reset transmit FIFO status register */
-+              FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE |
-+                                       FEC_FECTFSR_TXW |
-+                                       FEC_FECTFSR_UF |
-+                                       FEC_FECTFSR_OF;
-+
-+              /* reset RFERR and XFERR event */
-+              FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR;
-+
-+              /* stop queue */
-+              netif_stop_queue(dev);
-+      
-+              /* execute reinitialization as tasklet */
-+              tasklet_schedule(&fp->fecpriv_tasklet_reinit);
-+
-+              fp->fecpriv_stat.rx_dropped++;
-+      }
-+
-+      /* transmit FIFO underrun */
-+      if ((events & FEC_EIR_XFUN) != 0) {
-+              /* reset XFUN event */
-+              FEC_EIR(base_addr) = FEC_EIR_XFUN;
-+              fp->fecpriv_stat.tx_aborted_errors++;
-+      }
-+
-+      /* late collision */
-+      if ((events & FEC_EIR_LC) != 0) {
-+              /* reset LC event */
-+              FEC_EIR(base_addr) = FEC_EIR_LC;
-+              fp->fecpriv_stat.tx_aborted_errors++;
-+      }
-+
-+      /* collision retry limit */
-+      if ((events & FEC_EIR_RL) != 0) {
-+              /* reset RL event */
-+              FEC_EIR(base_addr) = FEC_EIR_RL;
-+              fp->fecpriv_stat.tx_aborted_errors++;
-+      }
-+      return 0;
-+}
-+
-+/************************************************************************
-+* NAME: fec_interrupt_reinit
-+*
-+* DESCRIPTION: This function is called from interrupt handler
-+*              when controller must be reinitialized.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_reinit(unsigned long data)
-+{
-+      int i;
-+      struct net_device *dev = (struct net_device*)data;
-+      struct fec_priv *fp = netdev_priv(dev);
-+      unsigned long base_addr = (unsigned long) dev->base_addr;
-+
-+      /* Initialize reception descriptors and start DMA for the reception */
-+      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
-+              if (!fp->askb_rx[i]) {
-+                      fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA);
-+                      if (!fp->askb_rx[i]) {
-+                              fp->fecpriv_rxdesc[i].dataPointer = 0;
-+                              fp->fecpriv_rxdesc[i].statCtrl = 0;
-+                              fp->fecpriv_rxdesc[i].length = 0;
-+                              continue;
-+                      }
-+                      fp->askb_rx[i]->dev = dev;
-+                      skb_reserve(fp->askb_rx[i], 16);
-+              }
-+              fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
-+              fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
-+              fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
-+      }
-+
-+      fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
-+      fp->fecpriv_current_rx = 0;
-+
-+      /* restart frame transmission */
-+      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
-+              if (fp->fecpriv_txbuf[i]) {
-+                      kfree(fp->fecpriv_txbuf[i]);
-+                      fp->fecpriv_txbuf[i] = NULL;
-+                      fp->fecpriv_stat.tx_dropped++;
-+              }
-+              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
-+      }
-+      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
-+      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
-+
-+      /* flush entire data cache before restarting the DMA */
-+#if 0
-+/* JKM -- currently running with cache turned off */
-+      DcacheFlushInvalidate();
-+#endif
-+      
-+      /* restart DMA from beginning */
-+      MCD_startDma(fp->fecpriv_fec_rx_channel,
-+                   (char *) fp->fecpriv_rxdesc, 0,
-+                   (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
-+                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
-+                   FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
-+                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
-+
-+      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
-+                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
-+                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
-+                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
-+                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
-+
-+      /* Enable FEC */
-+      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
-+
-+      netif_wake_queue(dev);
-+}
-+
-+/************************************************************************
-+* NAME: fec_interrupt_tx_handler_fec0
-+*
-+* DESCRIPTION: This is the DMA interrupt handler using  for FEC0
-+*              transmission.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_tx_handler_fec0(void)
-+{
-+      fec_interrupt_fec_tx_handler(fec_dev[0]);
-+}
-+
-+#ifdef   FEC_2
-+/************************************************************************
-+* NAME: fec_interrupt_tx_handler_fec1
-+*
-+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
-+*              transmission.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_tx_handler_fec1(void)
-+{
-+      fec_interrupt_fec_tx_handler(fec_dev[1]);
-+}
-+#endif
-+
-+/************************************************************************
-+* NAME: fec_interrupt_rx_handler_fec0
-+*
-+* DESCRIPTION: This is the DMA interrupt handler using for the FEC0
-+*              reception.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_rx_handler_fec0(void)
-+{
-+      fec_interrupt_fec_rx_handler(fec_dev[0]);
-+}
-+
-+#ifdef   FEC_2
-+/************************************************************************
-+* NAME: fec_interrupt_rx_handler_fec1
-+*
-+* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
-+*              reception.
-+*
-+*************************************************************************/
-+void fec_interrupt_fec_rx_handler_fec1(void)
-+{
-+      fec_interrupt_fec_rx_handler(fec_dev[1]);
-+}
-+
-+#endif
-+
-+#ifndef MODULE
-+/************************************************************************
-+* NAME: fec_mac_setup0
-+*
-+* DESCRIPTION: This function sets the MAC address of FEC0 from command line
-+*
-+*************************************************************************/
-+int __init fec_mac_setup0(char *s)
-+{
-+      if(!s || !*s)
-+              return 1;
-+
-+      if(fec_str_to_mac(s, fec_mac_addr_fec0))
-+              printk("The MAC address of FEC0 cannot be set from command line");
-+      return 1;
-+}
-+
-+#ifdef   FEC_2
-+
-+/************************************************************************
-+* NAME: fec_mac_setup1
-+*
-+* DESCRIPTION: This function sets the MAC address of FEC1 from command line
-+*
-+*************************************************************************/
-+int __init fec_mac_setup1(char *s)
-+{
-+      if(!s || !*s)
-+              return 1;
-+
-+      if(fec_str_to_mac(s, fec_mac_addr_fec1))
-+              printk("The MAC address of FEC1 cannot be set from command line");
-+      return 1;
-+}
-+#endif
-+
-+/************************************************************************
-+* NAME: fec_str_to_mac
-+*
-+* DESCRIPTION: This function interprets the character string into MAC addr
-+*
-+*************************************************************************/
-+int fec_str_to_mac( char *str_mac, unsigned char* addr)
-+{
-+      unsigned long val;
-+      char c;
-+      unsigned long octet[6], *octetptr = octet;
-+      int i;
-+
-+again:
-+      val = 0;
-+      while ((c = *str_mac) != '\0') {
-+              if ((c>='0')&&(c<='9')) {
-+                      val = (val * 16) + (c - '0');
-+                      str_mac++;
-+                      continue;
-+              }
-+              else if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) {
-+                      val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A'));
-+                      str_mac++;
-+                      continue;
-+              }
-+              break;
-+      }
-+      if (*str_mac == ':') {
-+              *octetptr++ = val, str_mac++;
-+              if (octetptr >= octet + 6)
-+                      return 1;
-+              goto again;
-+      }
-+
-+      /* Check for trailing characters */
-+      if (*str_mac && !(*str_mac==' '))
-+              return 1;
-+
-+      *octetptr++ = val;
-+
-+      if ((octetptr - octet)==6) {
-+              for(i=0;i<=6;i++)
-+                      addr[i]=octet[i];
-+      }
-+      else
-+              return 1;
-+
-+      return 0;
-+}
-+#endif
---- /dev/null
-+++ b/drivers/net/fec/fec.h
-@@ -0,0 +1,162 @@
-+
-+#define   FEC_BASE_ADDR_FEC0                ((unsigned int)MCF_MBAR + 0x9000)
-+#define   FEC_BASE_ADDR_FEC1                ((unsigned int)MCF_MBAR + 0x9800)
-+
-+//#define   FEC_INTC_IMRH_INT_MASK38          (0x00000040)
-+//#define   FEC_INTC_IMRH_INT_MASK39          (0x00000080)
-+//#define   FEC_INTC_ICR_FEC0                 (0x30)
-+//#define   FEC_INTC_ICR_FEC1                 (0x31)
-+#define   FEC_FECI2CIRQ                     (0xFFC0)
-+#define   FEC_GPIO_PAR_FECI2CIRQ            *(volatile unsigned short*)((unsigned int)MCF_MBAR + 0xA44)
-+//#define   FEC_INTC_ICRn(x)                  (*(volatile unsigned char *)(void*)((unsigned int) MCF_MBAR + 0x000740+((x)*0x001)))
-+//#define   FEC_INTC_IMRH                     *(volatile unsigned int*)((unsigned int)MCF_MBAR + 0x000708)
-+
-+#define   FEC_ECR_DISABLE                   (0x00000000)
-+
-+#define   FEC_ECR(x)                        *(volatile unsigned int *)(x + 0x024)
-+#define   FEC_EIR(x)                        *(volatile unsigned int*)(x + 0x004)
-+#define   FEC_PALR(x)                       *(volatile unsigned int*)(x + 0x0E4)
-+#define   FEC_PAUR(x)                       *(volatile unsigned int*)(x + 0x0E8)
-+#define   FEC_IALR(x)                       *(volatile unsigned int*)(x + 0x11C)
-+#define   FEC_IAUR(x)                       *(volatile unsigned int*)(x + 0x118)
-+#define   FEC_GALR(x)                       *(volatile unsigned int*)(x + 0x124)
-+#define   FEC_GAUR(x)                       *(volatile unsigned int*)(x + 0x120)
-+#define   FEC_RCR(x)                        *(volatile unsigned int*)(x + 0x084)
-+#define   FEC_FECRFCR(x)                    *(volatile unsigned int*)(x + 0x18C)
-+#define   FEC_FECRFAR(x)                    *(volatile unsigned int*)(x + 0x198)
-+#define   FEC_FECTFCR(x)                    *(volatile unsigned int*)(x + 0x1AC)
-+#define   FEC_FECTFAR(x)                    *(volatile unsigned int*)(x + 0x1B8)
-+#define   FEC_FECTFWR(x)                    *(volatile unsigned int*)(x + 0x144)
-+#define   FEC_CTCWR(x)                      *(volatile unsigned int*)(x + 0x1C8)
-+#define   FEC_EIMR(x)                       *(volatile unsigned int*)(x + 0x008)
-+#define   FEC_TCR(x)                        *(volatile unsigned int*)(x + 0x0C4)
-+#define   FEC_MIBC(x)                       *(volatile unsigned int*)(x + 0x064)
-+#define   FEC_MSCR(x)                       *(volatile unsigned int*)(x + 0x044)
-+#define   FEC_FECTFDR(x)                    *(volatile unsigned int*)(x + 0x1A4)
-+#define   FEC_FECRFDR(x)                    *(volatile unsigned int*)(x + 0x184)
-+#define   FEC_FECTFSR(x)                    *(volatile unsigned int*)(x + 0x1A8)
-+#define   FEC_FECRFSR(x)                                      *(volatile unsigned int*)(x + 0x188)
-+#define   FECSTAT_RMON_R_PACKETS(x)         *(volatile unsigned int*)(x + 0x284)
-+#define   FECSTAT_RMON_T_PACKETS(x)         *(volatile unsigned int*)(x + 0x204)
-+#define   FECSTAT_RMON_R_OCTETS(x)          *(volatile unsigned int*)(x + 0x2C4)
-+#define   FECSTAT_RMON_T_OCTETS(x)          *(volatile unsigned int*)(x + 0x244)
-+#define   FECSTAT_RMON_R_UNDERSIZE(x)       *(volatile unsigned int*)(x + 0x294)
-+#define   FECSTAT_RMON_R_OVERSIZE(x)        *(volatile unsigned int*)(x + 0x298)
-+#define   FECSTAT_RMON_R_FRAG(x)            *(volatile unsigned int*)(x + 0x29C)
-+#define   FECSTAT_RMON_R_JAB(x)             *(volatile unsigned int*)(x + 0x2A0)
-+#define   FECSTAT_RMON_R_MC_PKT(x)          *(volatile unsigned int*)(x + 0x28C)
-+#define   FECSTAT_RMON_T_COL(x)             *(volatile unsigned int*)(x + 0x224)
-+#define   FECSTAT_IEEE_R_ALIGN(x)           *(volatile unsigned int*)(x + 0x2D4)
-+#define   FECSTAT_IEEE_R_CRC(x)             *(volatile unsigned int*)(x + 0x2D0)
-+#define   FECSTAT_IEEE_R_MACERR(x)          *(volatile unsigned int*)(x + 0x2D8)
-+#define   FECSTAT_IEEE_T_CSERR(x)           *(volatile unsigned int*)(x + 0x268)
-+#define   FECSTAT_IEEE_T_MACERR(x)          *(volatile unsigned int*)(x + 0x264)
-+#define   FECSTAT_IEEE_T_LCOL(x)            *(volatile unsigned int*)(x + 0x25C)
-+#define   FECSTAT_IEEE_R_OCTETS_OK(x)       *(volatile unsigned int*)(x + 0x2E0)
-+#define   FECSTAT_IEEE_T_OCTETS_OK(x)       *(volatile unsigned int*)(x + 0x274)
-+#define   FECSTAT_IEEE_R_DROP(x)            *(volatile unsigned int*)(x + 0x2C8)
-+#define   FECSTAT_IEEE_T_DROP(x)            *(volatile unsigned int*)(x + 0x248)
-+#define   FECSTAT_IEEE_R_FRAME_OK(x)        *(volatile unsigned int*)(x + 0x2CC)
-+#define   FECSTAT_IEEE_T_FRAME_OK(x)        *(volatile unsigned int*)(x + 0x24C)
-+#define   FEC_MMFR(x)                       *(volatile unsigned int*)(x + 0x040)
-+#define   FEC_FECFRST(x)                                      *(volatile unsigned int*)(x + 0x1C4)
-+
-+#define   FEC_MAX_FRM_SIZE                  (1518)
-+#define   FEC_MAXBUF_SIZE                   (1520)
-+
-+// Register values
-+#define   FEC_ECR_RESET                     (0x00000001)
-+#define   FEC_EIR_CLEAR                     (0xFFFFFFFF)
-+#define   FEC_EIR_RL                        (0x00100000)
-+#define   FEC_EIR_HBERR                     (0x80000000)
-+#define   FEC_EIR_BABR                                                (0x40000000)   // babbling receive error
-+#define   FEC_EIR_BABT                                                (0x20000000)   // babbling transmit error
-+#define   FEC_EIR_TXF                         (0x08000000)   // transmit frame interrupt
-+#define   FEC_EIR_MII                                         (0x00800000)   // MII interrupt
-+#define   FEC_EIR_LC                                          (0x00200000)   // late collision
-+#define   FEC_EIR_XFUN                                                (0x00080000)   // transmit FIFO underrun
-+#define   FEC_EIR_XFERR                                               (0x00040000)   // transmit FIFO error
-+#define   FEC_EIR_RFERR                                               (0x00020000)   // receive FIFO error
-+#define   FEC_RCR_MAX_FRM_SIZE              (FEC_MAX_FRM_SIZE << 16)
-+#define   FEC_RCR_MII                       (0x00000004)
-+#define   FEC_FECRFCR_FAE                                     (0x00400000)   // frame accept error
-+#define   FEC_FECRFCR_RXW                                     (0x00200000)   // receive wait condition
-+#define   FEC_FECRFCR_UF                                      (0x00100000)   // receive FIFO underflow
-+#define   FEC_FECRFCR_FRM                   (0x08000000)
-+#define   FEC_FECRFCR_GR                    (0x7 << 24)
-+
-+#define   FEC_EIMR_DISABLE                                    (0x00000000)
-+
-+#define   FEC_FECRFAR_ALARM                 (0x300)
-+#define   FEC_FECTFCR_FRM                   (0x08000000)
-+#define   FEC_FECTFCR_GR                    (0x7 << 24)
-+#define   FEC_FECTFCR_FAE                                     (0x00400000)   // frame accept error
-+#define   FEC_FECTFCR_TXW                                     (0x00040000)   // transmit wait condition
-+#define   FEC_FECTFCR_UF                                      (0x00100000)   // transmit FIFO underflow
-+#define   FEC_FECTFCR_OF                                      (0x00080000)   // transmit FIFO overflow
-+
-+#define   FEC_FECTFAR_ALARM                 (0x100)
-+#define   FEC_FECTFWR_XWMRK                 (0x00000000)
-+
-+#define   FEC_FECTFSR_MSK                   (0xC0B00000)
-+#define   FEC_FECTFSR_TXW                   (0x40000000)   // transmit wait condition
-+#define   FEC_FECTFSR_FAE                   (0x00800000)   // frame accept error
-+#define   FEC_FECTFSR_UF                    (0x00200000)   // transmit FIFO underflow
-+#define   FEC_FECTFSR_OF                    (0x00100000)   // transmit FIFO overflow
-+
-+#define   FEC_FECRFSR_MSK                   (0x80F00000)
-+#define   FEC_FECRFSR_FAE                   (0x00800000)   // frame accept error
-+#define   FEC_FECRFSR_RXW                   (0x00400000)   // receive wait condition
-+#define   FEC_FECRFSR_UF                    (0x00200000)   // receive FIFO underflow
-+
-+#define   FEC_CTCWR_TFCW_CRC                (0x03000000)
-+#define   FEC_TCR_FDEN                      (0x00000004)
-+#define   FEC_TCR_HBC                       (0x00000002)
-+#define   FEC_RCR_DRT                       (0x00000002)
-+#define   FEC_EIMR_MASK                     (FEC_EIR_RL | FEC_EIR_HBERR)
-+#define   FEC_ECR_ETHEREN                   (0x00000002)
-+#define   FEC_FECTFCR_MSK                   (0x00FC0000)
-+#define   FEC_FECRFCR_MSK                   (0x00F80000)
-+#define   FEC_EIR_GRA                       (0x10000000)
-+#define   FEC_TCR_GTS                       (0x00000001)
-+#define   FEC_MIBC_ENABLE                   (0x00000000)
-+#define   FEC_MIB_LEN                       (228)
-+#define   FEC_PHY_ADDR                      (0x01)
-+
-+#define FEC_RX_DMA_PRI                      (6)
-+#define FEC_TX_DMA_PRI                      (6)
-+
-+#define   FEC_TX_BUF_NUMBER                 (8)
-+#define   FEC_RX_BUF_NUMBER                 (64)
-+
-+#define   FEC_TX_INDEX_MASK                 (0x7)
-+#define   FEC_RX_INDEX_MASK                 (0x3f)
-+
-+#define   FEC_RX_DESC_FEC0                  SYS_SRAM_FEC_START
-+#define   FEC_TX_DESC_FEC0                  FEC_RX_DESC_FEC0 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
-+
-+#define   FEC_RX_DESC_FEC1                  SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE/2
-+#define   FEC_TX_DESC_FEC1                  FEC_RX_DESC_FEC1 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
-+
-+#define   FEC_EIR_MII                       (0x00800000)
-+#define   FEC_MMFR_READ                     (0x60020000)
-+#define   FEC_MMFR_WRITE                    (0x50020000)
-+
-+#define   FEC_FLAGS_RX                      (0x00000001)
-+
-+#define   FEC_CRCPOL                        (0xEDB88320)
-+
-+#define   FEC_MII_TIMEOUT                   (2)
-+#define   FEC_GR_TIMEOUT                    (1)
-+#define   FEC_TX_TIMEOUT                    (1)
-+#define   FEC_RX_TIMEOUT                    (1)
-+
-+#define   FEC_SW_RST                        0x2000000
-+#define   FEC_RST_CTL                       0x1000000
-+
-+int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
-+               unsigned int *data);
-+int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
-+                unsigned int data);
-+
-+#define init_transceiver ks8721_init_transceiver
---- /dev/null
-+++ b/drivers/net/fec/Kconfig
-@@ -0,0 +1,25 @@
-+config FEC_548x
-+      tristate "MCF547x/MCF548x Fast Ethernet Controller support"
-+      depends on M547X_8X
-+      help
-+        The MCF547x and MCF548x have a built-in Fast Ethernet Controller.
-+        Saying Y here will include support for this device in the kernel.
-+
-+        To compile this driver as a module, choose M here: the module
-+        will be called fecm.
-+
-+config FEC_548x_AUTO_NEGOTIATION
-+      bool "Enable Auto-Negotiation"
-+      depends on FEC_548x
-+      help
-+        This option enables the FEC to automatically detect the 
-+        half/full duplex mode and the network speed at initialization
-+        If you want this, say Y.
-+
-+config FEC_548x_ENABLE_FEC2
-+      bool "Enable the second FEC"
-+      depends on FEC_548x
-+      help
-+        This enables the second FEC on the 547x/548x. If you want to use
-+        it, say Y.
-+
---- /dev/null
-+++ b/drivers/net/fec/ks8721.c
-@@ -0,0 +1,125 @@
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/ptrace.h>
-+#include <linux/errno.h>
-+#include <linux/ioport.h>
-+#include <linux/slab.h>
-+#include <linux/interrupt.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/spinlock.h>
-+#include <linux/workqueue.h>
-+#include <linux/bitops.h>
-+
-+#if 0
-+#include <linux/config.h>
-+#include <linux/sched.h>
-+#include <linux/errno.h>
-+#include <asm/coldfire.h>
-+#endif
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+
-+#include   "fec.h"
-+#include   "ks8721.h"
-+
-+#ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
-+#define   KS8721_AUTO_NEGOTIATION_ENABLE
-+#endif
-+
-+/************************************************************************
-+* +NAME: ks8721_init_transceiver
-+*
-+* DESCRIPTION: This function initializes the transceiver
-+*
-+* RETURNS: If no error occurs, this function returns zero.
-+*          Otherwise, it returns 1
-+*************************************************************************/
-+
-+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex)
-+{
-+
-+      int data;
-+      unsigned long time;
-+      int flag = 1;
-+
-+      int result;
-+
-+      // Set the frequency of MII
-+      FEC_MSCR(base_addr) = FEC_MII_SPEED;
-+
-+      // Reset
-+      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_RESET)))
-+              return result;
-+
-+      // Read back    
-+      if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, &data)) != 0)
-+              return result;
-+
-+      // If reset bit is set, return
-+      if (data & KS8721_CTRL_RESET)
-+              return -ETIME;
-+
-+#ifdef KS8721_AUTO_NEGOTIATION_ENABLE
-+
-+      // Disable  the auto-negotiation 
-+      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, 0)) != 0)
-+              return result;
-+
-+      // Set the auto-negotiation advertisement register 
-+      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_ANADV, KS8721_ANADV_ADV_ALL)) != 0)
-+              return result;
-+
-+      // Enable the auto-negotiation
-+      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_AN_ENABLE)) != 0)
-+              return result;
-+
-+      // Read PHY status register
-+      if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
-+              return result;
-+      // Set the current time
-+      time = jiffies;
-+
-+      // Wait for the auto-negotiation completion
-+      while (!(data & KS8721_STAT_ANCOMPLETE))
-+      {
-+
-+              if (jiffies - time > KS8721_TIMEOUT * HZ)
-+              {
-+                      flag = 0;
-+                      break;
-+              }
-+
-+              schedule();
-+
-+              // Read PHY status register
-+              if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
-+                      return result;
-+      }
-+
-+      if (flag)
-+      {
-+              // Set the duplex flag     
-+              if (data & KS8721_STAT_FDUPLEX)
-+                      *fduplex = 1;
-+              else
-+                      *fduplex = 0;
-+
-+              return 0;
-+      }
-+
-+#endif
-+
-+      // Set the default mode (Full duplex, 100 Mbps) 
-+      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_DEFAULT_MODE)) != 0)
-+              return result;
-+      *fduplex = KS8721_CTRL_DEFAULT_MODE & 0x100;
-+
-+      return 0;
-+
-+}
---- /dev/null
-+++ b/drivers/net/fec/ks8721.h
-@@ -0,0 +1,21 @@
-+
-+#define   FEC_MII_SPEED              (((unsigned int)(MCF_BUSCLK / 5000000)) << 1)
-+
-+// Numbers of the transceiver registers 
-+#define   KS8721_CTRL                0x00
-+#define   KS8721_ANADV               0x04
-+#define   KS8721_STAT                0x01
-+
-+// Register values
-+#define   KS8721_CTRL_RESET          0x8000
-+#define   KS8721_ANADV_ADV_ALL       0x01E1
-+#define   KS8721_CTRL_AN_ENABLE      0x1280
-+#define   KS8721_CTRL_DEFAULT_MODE   0x2100
-+#define   KS8721_STAT_ANCOMPLETE     0x0020
-+#define   KS8721_STAT_LINK           0x0004
-+#define   KS8721_STAT_FDUPLEX        0x5000
-+
-+// Timeout for the auto-negotiation mode
-+#define   KS8721_TIMEOUT             5
-+
-+int ks8721_init_transceiver(unsigned long base_addr, int *fduplex);
---- /dev/null
-+++ b/drivers/net/fec/Makefile
-@@ -0,0 +1,7 @@
-+#
-+# Makefile for the FEC ethernet driver
-+#
-+
-+obj-$(CONFIG_FEC_548x) += fecm.o
-+
-+fecm-objs := fec.o ks8721.o
---- a/drivers/net/fec.c
-+++ b/drivers/net/fec.c
-@@ -23,6 +23,9 @@
-  *
-  * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be)
-  * Copyright (c) 2004-2006 Macq Electronique SA.
-+ *
-+ * Coldfire bug fixes and cleanup by Kurt Mahan (kmahan@freescale.com)
-+ * Copyright 2007-2008 Freescale Semiconductor, Inc. All Rights Reserved.
-  */
- #include <linux/module.h>
-@@ -51,7 +54,9 @@
- #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
-     defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
--    defined(CONFIG_M520x) || defined(CONFIG_M532x)
-+    defined(CONFIG_M520x) || defined(CONFIG_M532x) || \
-+    defined(CONFIG_M5445X)
-+
- #include <asm/coldfire.h>
- #include <asm/mcfsim.h>
- #include "fec.h"
-@@ -82,6 +87,11 @@ static unsigned int fec_hw[] = {
-       (MCF_MBAR+0x30000),
- #elif defined(CONFIG_M532x)
-       (MCF_MBAR+0xfc030000),
-+#elif defined(CONFIG_M5445X)
-+      (MCF_MBAR+0xfc030000),
-+#if defined(CONFIG_FEC2)
-+      (MCF_MBAR+0xfc034000),
-+#endif
- #else
-       &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec),
- #endif
-@@ -172,7 +182,7 @@ typedef struct {
-  * account when setting it.
-  */
- #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
--    defined(CONFIG_M520x) || defined(CONFIG_M532x)
-+    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X)
- #define       OPT_FRAME_SIZE  (PKT_MAXBUF_SIZE << 16)
- #else
- #define       OPT_FRAME_SIZE  0
-@@ -213,6 +223,7 @@ struct fec_enet_private {
-       uint    phy_speed;
-       phy_info_t const        *phy;
-       struct work_struct phy_task;
-+      volatile fec_t  *phy_hwp;
-       uint    sequence_done;
-       uint    mii_phy_task_queued;
-@@ -349,7 +360,8 @@ fec_enet_start_xmit(struct sk_buff *skb,
-       if (bdp->cbd_bufaddr & 0x3) {
-               unsigned int index;
-               index = bdp - fep->tx_bd_base;
--              memcpy(fep->tx_bounce[index], (void *) bdp->cbd_bufaddr, bdp->cbd_datlen);
-+              memcpy(fep->tx_bounce[index],
-+                     (void *)skb->data, bdp->cbd_datlen);
-               bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]);
-       }
-@@ -702,7 +714,7 @@ fec_enet_mii(struct net_device *dev)
-       uint            mii_reg;
-       fep = netdev_priv(dev);
--      ep = fep->hwp;
-+      ep = fep->phy_hwp;
-       mii_reg = ep->fec_mii_data;
-       spin_lock(&fep->lock);
-@@ -753,7 +765,7 @@ mii_queue(struct net_device *dev, int re
-                       mii_tail = mip;
-               } else {
-                       mii_head = mii_tail = mip;
--                      fep->hwp->fec_mii_data = regval;
-+                      fep->phy_hwp->fec_mii_data = regval;
-               }
-       } else {
-               retval = 1;
-@@ -1151,8 +1163,7 @@ static phy_info_t const phy_info_ks8721b
- };
- /* ------------------------------------------------------------------------- */
--/* register definitions for the DP83848 */
--
-+/* register definitions for the DP83848 and DP83849 */
- #define MII_DP8384X_PHYSTST    16  /* PHY Status Register */
- static void mii_parse_dp8384x_sr2(uint mii_reg, struct net_device *dev)
-@@ -1186,27 +1197,50 @@ static void mii_parse_dp8384x_sr2(uint m
-               *s |= PHY_STAT_FAULT;
- }
-+static phy_cmd_t const phy_cmd_dp8384x_ack_int[] = {
-+              { mk_mii_end, }
-+      };
-+
-+static phy_cmd_t const phy_cmd_dp8384x_shutdown[] = {
-+              { mk_mii_end, }
-+      };
-+
- static phy_info_t phy_info_dp83848= {
--      0x020005c9,
--      "DP83848",
-+      .id = 0x020005c9,
-+      .name = "DP83848",
--      (const phy_cmd_t []) {  /* config */
-+      .config = (const phy_cmd_t []) {  /* config */
-               { mk_mii_read(MII_REG_CR), mii_parse_cr },
-               { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
-               { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 },
-               { mk_mii_end, }
-       },
--      (const phy_cmd_t []) {  /* startup - enable interrupts */
-+      .startup = (const phy_cmd_t []) {  /* startup - enable interrupts */
-               { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */
-               { mk_mii_read(MII_REG_SR), mii_parse_sr },
-               { mk_mii_end, }
-       },
--      (const phy_cmd_t []) { /* ack_int - never happens, no interrupt */
-+      .ack_int = phy_cmd_dp8384x_ack_int,
-+      .shutdown = phy_cmd_dp8384x_shutdown,
-+};
-+
-+static phy_info_t phy_info_dp83849 = {
-+      .id = 0x020005ca,
-+      .name = "DP83849",
-+
-+      .config = (const phy_cmd_t []) {  /* config */
-+              { mk_mii_read(MII_REG_CR), mii_parse_cr },
-+              { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
-+              { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 },
-               { mk_mii_end, }
-       },
--      (const phy_cmd_t []) {  /* shutdown */
-+      .startup = (const phy_cmd_t []) {  /* startup - enable interrupts */
-+              { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */
-+              { mk_mii_read(MII_REG_SR), mii_parse_sr },
-               { mk_mii_end, }
-       },
-+      .ack_int = phy_cmd_dp8384x_ack_int,
-+      .shutdown = phy_cmd_dp8384x_shutdown,
- };
- /* ------------------------------------------------------------------------- */
-@@ -1218,6 +1252,7 @@ static phy_info_t const * const phy_info
-       &phy_info_am79c874,
-       &phy_info_ks8721bl,
-       &phy_info_dp83848,
-+      &phy_info_dp83849,
-       NULL
- };
-@@ -1799,6 +1834,138 @@ static void __inline__ fec_uncache(unsig
- /* ------------------------------------------------------------------------- */
-+#elif defined(CONFIG_M5445X)
-+/*
-+ * Code specific for M5445X
-+ */
-+
-+static void __inline__ fec_request_intrs(struct net_device *dev)
-+{
-+      struct fec_enet_private *fep;
-+      int b;
-+      static const struct idesc {
-+              char *name;
-+              unsigned short irq;
-+      } *idp, id[] = {
-+          { "fec(TXF)", 36 },
-+          { "fec(TXB)", 37 },
-+          { "fec(TXFIFO)", 38 },
-+          { "fec(TXCR)", 39 },
-+          { "fec(RXF)", 40 },
-+          { "fec(RXB)", 41 },
-+          { "fec(MII)", 42 },
-+          { "fec(LC)", 43 },
-+          { "fec(HBERR)", 44 },
-+          { "fec(GRA)", 45 },
-+          { "fec(EBERR)", 46 },
-+          { "fec(BABT)", 47 },
-+          { "fec(BABR)", 48 },
-+          { NULL },
-+      };
-+
-+      fep = netdev_priv(dev);
-+      b = (fep->index) ? 77 : 64;
-+
-+      /* Setup interrupt handlers. */
-+      for (idp = id; idp->name; idp++) {
-+              if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED,
-+                  idp->name, dev) != 0)
-+                      printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n",
-+                              idp->name, b+idp->irq);
-+      }
-+
-+      if (fep->index) {
-+              /* Configure RMII */
-+              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
-+                      MCF_GPIO_PAR_FEC_FEC1_MASK) |
-+                      MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO;
-+      } else {
-+              /* Configure RMII */
-+              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
-+                      MCF_GPIO_PAR_FEC_FEC0_MASK) |
-+                      MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO;
-+      }
-+
-+      /* Set up gpio outputs for MII lines on FEC0 */
-+      MCF_GPIO_PAR_FECI2C |= (0 |
-+              MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 |
-+              MCF_GPIO_PAR_FECI2C_MDC0_MDC0);
-+}
-+
-+static void __inline__ fec_set_mii(struct net_device *dev,
-+      struct fec_enet_private *fep)
-+{
-+      volatile fec_t *fecp;
-+
-+      fecp = fep->hwp;
-+      fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04;
-+      fecp->fec_x_cntrl = 0x00;
-+
-+      /*
-+       * Set MII speed to 2.5 MHz
-+       */
-+      fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2;
-+      fecp->fec_mii_speed = fep->phy_speed;
-+
-+      fec_restart(dev, 0);
-+}
-+
-+static void __inline__ fec_get_mac(struct net_device *dev)
-+{
-+      struct fec_enet_private *fep = netdev_priv(dev);
-+      volatile fec_t *fecp;
-+      unsigned char *iap, tmpaddr[ETH_ALEN];
-+
-+      fecp = fep->hwp;
-+
-+      if (FEC_FLASHMAC) {
-+              /*
-+               * Get MAC address from FLASH.
-+               * If it is all 1's or 0's, use the default.
-+               */
-+              iap = FEC_FLASHMAC;
-+              if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) &&
-+                  (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0))
-+                      iap = fec_mac_default;
-+              if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) &&
-+                  (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff))
-+                      iap = fec_mac_default;
-+      } else {
-+              *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low;
-+              *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16);
-+              iap = &tmpaddr[0];
-+      }
-+
-+      memcpy(dev->dev_addr, iap, ETH_ALEN);
-+
-+      /* Adjust MAC if using default MAC address */
-+      if (iap == fec_mac_default)
-+              dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] +
-+                      fep->index;
-+}
-+
-+static void __inline__ fec_enable_phy_intr(void)
-+{
-+}
-+
-+static void __inline__ fec_disable_phy_intr(void)
-+{
-+}
-+
-+static void __inline__ fec_phy_ack_intr(void)
-+{
-+}
-+
-+static void __inline__ fec_localhw_setup(void)
-+{
-+}
-+
-+static void __inline__ fec_uncache(unsigned long addr)
-+{
-+}
-+
-+/* ------------------------------------------------------------------------- */
-+
- #else
-@@ -2305,7 +2472,7 @@ fec_set_mac_address(struct net_device *d
- }
--/* Initialize the FEC Ethernet on 860T (or ColdFire 5272).
-+/* Initialize the FEC Ethernet.
-  */
-  /*
-   * XXX:  We need to clean up on failure exits here.
-@@ -2326,7 +2493,7 @@ int __init fec_enet_init(struct net_devi
-       /* Allocate memory for buffer descriptors.
-       */
--      mem_addr = __get_free_page(GFP_KERNEL);
-+      mem_addr = __get_free_page(GFP_DMA);
-       if (mem_addr == 0) {
-               printk("FEC: allocate descriptor memory failed?\n");
-               return -ENOMEM;
-@@ -2339,6 +2506,11 @@ int __init fec_enet_init(struct net_devi
-       fep->index = index;
-       fep->hwp = fecp;
-       fep->netdev = dev;
-+#ifdef CONFIG_FEC_SHARED_PHY
-+      fep->phy_hwp = (volatile fec_t *) fec_hw[index & ~1];
-+#else
-+      fep->phy_hwp = fecp;
-+#endif
-       /* Whack a reset.  We should wait for this.
-       */
-@@ -2375,7 +2547,7 @@ int __init fec_enet_init(struct net_devi
-               /* Allocate a page.
-               */
--              mem_addr = __get_free_page(GFP_KERNEL);
-+              mem_addr = __get_free_page(GFP_DMA);
-               /* XXX: missing check for allocation failure */
-               fec_uncache(mem_addr);
-@@ -2400,7 +2572,7 @@ int __init fec_enet_init(struct net_devi
-       bdp = fep->tx_bd_base;
-       for (i=0, j=FEC_ENET_TX_FRPPG; i<TX_RING_SIZE; i++) {
-               if (j >= FEC_ENET_TX_FRPPG) {
--                      mem_addr = __get_free_page(GFP_KERNEL);
-+                      mem_addr = __get_free_page(GFP_DMA);
-                       j = 1;
-               } else {
-                       mem_addr += FEC_ENET_TX_FRSIZE;
-@@ -2462,7 +2634,11 @@ int __init fec_enet_init(struct net_devi
-        * remainder of the interface.
-        */
-       fep->phy_id_done = 0;
-+#ifndef CONFIG_FEC_SHARED_PHY
-       fep->phy_addr = 0;
-+#else
-+      fep->phy_addr = fep->index;
-+#endif
-       mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy);
-       index++;
---- a/drivers/net/fec.h
-+++ b/drivers/net/fec.h
-@@ -14,7 +14,7 @@
- /****************************************************************************/
- #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
--    defined(CONFIG_M520x) || defined(CONFIG_M532x)
-+    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X)
- /*
-  *    Just figures, Motorola would have to change the offsets for
-  *    registers in the same peripheral device on different models
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -351,6 +351,8 @@ config MACB
- source "drivers/net/arm/Kconfig"
-+source "drivers/net/fec/Kconfig"
-+
- config AX88796
-       tristate "ASIX AX88796 NE2000 clone support"
-       depends on ARM || MIPS || SUPERH
-@@ -1973,7 +1975,7 @@ config 68360_ENET
- config FEC
-       bool "FEC ethernet controller (of ColdFire CPUs)"
--      depends on M523x || M527x || M5272 || M528x || M520x
-+      depends on M523x || M527x || M5272 || M528x || M520x || M5445X
-       help
-         Say Y here if you want to use the built-in 10/100 Fast ethernet
-         controller on some Motorola ColdFire processors.
-@@ -1985,6 +1987,12 @@ config FEC2
-         Say Y here if you want to use the second built-in 10/100 Fast
-         ethernet controller on some Motorola ColdFire processors.
-+config FEC_SHARED_PHY
-+      bool "Shared PHY interface(on some ColdFire designs)"
-+      depends on FEC2
-+      help
-+        Say Y here if both PHYs are controlled via a single channel.
-+
- config FEC_MPC52xx
-       tristate "MPC52xx FEC driver"
-       depends on PPC_MERGE && PPC_MPC52xx && PPC_BESTCOMM_FEC
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -226,6 +226,8 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o
- obj-$(CONFIG_MACB) += macb.o
-+obj-$(CONFIG_FEC_548x) += fec/
-+
- obj-$(CONFIG_ARM) += arm/
- obj-$(CONFIG_DEV_APPLETALK) += appletalk/
- obj-$(CONFIG_TR) += tokenring/
---- a/drivers/pci/access.c
-+++ b/drivers/pci/access.c
-@@ -23,6 +23,7 @@ static DEFINE_SPINLOCK(pci_lock);
- #define PCI_word_BAD (pos & 1)
- #define PCI_dword_BAD (pos & 3)
-+#ifdef NL_ORIGINAL
- #define PCI_OP_READ(size,type,len) \
- int pci_bus_read_config_##size \
-       (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
-@@ -37,7 +38,20 @@ int pci_bus_read_config_##size \
-       spin_unlock_irqrestore(&pci_lock, flags);                       \
-       return res;                                                     \
- }
--
-+#else /* NL_ORIGINAL */
-+#define PCI_OP_READ(size,type,len) \
-+int pci_bus_read_config_##size \
-+        (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
-+{                                                                       \
-+        int res;                                                        \
-+        unsigned long flags;                                            \
-+        if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
-+        spin_lock_irqsave(&pci_lock, flags);                            \
-+        res = bus->ops->read(bus, devfn, pos, len, (u32 *)value);       \
-+        spin_unlock_irqrestore(&pci_lock, flags);                       \
-+        return res;                                                     \
-+}
-+#endif /* NL_ORIGINAL */
- #define PCI_OP_WRITE(size,type,len) \
- int pci_bus_write_config_##size \
-       (struct pci_bus *bus, unsigned int devfn, int pos, type value)  \
---- a/drivers/pci/Makefile
-+++ b/drivers/pci/Makefile
-@@ -39,6 +39,7 @@ obj-$(CONFIG_PPC) += setup-bus.o
- obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o
- obj-$(CONFIG_X86_VISWS) += setup-irq.o
- obj-$(CONFIG_MN10300) += setup-bus.o
-+obj-$(CONFIG_M54455) += setup-bus.o setup-irq.o
- #
- # ACPI Related PCI FW Functions
---- a/drivers/rtc/rtc-rs5c372.c
-+++ b/drivers/rtc/rtc-rs5c372.c
-@@ -15,7 +15,6 @@
- #define DRV_VERSION "0.5"
--
- /*
-  * Ricoh has a family of I2C based RTCs, which differ only slightly from
-  * each other.  Differences center on pinout (e.g. how many interrupts,
-@@ -60,6 +59,15 @@
- /* to read (style 1) or write registers starting at R */
- #define RS5C_ADDR(R)          (((R) << 4) | 0)
-+#ifdef CONFIG_M547X_8X
-+#define DRV_NAME "rv5c387a"
-+/* i2c configuration */
-+#define RV5C387_I2C_ADDR 0x32
-+static unsigned short normal_i2c[] = {
-+      RV5C387_I2C_ADDR, I2C_CLIENT_END
-+};
-+I2C_CLIENT_INSMOD; /* defines addr_data */
-+#endif
- enum rtc_type {
-       rtc_undef = 0,
-@@ -506,14 +514,14 @@ static int rs5c372_probe(struct i2c_clie
-               err = -ENODEV;
-               goto exit;
-       }
--
--      if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
-+      rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL);
-+      if (!rs5c372) {
-               err = -ENOMEM;
-               goto exit;
-       }
-       /* we read registers 0x0f then 0x00-0x0f; skip the first one */
--      rs5c372->regs=&rs5c372->buf[1];
-+      rs5c372->regs = &rs5c372->buf[1];
-       rs5c372->client = client;
-       i2c_set_clientdata(client, rs5c372);
-@@ -605,7 +613,7 @@ static int rs5c372_probe(struct i2c_clie
-                       case rtc_rv5c386:       s = "rv5c386"; break;
-                       case rtc_rv5c387a:      s = "rv5c387a"; break;
-                       default:                s = "chip"; break;
--                      }; s;}),
-+                      }; s; }),
-                       rs5c372->time24 ? "24hr" : "am/pm"
-                       );
-@@ -645,12 +653,61 @@ static int rs5c372_remove(struct i2c_cli
-       return 0;
- }
-+#ifdef CONFIG_M547X_8X
-+static int rv5c387_probe(struct i2c_adapter *adapter, int addr, int kind)
-+{
-+      int rc = 0;
-+      struct i2c_client *new_client = NULL;
-+
-+      if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
-+              rc = -ENODEV;
-+              printk(KERN_DEBUG "%s i2c_check_functionality\n", __FUNCTION__);
-+              goto failout;
-+      }
-+
-+      new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
-+      if (new_client == NULL) {
-+              rc = -ENOMEM;
-+              printk(KERN_DEBUG "%s kzalloc new_client\n", __FUNCTION__);
-+              goto failout;
-+      }
-+
-+      new_client->addr = addr;
-+      new_client->adapter = adapter;
-+      new_client->driver = &rs5c372_driver;
-+      new_client->flags = 0;
-+      strcpy(new_client->name, DRV_NAME);
-+
-+      rc = i2c_attach_client(new_client);
-+      if (rc < 0) {
-+              printk(KERN_DEBUG "%s i2c_attach_client\n", __FUNCTION__);
-+              goto failout;
-+      }
-+
-+      rs5c372_probe(new_client);
-+      return 0;
-+failout:
-+      kfree(new_client);
-+      return rc;
-+}
-+
-+static int
-+rv5c387_attach_adapter(struct i2c_adapter *adapter)
-+{
-+      return i2c_probe(adapter, &addr_data, rv5c387_probe);
-+}
-+#endif
-+
- static struct i2c_driver rs5c372_driver = {
-       .driver         = {
-               .name   = "rtc-rs5c372",
-       },
-+#ifdef CONFIG_M547X_8X
-+      .attach_adapter = &rv5c387_attach_adapter,
-+#else
-       .probe          = rs5c372_probe,
-       .remove         = rs5c372_remove,
-+#endif
- };
- static __init int rs5c372_init(void)
---- a/drivers/serial/Kconfig
-+++ b/drivers/serial/Kconfig
-@@ -979,6 +979,12 @@ config SERIAL_COLDFIRE
-         This driver supports the built-in serial ports of the Motorola ColdFire
-         family of CPUs.
-+config SERIAL_COLDFIRE_IRDA
-+      bool "ColdFire IRDA support"
-+      depends on SERIAL_COLDFIRE
-+      help
-+        This driver supports IRDA on the Motorola ColdFire.
-+
- config SERIAL_MCF
-       bool "Coldfire serial support (new style driver)"
-       depends on COLDFIRE
---- a/drivers/serial/mcfserial.c
-+++ b/drivers/serial/mcfserial.c
-@@ -45,7 +45,14 @@
- #include <asm/coldfire.h>
- #include <asm/mcfsim.h>
- #include <asm/mcfuart.h>
-+#if defined(CONFIG_M547X_8X)
-+#include <asm/m5485sim.h>
-+#include <asm/m5485psc.h>
-+#include <asm/m5485gpio.h>
-+#endif
-+#ifdef CONFIG_NETtel
- #include <asm/nettel.h>
-+#endif
- #include <asm/uaccess.h>
- #include "mcfserial.h"
-@@ -61,7 +68,8 @@ struct timer_list mcfrs_timer_struct;
- #define       CONSOLE_BAUD_RATE       38400
- #define       DEFAULT_CBAUD           B38400
- #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \
--      defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO)
-+      defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \
-+      defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
- #define CONSOLE_BAUD_RATE     115200
- #define DEFAULT_CBAUD         B115200
- #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \
-@@ -94,12 +102,17 @@ static struct tty_driver *mcfrs_serial_d
- #undef SERIAL_DEBUG_FLOW
- #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
--    defined(CONFIG_M520x) || defined(CONFIG_M532x)
-+    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) || \
-+    defined(CONFIG_M547X_8X)
- #define       IRQBASE (MCFINT_VECBASE+MCFINT_UART0)
- #else
- #define       IRQBASE 73
- #endif
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+#define SERIAL_IRDA_LINE (2)
-+#endif
-+
- /*
-  *    Configuration table, UARTs to look for at startup.
-  */
-@@ -114,7 +127,11 @@ static struct mcf_serial mcfrs_table[] =
-       {  /* ttyS1 */
-               .magic = 0,
-               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2),
-+#if defined(CONFIG_M547X_8X)
-+              .irq = IRQBASE-1,
-+#else
-               .irq = IRQBASE+1,
-+#endif
-               .flags = ASYNC_BOOT_AUTOCONF,
-       },
- #endif
-@@ -122,7 +139,11 @@ static struct mcf_serial mcfrs_table[] =
-       {  /* ttyS2 */
-               .magic = 0,
-               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE3),
-+#if defined(CONFIG_M547X_8X)
-+              .irq = IRQBASE-2,
-+#else
-               .irq = IRQBASE+2,
-+#endif
-               .flags = ASYNC_BOOT_AUTOCONF,
-       },
- #endif
-@@ -130,7 +151,11 @@ static struct mcf_serial mcfrs_table[] =
-       {  /* ttyS3 */
-               .magic = 0,
-               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE4),
-+#if defined(CONFIG_M547X_8X)
-+              .irq = IRQBASE-3,
-+#else
-               .irq = IRQBASE+3,
-+#endif
-               .flags = ASYNC_BOOT_AUTOCONF,
-       },
- #endif
-@@ -372,6 +397,9 @@ static inline void receive_chars(struct 
- static inline void transmit_chars(struct mcf_serial *info)
- {
-       volatile unsigned char  *uartp;
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      int i;
-+#endif
-       uartp = info->addr;
-@@ -383,13 +411,36 @@ static inline void transmit_chars(struct
-       }
-       if ((info->xmit_cnt <= 0) || info->tty->stopped) {
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+              if (info->line == SERIAL_IRDA_LINE) {
-+                      /* Enable receiver for IRDA */
-+                      uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;
-+                      /* reset RX */
-+                      uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE | MCFUART_UCR_RXENABLE;
-+              }
-+#endif
-               info->imr &= ~MCFUART_UIR_TXREADY;
-               uartp[MCFUART_UIMR] = info->imr;
-               return;
-       }
-       while (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) {
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+              if (info->line == SERIAL_IRDA_LINE) {
-+                      while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY));
-+                      i = 0;
-+                      /* delay for settle */
-+#if defined(CONFIG_M548X)
-+                      udelay(1);
-+#elif defined(CONFIG_M547X)
-+                      udelay(2);
-+#else
-+                      while (i++ < 25000) udelay(1);
-+#endif
-+              }
-+#endif
-               uartp[MCFUART_UTB] = info->xmit_buf[info->xmit_tail++];
-+
-               info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
-               info->stats.tx++;
-               if (--info->xmit_cnt <= 0)
-@@ -409,7 +460,12 @@ irqreturn_t mcfrs_interrupt(int irq, voi
-       struct mcf_serial       *info;
-       unsigned char           isr;
-+/* JKM -- revisit! IRQ compute */
-+#if defined(CONFIG_M547X_8X)
-+      info = &mcfrs_table[(IRQBASE - irq)];
-+#else
-       info = &mcfrs_table[(irq - IRQBASE)];
-+#endif
-       isr = info->addr[MCFUART_UISR] & info->imr;
-       if (isr & MCFUART_UIR_RXREADY)
-@@ -541,6 +597,28 @@ static int startup(struct mcf_serial * i
-        */
-       mcfrs_change_speed(info);
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      if (info->line == SERIAL_IRDA_LINE) {
-+              /* Put PSC in IrDA mode */
-+              MCF_PSC_SICR(info->line) = MCF_PSC_SICR_SIM_SIR;
-+
-+              /* Set pulse width to 1.6 uS */
-+              MCF_PSC_IRSDR(info->line) = (uint8_t)
-+                                          (16 * (CONFIG_MCFCLK / 10000000));
-+              MCF_PSC_IRCR1(info->line) = MCF_PSC_IRCR1_SPUL;
-+              MCF_PSC_IRCR2(info->line) = 0;
-+
-+              /* Enable RTS to send */
-+              MCF_PSC_OPSET(info->line) = MCF_PSC_OPSET_RTS;
-+
-+              /* Setup FIFO Alarms */
-+              MCF_PSC_RFAR(info->line) = MCF_PSC_RFAR_ALARM(248);
-+              MCF_PSC_TFAR(info->line) = MCF_PSC_TFAR_ALARM(248);
-+
-+              MCF_PSC_RFCR(info->line) = MCF_PSC_RFCR_FRMEN | MCF_PSC_RFCR_GR(4);
-+              MCF_PSC_TFCR(info->line) = MCF_PSC_TFCR_FRMEN | MCF_PSC_RFCR_GR(4);
-+      }
-+#endif
-       /*
-        * Lastly enable the UART transmitter and receiver, and
-        * interrupt enables.
-@@ -562,10 +640,20 @@ static void shutdown(struct mcf_serial *
- {
-       volatile unsigned char  *uartp;
-       unsigned long           flags;
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      unsigned long           delay_counter = 0;
-+#endif
-       if (!(info->flags & ASYNC_INITIALIZED))
-               return;
--
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      uartp = (volatile unsigned char *) info->addr;
-+      while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)) {
-+              if(delay_counter++ > 25000)
-+                      break;
-+              udelay(10);
-+      }
-+#endif
- #ifdef SERIAL_DEBUG_OPEN
-       printk("Shutting down serial port %d (irq %d)....\n", info->line,
-              info->irq);
-@@ -794,10 +882,19 @@ static int mcfrs_write(struct tty_struct
-       local_irq_disable();
-       uartp = info->addr;
-+
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      if (info->line == SERIAL_IRDA_LINE) {
-+              /* Disable IRDA receiver*/
-+              uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;    /* reset RX */
-+              uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX;    /* reset TX */
-+
-+              uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE;
-+      }
-+#endif
-       info->imr |= MCFUART_UIR_TXREADY;
-       uartp[MCFUART_UIMR] = info->imr;
-       local_irq_restore(flags);
--
-       return total;
- }
-@@ -858,9 +955,21 @@ static void mcfrs_throttle(struct tty_st
-       if (serial_paranoia_check(info, tty->name, "mcfrs_throttle"))
-               return;
--      
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      if (I_IXOFF(tty)) {
-+              /* Force STOP_CHAR (xoff) out */
-+              volatile unsigned char  *uartp;
-+              unsigned long           flags;
-+              uartp = (volatile unsigned char *) info->addr;
-+              local_irq_save(flags);
-+              info->imr |= MCFUART_UIR_TXREADY;
-+              uartp[MCFUART_UIMR] = info->imr;
-+              local_irq_restore(flags);
-+      }
-+#else
-       if (I_IXOFF(tty))
-               info->x_char = STOP_CHAR(tty);
-+#endif
-       /* Turn off RTS line (do this atomic) */
- }
-@@ -881,8 +990,22 @@ static void mcfrs_unthrottle(struct tty_
-       if (I_IXOFF(tty)) {
-               if (info->x_char)
-                       info->x_char = 0;
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+              else {
-+                      /* Force START_CHAR (xon) out */
-+                      volatile unsigned char  *uartp;
-+                      unsigned long           flags;
-+                      info->x_char = START_CHAR(tty);
-+                      uartp = (volatile unsigned char *) info->addr;
-+                      local_irq_save(flags);
-+                      info->imr |= MCFUART_UIR_TXREADY;
-+                      uartp[MCFUART_UIMR] = info->imr;
-+                      local_irq_restore(flags);
-+              }
-+#else
-               else
-                       info->x_char = START_CHAR(tty);
-+#endif
-       }
-       /* Assert RTS line (do this atomic) */
-@@ -1130,12 +1253,17 @@ static int mcfrs_ioctl(struct tty_struct
- static void mcfrs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
- {
-       struct mcf_serial *info = (struct mcf_serial *)tty->driver_data;
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      int i = 0;      /* hush GCC */
-+#endif
-       if (tty->termios->c_cflag == old_termios->c_cflag)
-               return;
-+#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
-+      while (i++ < 35000) udelay(1);
-+#endif
-       mcfrs_change_speed(info);
--
-       if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
-               tty->hw_stopped = 0;
-@@ -1604,6 +1732,36 @@ static void mcfrs_irqinit(struct mcf_ser
-               /* GPIOs also must be initalized, depends on board */
-               break;
-       }
-+#elif defined(CONFIG_M5445X)
-+      volatile unsigned char *uartp;
-+      uartp = info->addr;
-+      switch (info->line) {
-+      case 0:
-+              MCF_GPIO_PAR_UART |= 0x000F;
-+              break;
-+      case 1:
-+              MCF_GPIO_PAR_UART |= 0x0FF0;
-+              break;
-+      case 2:
-+              /* GPIOs also must be initalized, depends on board */
-+              break;
-+      }
-+#elif defined(CONFIG_M547X_8X)
-+      volatile unsigned char  *uartp;
-+      uartp = (volatile unsigned char *)info->addr;
-+
-+      if (info->line > 3) {
-+              printk("SERIAL: don't know how to handle UART %d interrupt?\n",
-+                      info->line);
-+              return;
-+      }
-+
-+      /* Set GPIO port register to enable PSC(port) signals */
-+      MCF_PAR_PSCn(info->line) = (0
-+              | MCF_PAR_PSC_TXD
-+              | MCF_PAR_PSC_RXD);
-+
-+      MCF_ICR(info->irq - 64) = ILP_PSCn(info->line);
- #else
-       volatile unsigned char  *icrp, *uartp;
-@@ -1966,7 +2124,9 @@ struct console mcfrs_console = {
- static int __init mcfrs_console_init(void)
- {
-+#if !(defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X))
-       register_console(&mcfrs_console);
-+#endif
-       return 0;
- }
---- /dev/null
-+++ b/drivers/spi/coldfire_edma.c
-@@ -0,0 +1,446 @@
-+/*
-+ *
-+ * coldfire_edma.c - eDMA driver for Coldfire MCF5445x
-+ *
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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/init.h>
-+#include <linux/module.h>
-+#include <asm/virtconvert.h>
-+#include <asm/coldfire.h>
-+#include <linux/fs.h>
-+#include <linux/cdev.h>
-+#include <linux/seq_file.h>
-+#include <linux/proc_fs.h>
-+#ifdef CONFIG_M5445X
-+#include <asm/mcf5445x_edma.h>
-+#include <asm/mcf5445x_intc.h>
-+#endif /* CONFIG_M5445X */
-+#include <asm/coldfire_edma.h>
-+
-+/*
-+ * Callback handler data for each TCD
-+ */
-+struct edma_isr_record {
-+      edma_irq_handler irq_handler;     /* interrupt handler */
-+      edma_error_handler error_handler; /* error interrupt handler */
-+      void *arg;                        /* argument to pass back */
-+      int allocated;                    /* busy flag */
-+      spinlock_t *lock;                 /* spin lock (optional) */
-+      const char *device_id;            /* dev id string, used in procfs */
-+};
-+
-+/*
-+ * Device structure
-+ */
-+struct coldfire_edma_dev {
-+      struct cdev cdev;                 /* character device */
-+      struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS];
-+};
-+
-+/* allocated major device number */
-+static int coldfire_dma_major;
-+
-+/* device driver structure */
-+static struct coldfire_edma_dev *devp = NULL;
-+
-+/* device driver file operations */
-+struct file_operations coldfire_edma_fops = {
-+      .owner = THIS_MODULE,
-+};
-+
-+/**
-+ * dmaisr - eDMA channel interrupt handler
-+ * @irq: interrupt number
-+ * @dev_id: argument
-+ */
-+static int dmaisr(int irq, void *dev_id)
-+{
-+      int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE;
-+      int result = IRQ_HANDLED;
-+
-+      if ((devp != NULL) &&
-+          (devp->dma_interrupt_handlers[channel].irq_handler)) {
-+              /* call user irq handler */
-+              if (devp->dma_interrupt_handlers[channel].lock)
-+                      spin_lock(devp->dma_interrupt_handlers[channel].lock);
-+
-+              result = devp->dma_interrupt_handlers[channel].irq_handler(
-+                      channel, devp->dma_interrupt_handlers[channel].arg);
-+
-+              if (devp->dma_interrupt_handlers[channel].lock)
-+                      spin_unlock(devp->dma_interrupt_handlers[channel].lock);
-+      } else {
-+              /* no irq handler so just ack it */
-+              confirm_edma_interrupt_handled(channel);
-+              printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n",
-+                     channel);
-+      }
-+
-+      return result;
-+}
-+
-+/**
-+ * dma_error_isr - eDMA error interrupt handler
-+ * @irq: interrupt number
-+ * @dev_id: argument
-+ */
-+static int dma_error_isr(int irq, void* dev_id)
-+{
-+      u16 err;
-+      int i;
-+
-+      err = MCF_EDMA_ERR;
-+      for (i=0; i<EDMA_CHANNELS; i++) {
-+              if (err & (1<<i)) {
-+                      if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler)
-+                              devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].arg);
-+                      else
-+                              printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i);
-+              }
-+      }
-+
-+      MCF_EDMA_CERR = MCF_EDMA_CERR_CAER;
-+      return IRQ_HANDLED;
-+}
-+
-+/**
-+ * set_edma_params - Set transfer control descriptor (TCD)
-+ * @channel: channel number
-+ * @source: source address
-+ * @dest: destination address
-+ * @attr: attributes
-+ * @soff: source offset
-+ * @nbytes: number of bytes to be transfered in minor loop
-+ * @slast: last source address adjustment
-+ * @citer: major loop count
-+ * @biter: beginning minor loop count
-+ * @doff: destination offset
-+ * @dlast_sga: last destination address adjustment
-+ * @major_int: generate interrupt after each major loop
-+ * @disable_req: disable DMA request after major loop
-+ */
-+void set_edma_params(int channel, u32 source, u32 dest,
-+      u32 attr, u32 soff, u32 nbytes, u32 slast,
-+      u32 citer, u32 biter, u32 doff, u32 dlast_sga,
-+      int major_int, int disable_req)
-+{
-+
-+      if (channel<0 || channel>EDMA_CHANNELS)
-+              return;
-+
-+      MCF_EDMA_TCD_SADDR(channel) = source;
-+      MCF_EDMA_TCD_DADDR(channel) = dest;
-+      MCF_EDMA_TCD_ATTR(channel) = attr;
-+      MCF_EDMA_TCD_SOFF(channel) = MCF_EDMA_TCD_SOFF_SOFF(soff);
-+      MCF_EDMA_TCD_NBYTES(channel) = MCF_EDMA_TCD_NBYTES_NBYTES(nbytes);
-+      MCF_EDMA_TCD_SLAST(channel) = MCF_EDMA_TCD_SLAST_SLAST(slast);
-+      MCF_EDMA_TCD_CITER(channel) = MCF_EDMA_TCD_CITER_CITER(citer);
-+      MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter);
-+      MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff);
-+      MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga);
-+
-+      /* interrupt at the end of major loop */
-+      if (major_int)
-+              MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR;
-+      else
-+              MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR;
-+
-+      /* disable request at the end of major loop of transfer or not*/
-+      if (disable_req)
-+              MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ;
-+      else
-+              MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ;
-+}
-+EXPORT_SYMBOL(set_edma_params);
-+
-+/**
-+ * init_edma - Initialize the eDMA controller
-+ */
-+void init_edma(void)
-+{
-+      MCF_EDMA_CR = 0;
-+}
-+EXPORT_SYMBOL(init_edma);
-+
-+/**
-+ * request_edma_channel - Request an eDMA channel
-+ * @channel: channel number
-+ * @handler: dma handler
-+ * @error_handler: dma error handler
-+ * @arg: argument to pass back
-+ * @lock: optional spinlock to hold over interrupt
-+ * @device_id: device id
-+ *
-+ * Returns 0 if success or a negative value if failure
-+ */
-+int request_edma_channel(int channel,
-+      edma_irq_handler handler,
-+      edma_error_handler error_handler,
-+      void *arg,
-+      spinlock_t *lock,
-+      const char *device_id )
-+{
-+      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
-+              if (devp->dma_interrupt_handlers[channel].allocated)
-+                      return -EBUSY;
-+
-+              devp->dma_interrupt_handlers[channel].allocated = 1;
-+              devp->dma_interrupt_handlers[channel].irq_handler = handler;
-+              devp->dma_interrupt_handlers[channel].error_handler = error_handler;
-+              devp->dma_interrupt_handlers[channel].arg = arg;
-+              devp->dma_interrupt_handlers[channel].lock = lock;
-+              devp->dma_interrupt_handlers[channel].device_id = device_id;
-+              return 0;
-+      }
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL(request_edma_channel);
-+
-+/**
-+ * set_edma_callback - Update the channel callback/arg
-+ * @channel: channel number
-+ * @handler: dma handler
-+ * @error_handler: dma error handler
-+ * @arg: argument to pass back
-+ *
-+ * Returns 0 if success or a negative value if failure
-+ */
-+int set_edma_callback(int channel,
-+      edma_irq_handler handler,
-+      edma_error_handler error_handler,
-+      void *arg )
-+{
-+      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS &&
-+          devp->dma_interrupt_handlers[channel].allocated) {
-+              devp->dma_interrupt_handlers[channel].irq_handler = handler;
-+              devp->dma_interrupt_handlers[channel].error_handler = error_handler;
-+              devp->dma_interrupt_handlers[channel].arg = arg;
-+              return 0;
-+      }
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL(set_edma_callback);
-+
-+/**
-+ * free_edma_channel - Free the edma channel
-+ * @channel: channel number
-+ * @arg: argument created with
-+ *
-+ * Returns 0 if success or a negative value if failure
-+ */
-+int free_edma_channel(int channel, void *arg)
-+{
-+      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
-+              if (devp->dma_interrupt_handlers[channel].allocated) {
-+#if 0
-+                      if (devp->dma_interrupt_handlers[channel].arg != arg)
-+                              return -EBUSY;
-+#endif
-+
-+                      devp->dma_interrupt_handlers[channel].allocated = 0;
-+                      devp->dma_interrupt_handlers[channel].arg = NULL;
-+                      devp->dma_interrupt_handlers[channel].irq_handler = NULL;
-+                      devp->dma_interrupt_handlers[channel].error_handler = NULL;
-+                      devp->dma_interrupt_handlers[channel].lock = NULL;
-+              }
-+              return 0;
-+      }
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL(free_edma_channel);
-+
-+/**
-+ * coldfire_edma_cleanup - cleanup driver allocated resources
-+ */
-+static void coldfire_edma_cleanup(void)
-+{
-+      dev_t devno;
-+      int i;
-+
-+      /* free interrupts/memory */
-+      if (devp) {
-+              for (i=0; i<EDMA_CHANNELS; i++)
-+                      free_irq(EDMA_INT_BASE+i, devp);
-+
-+              free_irq(EDMA_INT_BASE+EDMA_INT_ERR, devp);
-+              cdev_del(&devp->cdev);
-+              kfree(devp);
-+      }
-+
-+      /* unregister character device */
-+      devno = MKDEV(coldfire_dma_major, 0);
-+      unregister_chrdev_region(devno, 1);
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+/*
-+ * proc file system support
-+ */
-+
-+#define FREE_CHANNEL "free"
-+#define DEVICE_UNKNOWN "device unknown"
-+
-+/**
-+ * proc_edma_show - print out proc info
-+ * @m: seq_file
-+ * @v:
-+ */
-+static int proc_edma_show(struct seq_file *m, void *v)
-+{
-+      int i;
-+
-+      if (devp == NULL)
-+              return 0;
-+
-+      for (i = 0 ; i < EDMA_CHANNELS ; i++) {
-+              if (devp->dma_interrupt_handlers[i].allocated) {
-+                      if (devp->dma_interrupt_handlers[i].device_id)
-+                              seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id);
-+                      else
-+                              seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN);
-+              } else
-+                      seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL);
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * proc_edma_open - open the proc file
-+ * @inode: inode ptr
-+ * @file: file ptr
-+ */
-+static int proc_edma_open(struct inode *inode, struct file *file)
-+{
-+      return single_open(file, proc_edma_show, NULL);
-+}
-+
-+static const struct file_operations proc_edma_operations = {
-+      .open           = proc_edma_open,
-+      .read           = seq_read,
-+      .llseek         = seq_lseek,
-+      .release        = single_release,
-+};
-+
-+/**
-+ * proc_edma_init - initialize proc filesystem
-+ */
-+static int __init proc_edma_init(void)
-+{
-+      struct proc_dir_entry *e;
-+
-+      e = create_proc_entry("edma", 0, NULL);
-+      if (e)
-+              e->proc_fops = &proc_edma_operations;
-+
-+      return 0;
-+}
-+
-+#endif
-+
-+/**
-+ * coldfire_edma_init - eDMA module init
-+ */
-+static int __init coldfire_edma_init(void)
-+{
-+      dev_t dev;
-+      int result;
-+      int i;
-+
-+      /* allocate free major number */
-+      result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME);
-+      if (result < 0) {
-+              printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n",
-+                     result);
-+              return result;
-+      }
-+      coldfire_dma_major = MAJOR(dev);
-+
-+      /* allocate device driver structure */
-+      devp = kmalloc(sizeof(struct coldfire_edma_dev), GFP_KERNEL);
-+      if (!devp) {
-+              result = -ENOMEM;
-+              goto fail;
-+      }
-+
-+      /* init handlers (no handlers for beginning) */
-+      for (i = 0; i < EDMA_CHANNELS; i++) {
-+              devp->dma_interrupt_handlers[i].irq_handler = NULL;
-+              devp->dma_interrupt_handlers[i].error_handler = NULL;
-+              devp->dma_interrupt_handlers[i].arg = NULL;
-+              devp->dma_interrupt_handlers[i].allocated = 0;
-+              devp->dma_interrupt_handlers[i].lock = NULL;
-+              devp->dma_interrupt_handlers[i].device_id = NULL;
-+      }
-+
-+      /* register char device */
-+      cdev_init(&devp->cdev, &coldfire_edma_fops);
-+      devp->cdev.owner = THIS_MODULE;
-+      devp->cdev.ops = &coldfire_edma_fops;
-+      result = cdev_add(&devp->cdev, dev, 1);
-+      if (result) {
-+              printk(KERN_NOTICE EDMA_DRIVER_NAME
-+                     ": Error %d adding coldfire-dma device\n", result);
-+              result = -ENODEV;
-+              goto fail;
-+      }
-+
-+      /* request/enable irq for each eDMA channel */
-+      for (i = 0; i < EDMA_CHANNELS;i++) {
-+              result = request_irq(EDMA_INT_BASE + i,
-+                                   dmaisr, IRQF_DISABLED,
-+                                   EDMA_DRIVER_NAME, devp);
-+              if (result) {
-+                      printk(KERN_WARNING EDMA_DRIVER_NAME
-+                             ": Cannot request irq %d\n",
-+                             (EDMA_INT_BASE + EDMA_INT_ERR+i));
-+                      result = -EBUSY;
-+                      goto fail;
-+              }
-+      }
-+
-+      /* request error interrupt */
-+      result = request_irq(EDMA_INT_BASE + EDMA_INT_ERR,
-+                           dma_error_isr, IRQF_DISABLED,
-+                           EDMA_DRIVER_NAME, devp);
-+      if (result) {
-+              printk(KERN_WARNING EDMA_DRIVER_NAME
-+                     ": Cannot request irq %d\n",
-+                     (EDMA_INT_BASE + EDMA_INT_ERR));
-+              result = -EBUSY;
-+              goto fail;
-+      }
-+
-+#ifdef CONFIG_PROC_FS
-+      proc_edma_init();
-+#endif
-+
-+      printk(EDMA_DRIVER_NAME ": initialized successfully\n");
-+      return 0;
-+fail:
-+      coldfire_edma_cleanup();
-+      return result;
-+}
-+
-+/**
-+ * coldfire_edma_exit - eDMA module exit
-+ */
-+static void __exit coldfire_edma_exit(void)
-+{
-+      coldfire_edma_cleanup();
-+}
-+
-+module_init(coldfire_edma_init);
-+module_exit(coldfire_edma_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
-+MODULE_DESCRIPTION("eDMA library for Coldfire M5445x");
---- /dev/null
-+++ b/drivers/spi/dspi_mcf.c
-@@ -0,0 +1,1217 @@
-+/*
-+ * dspi_mcf.c - DSPI controller for ColdFire processors
-+ *
-+ *
-+ *      Matt Waddel Matt.Waddel@freescale.com
-+ *      Copyright Freescale Semiconductor, Inc. 2008
-+ *
-+ *    M547x/M548x changes by Kurt Mahan kmahan@freescale.com
-+ *      Copyright Freescale Semiconductor, Inc. 2008
-+ *
-+ *      Based on spi_coldfire.c done by:
-+ *              Andrey Butok
-+ *              Yaroslav Vinogradov
-+ *              Copyright Freescale Semiconductor, Inc. 2006-2007
-+ *              Mike Lavender (mike@steroidmicros)
-+ *              (C) Copyright 2005, Intec Automation,
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ *   v0.002   M547x/M548x support.
-+ *   v0.001   Initial version. Coldfire DSPI master driver.
-+ ****************************************************************************/
-+
-+/*
-+ * Includes
-+ */
-+
-+#include <linux/autoconf.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/workqueue.h>
-+#include <linux/delay.h>
-+#include <asm/mcfsim.h>
-+#include <asm/mcfqspi.h>
-+#include <asm/coldfire.h>
-+#include <linux/io.h>
-+#include <asm/mcfdspi.h>
-+#include <linux/dma-mapping.h>
-+
-+#undef DSPI_COLDFIRE_DEBUG
-+
-+#ifdef DSPI_COLDFIRE_DEBUG
-+#define DBG(fmt, args...) \
-+      printk(KERN_INFO "[%s]  " fmt , __FUNCTION__, ## args)
-+#else
-+#define DBG(fmt, args...)     do {} while (0)
-+#endif
-+
-+#if defined(CONFIG_M54455)
-+#include <asm/mcf5445x_dspi.h>
-+#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
-+      #include <asm/mcf5445x_edma.h>
-+#endif
-+#endif
-+
-+#if defined(CONFIG_M547X_8X)
-+#include <asm/virtconvert.h>
-+#include <asm/m5485dspi.h>
-+#endif
-+
-+#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
-+#include <asm/mcf_edma.h>
-+#define SPI_DSPI_EDMA
-+#define EDMA_BUFSIZE_KMALLOC  (DSPI_FIFO_SIZE*4)
-+#define DSPI_DMA_RX_TCD               MCF_EDMA_CHAN_DSPI_RX
-+#define DSPI_DMA_TX_TCD       MCF_EDMA_CHAN_DSPI_TX
-+#endif
-+
-+#define DSPI_BITS     MCF_DSPI_DCTAR_FMSZ(0xF)
-+#define DSPI_BITS_16  MCF_DSPI_DCTAR_FMSZ(0xF)
-+#define DSPI_BITS_8   MCF_DSPI_DCTAR_FMSZ(0x7)
-+#define DSPI_FIFO_SIZE        16
-+
-+#define DRIVER_NAME "Coldfire DSPI"
-+
-+/****************************************************************************/
-+
-+/*
-+ * Local constants and macros
-+ */
-+
-+#define START_STATE ((void *)0)
-+#define RUNNING_STATE ((void *)1)
-+#define DONE_STATE ((void *)2)
-+#define ERROR_STATE ((void *)-1)
-+
-+#define QUEUE_RUNNING 0
-+#define QUEUE_STOPPED 1
-+
-+/****************************************************************************/
-+
-+/*
-+ * Local Data Structures
-+ */
-+
-+struct DSPI_MCR {
-+      unsigned master:1;
-+      unsigned cont_scke:1;
-+      unsigned dconf:2;
-+      unsigned frz:1;
-+      unsigned mtfe:1;
-+      unsigned pcsse:1;
-+      unsigned rooe:1;
-+      unsigned pcsis:8;
-+      unsigned reserved15:1;
-+      unsigned mdis:1;
-+      unsigned dis_tx:1;
-+      unsigned dis_rxf:1;
-+      unsigned clr_tx:1;
-+      unsigned clr_rxf:1;
-+      unsigned smpl_pt:2;
-+      unsigned reserved71:7;
-+      unsigned halt:1;
-+};
-+
-+struct DSPI_CTAR {
-+      unsigned dbr:1;
-+      unsigned fmsz:4;
-+      unsigned cpol:1;
-+      unsigned cpha:1;
-+      unsigned lsbfe:1;
-+      unsigned pcssck:2;
-+      unsigned pasc:2;
-+      unsigned pdt:2;
-+      unsigned pbr:2;
-+      unsigned cssck:4;
-+      unsigned asc:4;
-+      unsigned dt:4;
-+      unsigned br:4;
-+};
-+
-+struct chip_data {
-+      /* dspi data */
-+      union {
-+              u32 mcr_val;
-+              struct DSPI_MCR mcr;
-+      };
-+      union {
-+              u32 ctar_val;
-+              struct DSPI_CTAR ctar;
-+      };
-+      u16 void_write_data;
-+};
-+
-+
-+struct driver_data {
-+      /* Driver model hookup */
-+      struct platform_device *pdev;
-+
-+      /* SPI framework hookup */
-+      struct spi_master *master;
-+
-+      /* Driver message queue */
-+      struct workqueue_struct *workqueue;
-+      struct work_struct pump_messages;
-+      spinlock_t lock; /* lock */
-+      struct list_head queue;
-+      int busy;
-+      int run;
-+
-+      /* Message Transfer pump */
-+      struct tasklet_struct pump_transfers;
-+
-+      /* Current message transfer state info */
-+      struct spi_message *cur_msg;
-+      struct spi_transfer *cur_transfer;
-+      struct chip_data *cur_chip;
-+      size_t len;
-+      void *tx;
-+      void *tx_end;
-+      void *rx;
-+      void *rx_end;
-+      char flags;
-+#define TRAN_STATE_RX_VOID       0x01
-+#define TRAN_STATE_TX_VOID       0x02
-+#define TRAN_STATE_WORD_ODD_NUM          0x04
-+      u8 cs;
-+      u16 void_write_data;
-+      unsigned cs_change:1;
-+
-+      u32 trans_cnt;
-+      u32 wce_cnt;
-+      u32 abrt_cnt;
-+      u32 *mcr;               /* DSPI MCR register */
-+      u32 *ctar;              /* DSPI CTAR register */
-+      u32 *dspi_dtfr;         /* DSPI DTFR register */
-+      u32 *dspi_drfr;         /* DSPI DRFR register */
-+      u32 *dspi_rser;         /* DSPI RSER register */
-+      u32 *dspi_sr;           /* DSPI status register */
-+
-+#if defined(SPI_DSPI_EDMA)
-+      void *edma_tx_buf;
-+      void *edma_rx_buf;
-+#endif
-+
-+#if defined(CONFIG_M532x) || defined(CONFIG_M537x)
-+      u16 *par;          /* Pin assignment register */
-+#else
-+      u8  *par;          /* Pin assignment register */
-+#endif
-+      u8  *int_icr;      /* Interrupt level and priority register */
-+      u32 *int_mr;       /* Interrupt mask register */
-+      void (*cs_control)(u8 cs, u8 command);
-+};
-+
-+#define DSPI_CS(cs) ((1<<(cs))<<16)
-+
-+/****************************************************************************/
-+
-+/*
-+ * SPI local functions
-+ */
-+
-+static void *next_transfer(struct driver_data *drv_data)
-+{
-+      struct spi_message *msg = drv_data->cur_msg;
-+      struct spi_transfer *trans = drv_data->cur_transfer;
-+
-+      DBG("\n");
-+      /* Move to next transfer */
-+      if (trans->transfer_list.next != &msg->transfers) {
-+              drv_data->cur_transfer = list_entry(trans->transfer_list.next,
-+                                                  struct spi_transfer,
-+                                                  transfer_list);
-+
-+              if (drv_data->cur_transfer->transfer_list.next
-+                      == &msg->transfers) /* last transfer */
-+                      drv_data->cur_transfer->cs_change = 1;
-+
-+              return RUNNING_STATE;
-+      } else
-+              return DONE_STATE;
-+}
-+
-+
-+static inline int is_word_transfer(struct driver_data *drv_data)
-+{
-+      return ((*(drv_data->ctar+drv_data->cs) & DSPI_BITS_16) ==
-+                                                DSPI_BITS_8) ? 0 : 1;
-+}
-+
-+static inline void set_8bit_transfer_mode(struct driver_data *drv_data)
-+{
-+      DBG("\n");
-+      *(drv_data->ctar+drv_data->cs) =
-+              (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_8;
-+}
-+
-+static inline void set_16bit_transfer_mode(struct driver_data *drv_data)
-+{
-+      DBG("\n");
-+      *(drv_data->ctar+drv_data->cs) =
-+              (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_16;
-+}
-+
-+static unsigned char hz_to_spi_baud(int pbr, int dbr, int speed_hz)
-+{
-+      int pbr_tbl[4] = {2, 3, 5, 7}; /* Valid baud rate pre-scaler values */
-+      int brs[16] = { 2,      4,      6,      8,
-+                      16,     32,     64,     128,
-+                      256,    512,    1024,   2048,
-+                      4096,   8192,   16384,  32768 };
-+      int temp, index = 0;
-+
-+      if ((pbr < 0) || (pbr > 3) ||
-+          (dbr < 0) || (dbr > 1))
-+              return 15; /* table indexes out of range, go slow */
-+
-+      temp = ((((MCF_CLK / 2) / pbr_tbl[pbr]) * (1 + dbr)) / speed_hz);
-+
-+      while (temp >= brs[index])
-+              if (index++ >= 15)
-+                      break;
-+
-+      DBG("baud rate scaler = 0x%x - %d\n", index, brs[index]);
-+      return(index);
-+}
-+
-+static int write(struct driver_data *drv_data)
-+{
-+      int tx_count = 0;
-+      int tx_word = is_word_transfer(drv_data);
-+      u16 d16;
-+      u8  d8;
-+      u32 dspi_pushr = 0;
-+      int first = 1;
-+#if defined(SPI_DSPI_EDMA)
-+      u32 *edma_wr = (u32 *)(drv_data->edma_tx_buf);
-+#endif
-+
-+      /* If we are in word mode, but only have a single byte to transfer
-+       * then switch to byte mode temporarily.  Will switch back at the
-+       * end of the transfer. */
-+      if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
-+              drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
-+              set_8bit_transfer_mode(drv_data);
-+              tx_word = 0;
-+      }
-+
-+      while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) {
-+// DBG("while\n");
-+              if (tx_word) {
-+                      if ((drv_data->tx_end - drv_data->tx) == 1)
-+                              break;
-+
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
-+                              d16 = *(u16 *)drv_data->tx;
-+                      else
-+                              d16 = drv_data->void_write_data;
-+
-+                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) |
-+                                   DSPI_CS(drv_data->cs) |
-+                                   MCF_DSPI_DTFR_CTAS(drv_data->cs) |
-+                                   MCF_DSPI_DTFR_CONT;
-+
-+                      drv_data->tx += 2;
-+              } else {
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
-+                              d8 = *(u8 *)drv_data->tx;
-+                      else
-+                              d8 = *(u8 *)&drv_data->void_write_data;
-+
-+                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) |
-+                                   DSPI_CS(drv_data->cs) |
-+                                   MCF_DSPI_DTFR_CTAS(drv_data->cs) |
-+                                   MCF_DSPI_DTFR_CONT;
-+
-+                      drv_data->tx++;
-+              }
-+
-+              if (drv_data->tx == drv_data->tx_end
-+                      || tx_count == DSPI_FIFO_SIZE-1) {
-+                      /* last transfer in the queue */
-+                      dspi_pushr |= MCF_DSPI_DTFR_EOQ;
-+                      if ((drv_data->cs_change)
-+                       && (drv_data->tx == drv_data->tx_end))
-+                              dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
-+#ifdef CONFIG_M547X_8X
-+                      /* EOQ gets missed if we don't delay */
-+                      udelay(100);
-+#endif
-+              } else if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1))
-+                      dspi_pushr |= MCF_DSPI_DTFR_EOQ;
-+
-+              if (first) {
-+                      first = 0;
-+                      dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
-+              }
-+#if defined(SPI_DSPI_EDMA)
-+              *edma_wr = dspi_pushr;
-+              edma_wr++;
-+#else
-+              *drv_data->dspi_dtfr = dspi_pushr;
-+#endif
-+              tx_count++;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+      if (tx_count > 0) {
-+
-+              mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD,
-+                      virt_to_phys(drv_data->edma_tx_buf),
-+                      (u32)drv_data->dspi_dtfr,
-+                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT
-+                      | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                      4,              /* soff */
-+                      4 * tx_count,   /* nbytes */
-+                      0,              /* slast */
-+                      1,              /* citer */
-+                      1,              /* biter */
-+                      0,              /* doff */
-+                      0,              /* dlastsga */
-+                      0,              /* major_int */
-+                      1);             /* disable_req */
-+
-+              mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD,
-+                      (u32)drv_data->dspi_drfr,
-+                      virt_to_phys(drv_data->edma_rx_buf),
-+                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT
-+                      | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                      0,              /* soff */
-+                      4 * tx_count,   /* nbytes */
-+                      0,              /* slast */
-+                      1,              /* citer */
-+                      1,              /* biter */
-+                      4,              /* doff */
-+                      0,              /* dlastsga */
-+                      0,              /* major_int */
-+                      1);             /* disable_req */
-+
-+              mcf_edma_start_transfer(DSPI_DMA_TX_TCD);
-+      }
-+#endif
-+      return (tx_count * (tx_word + 1));
-+}
-+
-+static int read(struct driver_data *drv_data)
-+{
-+      int rx_count = 0;
-+      int rx_word = is_word_transfer(drv_data);
-+      u16 d;
-+#if defined(SPI_DSPI_EDMA)
-+      u32 *rx_edma = (u32 *) drv_data->edma_rx_buf;
-+
-+      /* receive SPI data */
-+      mcf_edma_start_transfer(DSPI_DMA_RX_TCD);
-+#endif
-+      while ((drv_data->rx < drv_data->rx_end)
-+              && (rx_count < DSPI_FIFO_SIZE)) {
-+
-+              if (rx_word) {
-+                      if ((drv_data->rx_end - drv_data->rx) == 1)
-+                              break;
-+#if defined(SPI_DSPI_EDMA)
-+                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
-+                      rx_edma++;
-+#else
-+                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
-+#endif
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u16 *)drv_data->rx = d;
-+                      drv_data->rx += 2;
-+
-+              } else {
-+#if defined(SPI_DSPI_EDMA)
-+                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
-+                      rx_edma++;
-+#else
-+                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
-+#endif
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u8 *)drv_data->rx = d;
-+                      drv_data->rx++;
-+              }
-+              rx_count++;
-+              DBG("rxd=0x%x\n", d);
-+      }
-+      return rx_count;
-+}
-+
-+
-+static inline void dspi_setup_chip(struct driver_data *drv_data)
-+{
-+      struct chip_data *chip = drv_data->cur_chip;
-+
-+      DBG("\n");
-+      *drv_data->mcr = chip->mcr_val;
-+      *(drv_data->ctar+drv_data->cs) = chip->ctar_val;
-+      *drv_data->dspi_rser =  MCF_DSPI_DRSER_EOQFE;
-+}
-+
-+#if defined(SPI_DSPI_EDMA)
-+static int edma_tx_handler(int channel, void *dev)
-+{
-+      DBG("\n");
-+      if (channel == DSPI_DMA_TX_TCD)
-+              mcf_edma_stop_transfer(DSPI_DMA_TX_TCD);
-+      return IRQ_HANDLED;
-+}
-+
-+static int edma_rx_handler(int channel, void *dev)
-+{
-+      DBG("\n");
-+      if (channel == DSPI_DMA_RX_TCD)
-+              mcf_edma_stop_transfer(DSPI_DMA_RX_TCD);
-+      return IRQ_HANDLED;
-+}
-+#endif
-+
-+static irqreturn_t dspi_interrupt(int irq, void *dev_id)
-+{
-+      struct driver_data *drv_data = (struct driver_data *)dev_id;
-+      struct spi_message *msg = drv_data->cur_msg;
-+
-+      /* Clear all flags immediately */
-+      *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF;
-+
-+      if (!drv_data->cur_msg || !drv_data->cur_msg->state) {
-+#if !defined(SPI_DSPI_EDMA)
-+              u32 irq_status = *drv_data->dspi_sr;
-+              /* if eDMA is used it happens some time (at least once)*/
-+              printk(KERN_ERR "Bad message or transfer state handler. \
-+                               IRQ status = %x\n", irq_status);
-+#endif
-+              return IRQ_NONE;
-+      }
-+
-+      DBG("\n");
-+      /*
-+       * Read the data into the buffer and reload and start
-+       * queue with new data if not finished.  If finished
-+       * then setup the next transfer
-+       */
-+      read(drv_data);
-+
-+      if (drv_data->rx == drv_data->rx_end) {
-+              /*
-+               * Finished now - fall through and schedule next
-+               * transfer tasklet
-+               */
-+              if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM)
-+                      set_16bit_transfer_mode(drv_data);
-+
-+              msg->state = next_transfer(drv_data);
-+      } else {
-+              /* not finished yet - keep going */
-+              msg->actual_length += write(drv_data);
-+              return IRQ_HANDLED;
-+      }
-+
-+      tasklet_schedule(&drv_data->pump_transfers);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+/* caller already set message->status; dma and pio irqs are blocked */
-+static void giveback(struct driver_data *drv_data)
-+{
-+      struct spi_transfer *last_transfer;
-+      unsigned long flags;
-+      struct spi_message *msg;
-+      DBG("\n");
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+      msg = drv_data->cur_msg;
-+      drv_data->cur_msg = NULL;
-+      drv_data->cur_transfer = NULL;
-+      drv_data->cur_chip = NULL;
-+      queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      last_transfer = list_entry(msg->transfers.prev,
-+                                 struct spi_transfer, transfer_list);
-+
-+      if (!last_transfer->cs_change)
-+              drv_data->cs_control(drv_data->cs, QSPI_CS_DROP);
-+
-+      msg->state = NULL;
-+      if (msg->complete)
-+              msg->complete(msg->context);
-+}
-+
-+
-+static void pump_transfers(unsigned long data)
-+{
-+      struct driver_data *drv_data = (struct driver_data *)data;
-+      struct spi_message *message = NULL;
-+      struct spi_transfer *transfer = NULL;
-+      struct spi_transfer *previous = NULL;
-+      struct chip_data *chip = NULL;
-+      unsigned long flags;
-+      DBG("\n");
-+      /* Get current state information */
-+      message = drv_data->cur_msg;
-+      transfer = drv_data->cur_transfer;
-+      chip = drv_data->cur_chip;
-+
-+      /* Handle for abort */
-+      if (message->state == ERROR_STATE) {
-+              message->status = -EIO;
-+              giveback(drv_data);
-+              return;
-+      }
-+
-+      /* Handle end of message */
-+      if (message->state == DONE_STATE) {
-+              message->status = 0;
-+              giveback(drv_data);
-+              return;
-+      }
-+
-+      if (message->state == START_STATE) {
-+              dspi_setup_chip(drv_data);
-+
-+              if (drv_data->cs_control)
-+                      drv_data->cs_control(message->spi->chip_select,
-+                              QSPI_CS_ASSERT);
-+      }
-+
-+      /* Delay if requested at end of transfer*/
-+      if (message->state == RUNNING_STATE) {
-+              previous = list_entry(transfer->transfer_list.prev,
-+                                      struct spi_transfer,
-+                                      transfer_list);
-+
-+              if (drv_data->cs_control && transfer->cs_change)
-+                      drv_data->cs_control(message->spi->chip_select,
-+                              QSPI_CS_DROP);
-+
-+              if (previous->delay_usecs)
-+                      udelay(previous->delay_usecs);
-+
-+              if (drv_data->cs_control && transfer->cs_change)
-+                      drv_data->cs_control(message->spi->chip_select,
-+                              QSPI_CS_ASSERT);
-+      }
-+
-+      drv_data->flags = 0;
-+      drv_data->tx = (void *)transfer->tx_buf;
-+      drv_data->tx_end = drv_data->tx + transfer->len;
-+      drv_data->rx = transfer->rx_buf;
-+      drv_data->rx_end = drv_data->rx + transfer->len;
-+
-+      if (!drv_data->rx)
-+              drv_data->flags |= TRAN_STATE_RX_VOID;
-+      if (!drv_data->tx)
-+              drv_data->flags |= TRAN_STATE_TX_VOID;
-+      drv_data->cs = message->spi->chip_select;
-+      drv_data->cs_change = transfer->cs_change;
-+      drv_data->void_write_data = chip->void_write_data;
-+      if (transfer->speed_hz) {
-+              *(drv_data->ctar + drv_data->cs) = \
-+                      ((chip->ctar_val & ~0xF) | \
-+                        hz_to_spi_baud(chip->ctar.pbr, \
-+                                       chip->ctar.dbr, \
-+                                       transfer->speed_hz));
-+      }
-+
-+      message->state = RUNNING_STATE;
-+      /* Go baby, go */
-+      local_irq_save(flags);
-+      message->actual_length += write(drv_data);
-+      local_irq_restore(flags);
-+}
-+
-+
-+static void pump_messages(struct work_struct *work)
-+{
-+      struct driver_data *drv_data;
-+      unsigned long flags;
-+      DBG("\n");
-+
-+      drv_data = container_of(work, struct driver_data, pump_messages);
-+
-+      /* Lock queue and check for queue work */
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+      if (list_empty(&drv_data->queue)
-+              || drv_data->run == QUEUE_STOPPED) {
-+              drv_data->busy = 0;
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return;
-+      }
-+
-+      /* Make sure we are not already running a message */
-+      if (drv_data->cur_msg) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return;
-+      }
-+
-+      /* Extract head of queue */
-+      drv_data->cur_msg = list_entry(drv_data->queue.next,
-+                                      struct spi_message, queue);
-+      list_del_init(&drv_data->cur_msg->queue);
-+
-+      /* Initial message state*/
-+      drv_data->cur_msg->state = START_STATE;
-+      drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
-+                                              struct spi_transfer,
-+                                              transfer_list);
-+
-+      if (drv_data->cur_transfer->transfer_list.next
-+              == &drv_data->cur_msg->transfers)
-+              drv_data->cur_transfer->cs_change = 1; /* last */
-+
-+
-+      /* Setup the SPI Registers using the per chip configuration */
-+      drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
-+
-+      /* Mark as busy and launch transfers */
-+      tasklet_schedule(&drv_data->pump_transfers);
-+
-+      drv_data->busy = 1;
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+}
-+
-+/****************************************************************************/
-+
-+/*
-+ * SPI master implementation
-+ */
-+
-+static int transfer(struct spi_device *spi, struct spi_message *msg)
-+{
-+      struct driver_data *drv_data = spi_master_get_devdata(spi->master);
-+      unsigned long flags;
-+
-+      DBG("\n");
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      if (drv_data->run == QUEUE_STOPPED) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return -ESHUTDOWN;
-+      }
-+
-+      msg->actual_length = 0;
-+      msg->status = -EINPROGRESS;
-+      msg->state = START_STATE;
-+
-+      list_add_tail(&msg->queue, &drv_data->queue);
-+
-+      if (drv_data->run == QUEUE_RUNNING && !drv_data->busy)
-+              queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      return 0;
-+}
-+
-+
-+static int setup(struct spi_device *spi)
-+{
-+
-+      struct chip_data *chip;
-+      struct coldfire_dspi_chip *chip_info
-+              = (struct coldfire_dspi_chip *)spi->controller_data;
-+      DBG("\n");
-+
-+      /* Only alloc on first setup */
-+      chip = spi_get_ctldata(spi);
-+      if (chip == NULL) {
-+              chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL);
-+              if (!chip)
-+                      return -ENOMEM;
-+              spi->mode = chip_info->mode;
-+              spi->bits_per_word = chip_info->bits_per_word;
-+      }
-+
-+      chip->mcr.master = 1;
-+      chip->mcr.cont_scke = 0;
-+      chip->mcr.dconf = 0;
-+      chip->mcr.frz = 0;
-+      chip->mcr.mtfe = 0;
-+      chip->mcr.pcsse = 0;
-+      chip->mcr.rooe = 0;
-+      chip->mcr.pcsis = 0xFF;
-+      chip->mcr.reserved15 = 0;
-+      chip->mcr.mdis = 0;
-+      chip->mcr.dis_tx = 0;
-+      chip->mcr.dis_rxf = 0;
-+      chip->mcr.clr_tx = 1;
-+      chip->mcr.clr_rxf = 1;
-+      chip->mcr.smpl_pt = 0;
-+      chip->mcr.reserved71 = 0;
-+      chip->mcr.halt = 0;
-+
-+      if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
-+              chip->ctar.fmsz = spi->bits_per_word-1;
-+      } else {
-+              printk(KERN_ERR "Invalid wordsize\n");
-+              kfree(chip);
-+              return -ENODEV;
-+      }
-+
-+      chip->void_write_data = chip_info->void_write_data;
-+
-+      if (spi->max_speed_hz != 0)
-+              chip_info->br = hz_to_spi_baud(chip_info->pbr, chip_info->dbr, \
-+                                             spi->max_speed_hz);
-+
-+      chip->ctar.cpha = (spi->mode & SPI_CPHA) ? 1 : 0;
-+      chip->ctar.cpol = (spi->mode & SPI_CPOL) ? 1 : 0;
-+      chip->ctar.lsbfe = (spi->mode & SPI_LSB_FIRST) ? 1 : 0;
-+      chip->ctar.dbr = chip_info->dbr;
-+      chip->ctar.pbr = chip_info->pbr;
-+      chip->ctar.br = chip_info->br;
-+      chip->ctar.pcssck = chip_info->pcssck;
-+      chip->ctar.pasc = chip_info->pasc;
-+      chip->ctar.pdt = chip_info->pdt;
-+      chip->ctar.cssck = chip_info->cssck;
-+      chip->ctar.asc = chip_info->asc;
-+      chip->ctar.dt = chip_info->dt;
-+
-+      spi_set_ctldata(spi, chip);
-+
-+      return 0;
-+}
-+
-+static int init_queue(struct driver_data *drv_data)
-+{
-+      INIT_LIST_HEAD(&drv_data->queue);
-+      spin_lock_init(&drv_data->lock);
-+
-+      drv_data->run = QUEUE_STOPPED;
-+      drv_data->busy = 0;
-+
-+      tasklet_init(&drv_data->pump_transfers,
-+                      pump_transfers, (unsigned long)drv_data);
-+
-+      INIT_WORK(&drv_data->pump_messages, pump_messages);
-+
-+      drv_data->workqueue = create_singlethread_workqueue(
-+                                      drv_data->master->dev.parent->bus_id);
-+      if (drv_data->workqueue == NULL)
-+              return -EBUSY;
-+
-+      return 0;
-+}
-+
-+static int start_queue(struct driver_data *drv_data)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      if (drv_data->run == QUEUE_RUNNING || drv_data->busy) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return -EBUSY;
-+      }
-+
-+      drv_data->run = QUEUE_RUNNING;
-+      drv_data->cur_msg = NULL;
-+      drv_data->cur_transfer = NULL;
-+      drv_data->cur_chip = NULL;
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+
-+      return 0;
-+}
-+
-+static int stop_queue(struct driver_data *drv_data)
-+{
-+      unsigned long flags;
-+      unsigned limit = 500;
-+      int status = 0;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      /* This is a bit lame, but is optimized for the common execution path.
-+       * A wait_queue on the drv_data->busy could be used, but then the common
-+       * execution path (pump_messages) would be required to call wake_up or
-+       * friends on every SPI message. Do this instead */
-+      drv_data->run = QUEUE_STOPPED;
-+      while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              msleep(10);
-+              spin_lock_irqsave(&drv_data->lock, flags);
-+      }
-+
-+      if (!list_empty(&drv_data->queue) || drv_data->busy)
-+              status = -EBUSY;
-+
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      return status;
-+}
-+
-+static int destroy_queue(struct driver_data *drv_data)
-+{
-+      int status;
-+
-+      status = stop_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      destroy_workqueue(drv_data->workqueue);
-+
-+      return 0;
-+}
-+
-+
-+static void cleanup(struct spi_device *spi)
-+{
-+      struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
-+
-+      dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n",
-+              spi->master->bus_num, spi->chip_select);
-+
-+      kfree(chip);
-+}
-+
-+
-+/****************************************************************************/
-+
-+/*
-+ * Generic Device driver routines and interface implementation
-+ */
-+
-+static int coldfire_spi_probe(struct platform_device *pdev)
-+{
-+      struct device *dev = &pdev->dev;
-+      struct coldfire_spi_master *platform_info;
-+      struct spi_master *master;
-+      struct driver_data *drv_data = 0;
-+      struct resource *memory_resource;
-+      int irq;
-+      int status = 0;
-+      int i;
-+#if defined(SPI_DSPI_EDMA)
-+      dma_addr_t dma_handle;
-+#endif
-+
-+      platform_info = (struct coldfire_spi_master *)dev->platform_data;
-+
-+      master = spi_alloc_master(dev, sizeof(struct driver_data));
-+      if (!master)
-+              return -ENOMEM;
-+
-+      drv_data = spi_master_get_devdata(master);
-+      drv_data->master = master;
-+
-+      INIT_LIST_HEAD(&drv_data->queue);
-+      spin_lock_init(&drv_data->lock);
-+
-+      master->bus_num = platform_info->bus_num;
-+      master->num_chipselect = platform_info->num_chipselect;
-+      master->cleanup = cleanup;
-+      master->setup = setup;
-+      master->transfer = transfer;
-+
-+      drv_data->cs_control = platform_info->cs_control;
-+      if (drv_data->cs_control)
-+              for (i = 0; i < master->num_chipselect; i++)
-+                      drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
-+
-+      /* Setup register addresses */
-+      memory_resource = platform_get_resource_byname(pdev,
-+                              IORESOURCE_MEM, "spi-module");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "can not find platform module memory\n");
-+              goto out_error_master_alloc;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+      drv_data->edma_tx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
-+                                                 &dma_handle, GFP_DMA);
-+      if (!drv_data->edma_tx_buf) {
-+              dev_dbg(dev, "cannot allocate eDMA TX memory\n");
-+              goto out_error_master_alloc;
-+      }
-+      drv_data->edma_rx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
-+                                                 &dma_handle, GFP_DMA);
-+      if (!drv_data->edma_rx_buf) {
-+              dma_free_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
-+                                drv_data->edma_tx_buf, dma_handle);
-+              kfree(drv_data->edma_tx_buf);
-+              dev_dbg(dev, "cannot allocate eDMA RX memory\n");
-+              goto out_error_master_alloc;
-+      }
-+#endif
-+
-+      drv_data->mcr = (void *)&MCF_DSPI_DMCR;
-+      drv_data->ctar = (void *)&MCF_DSPI_DCTAR0;
-+      drv_data->dspi_sr = (void *)&MCF_DSPI_DSR;
-+      drv_data->dspi_rser = (void *)&MCF_DSPI_DRSER;
-+      drv_data->dspi_dtfr = (void *)&MCF_DSPI_DTFR;
-+      drv_data->dspi_drfr = (void *)&MCF_DSPI_DRFR;
-+
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+                                                     "spi-par");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "No spi-par memory\n");
-+              goto out_error_master_alloc;
-+      }
-+      drv_data->par = (void *)memory_resource->start;
-+
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+                                                     "spi-int-level");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "No spi-int-level memory\n");
-+              goto out_error_master_alloc;
-+      }
-+      drv_data->int_icr = (void *)memory_resource->start;
-+
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-+                                                     "spi-int-mask");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "No spi-int-mask memory\n");
-+              goto out_error_master_alloc;
-+      }
-+      drv_data->int_mr = (void *)memory_resource->start;
-+
-+      if (platform_info->irq_list) {
-+              /* multiple IRQs */
-+              int *irqlist = platform_info->irq_list;
-+              while ((irq = *irqlist++)) {
-+                      int off = *irqlist++;
-+                      int lvl = *irqlist++;
-+                      int msk = *irqlist++;
-+                      status = request_irq(irq, dspi_interrupt, IRQF_DISABLED,
-+                                           dev->bus_id, drv_data);
-+                      if (status < 0) {
-+                              dev_err(&pdev->dev, 
-+                                      "Unable to attach ColdFire DSPI interrupt\n");
-+                              goto out_error_master_alloc;
-+                      }
-+
-+                      if (lvl)
-+                              *(drv_data->int_icr + off) = lvl;
-+
-+                      if (msk)
-+                              *drv_data->int_mr &= ~msk;
-+              }
-+      }
-+      else {
-+              irq = platform_info->irq_vector;
-+
-+              status = request_irq(platform_info->irq_vector, dspi_interrupt,
-+                                   IRQF_DISABLED, dev->bus_id, drv_data);
-+              if (status < 0) {
-+                      dev_err(&pdev->dev, "Unable to attach ColdFire DSPI interrupt\n");
-+                      goto out_error_master_alloc;
-+              }
-+
-+              *drv_data->int_icr = platform_info->irq_lp;
-+              *drv_data->int_mr &= ~platform_info->irq_mask;
-+      }
-+
-+      /* Now that we have all the addresses etc.  Let's set it up */
-+      if (platform_info->par_val)
-+              *drv_data->par = platform_info->par_val;
-+
-+      /* Initial and start queue */
-+      status = init_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "Problem initializing DSPI queue\n");
-+              goto out_error_irq_alloc;
-+      }
-+      status = start_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "Problem starting DSPI queue\n");
-+              goto out_error_irq_alloc;
-+      }
-+
-+      /* Register with the SPI framework */
-+      platform_set_drvdata(pdev, drv_data);
-+      status = spi_register_master(master);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "Problem registering DSPI master\n");
-+              status = -EINVAL;
-+              goto out_error_queue_alloc;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+      if (mcf_edma_request_channel(DSPI_DMA_TX_TCD,
-+                                   edma_tx_handler,
-+                                   NULL,
-+                                   0x0,
-+                                   pdev,
-+                                   NULL, /* spinlock */
-+                                   DRIVER_NAME) < 0){
-+              dev_err(&pdev->dev, "eDMA transmit channel request\n");
-+              status = -EINVAL;
-+              goto out_error_queue_alloc;
-+      }
-+
-+      if (mcf_edma_request_channel(DSPI_DMA_RX_TCD,
-+                                   edma_rx_handler,
-+                                   NULL,
-+                                   0x0,
-+                                   pdev,
-+                                   NULL, /* spinlock */
-+                                   DRIVER_NAME) < 0){
-+              dev_err(&pdev->dev, "eDAM receive channel request\n");
-+              status = -EINVAL;
-+              mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
-+              goto out_error_queue_alloc;
-+      }
-+#endif
-+
-+      printk(KERN_INFO "DSPI: Coldfire master initialized\n");
-+      return status;
-+
-+out_error_queue_alloc:
-+      destroy_queue(drv_data);
-+
-+out_error_irq_alloc:
-+      free_irq(platform_info->irq_vector, drv_data);
-+
-+out_error_master_alloc:
-+      spi_master_put(master);
-+      return status;
-+
-+}
-+
-+static int coldfire_spi_remove(struct platform_device *pdev)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int irq;
-+      int status = 0;
-+
-+      if (!drv_data)
-+              return 0;
-+
-+#if defined(SPI_DSPI_EDMA)
-+      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
-+      mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev);
-+#endif
-+
-+      /* Remove the queue */
-+      status = destroy_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      /* Release IRQ */
-+      irq = platform_get_irq(pdev, 0);
-+      if (irq >= 0)
-+              free_irq(irq, drv_data);
-+
-+      /* Disconnect from the SPI framework */
-+      spi_unregister_master(drv_data->master);
-+
-+      /* Prevent double remove */
-+      platform_set_drvdata(pdev, NULL);
-+
-+      return 0;
-+}
-+
-+static void coldfire_spi_shutdown(struct platform_device *pdev)
-+{
-+      int status = coldfire_spi_remove(pdev);
-+
-+      if (status != 0)
-+              dev_err(&pdev->dev, "shutdown failed with %d\n", status);
-+}
-+
-+
-+#ifdef CONFIG_PM
-+static int suspend_devices(struct device *dev, void *pm_message)
-+{
-+      pm_message_t *state = pm_message;
-+
-+      if (dev->power.power_state.event != state->event) {
-+              dev_warn(dev, "pm state does not match request\n");
-+              return -1;
-+      }
-+
-+      return 0;
-+}
-+
-+static int coldfire_spi_suspend(struct platform_device *pdev,
-+                              pm_message_t state)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int status = 0;
-+
-+      /* Check all childern for current power state */
-+      if (device_for_each_child(&pdev->dev,
-+              &state, suspend_devices) != 0) {
-+              dev_warn(&pdev->dev, "suspend aborted\n");
-+              return -1;
-+      }
-+
-+      status = stop_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      return 0;
-+}
-+
-+static int coldfire_spi_resume(struct platform_device *pdev)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int status = 0;
-+
-+      /* Start the queue running */
-+      status = start_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
-+              return status;
-+      }
-+
-+      return 0;
-+}
-+#else
-+#define coldfire_spi_suspend NULL
-+#define coldfire_spi_resume NULL
-+#endif /* CONFIG_PM */
-+
-+static struct platform_driver driver = {
-+      .driver = {
-+              .name = "spi_coldfire",
-+              .bus = &platform_bus_type,
-+              .owner = THIS_MODULE,
-+      },
-+      .probe = coldfire_spi_probe,
-+      .remove = __devexit_p(coldfire_spi_remove),
-+      .shutdown = coldfire_spi_shutdown,
-+      .suspend = coldfire_spi_suspend,
-+      .resume = coldfire_spi_resume,
-+};
-+
-+static int __init coldfire_spi_init(void)
-+{
-+      platform_driver_register(&driver);
-+
-+      return 0;
-+}
-+module_init(coldfire_spi_init);
-+
-+static void __exit coldfire_spi_exit(void)
-+{
-+      platform_driver_unregister(&driver);
-+}
-+module_exit(coldfire_spi_exit);
-+
-+MODULE_AUTHOR("Matt Waddel");
-+MODULE_DESCRIPTION("ColdFire DSPI Contoller");
-+MODULE_LICENSE("GPL");
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -35,6 +35,15 @@ config SPI_DEBUG
-         Say "yes" to enable debug messaging (like dev_dbg and pr_debug),
-         sysfs, and debugfs support in SPI controller and protocol drivers.
-+config COLDFIRE_EDMA
-+      tristate "Coldfire eDMA"
-+      depends on COLDFIRE && EXPERIMENTAL
-+      help
-+          Support for Coldfire eDMA controller. Required for example
-+          by SSI audio device driver.
-+
-+
-+
- #
- # MASTER side ... talking to discrete SPI slave chips including microcontrollers
- #
-@@ -113,6 +122,27 @@ config SPI_GPIO
-         If unsure, say N.
-+config SPI_COLDFIRE
-+      tristate "Coldfire QSPI/DSPI SPI Master"
-+      depends on SPI_MASTER && COLDFIRE && EXPERIMENTAL
-+      help
-+        SPI driver for Freescale Coldfire QSPI module in master mode.
-+        Tested with the 5282 processor, but should also work with other
-+        Coldfire variants.
-+
-+config SPI_DSPI
-+      tristate "Coldfire DSPI"
-+      depends on SPI_MASTER && COLDFIRE
-+      help
-+        SPI driver for Coldfire DSPI driver only.
-+
-+config SPI_COLDFIRE_DSPI_EDMA   
-+      boolean "Coldfire DSPI master driver uses eDMA"
-+      depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA
-+      default n
-+      help
-+        Say "yes" if you want DSPI master driver to use eDMA for transfers.
-+
- config SPI_IMX
-       tristate "Freescale iMX SPI controller"
-       depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
-@@ -255,6 +285,18 @@ config SPI_TLE62X0
- #
- # Add new SPI protocol masters in alphabetical order above this line
- #
-+config SPI_COLDFIRE_SSI_AUDIO
-+      tristate "Coldfire SSI AUDIO"
-+      depends on SPI_MASTER && SPI_COLDFIRE && EXPERIMENTAL
-+      help
-+        SSI audio device driver
-+
-+config SSIAUDIO_USE_EDMA
-+      boolean "Coldfire DSPI master driver uses eDMA"
-+      default y
-+      depends on EXPERIMENTAL && COLDFIRE_EDMA && SPI_COLDFIRE_SSI_AUDIO
-+      help
-+        Say "yes" if you want SSI audio driver to use eDMA for SSI transfers.
- # (slave support would go here)
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -6,6 +6,8 @@ ifeq ($(CONFIG_SPI_DEBUG),y)
- EXTRA_CFLAGS += -DDEBUG
- endif
-+obj-$(CONFIG_COLDFIRE_EDMA)           += coldfire_edma.o
-+
- # small core, mostly translating board-specific
- # config declarations into driver model code
- obj-$(CONFIG_SPI_MASTER)              += spi.o
-@@ -16,6 +18,8 @@ obj-$(CONFIG_SPI_BFIN)                       += spi_bfin5xx.
- obj-$(CONFIG_SPI_BITBANG)             += spi_bitbang.o
- obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
- obj-$(CONFIG_SPI_BUTTERFLY)           += spi_butterfly.o
-+# obj-$(CONFIG_SPI_COLDFIRE)          += spi_coldfire.o spi-m5445x.o
-+obj-$(CONFIG_SPI_DSPI)                        += dspi_mcf.o
- obj-$(CONFIG_SPI_GPIO)                        += spi_gpio.o
- obj-$(CONFIG_SPI_IMX)                 += spi_imx.o
- obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
-@@ -35,6 +39,7 @@ obj-$(CONFIG_SPI_SH_SCI)             += spi_sh_sci.
- obj-$(CONFIG_SPI_AT25)                += at25.o
- obj-$(CONFIG_SPI_SPIDEV)      += spidev.o
- obj-$(CONFIG_SPI_TLE62X0)     += tle62x0.o
-+obj-$(CONFIG_SPI_COLDFIRE_SSI_AUDIO)  += ssi_audio.o
- #     ... add above this line ...
- # SPI slave controller drivers (upstream link)
---- /dev/null
-+++ b/drivers/spi/spi_coldfire.c
-@@ -0,0 +1,1542 @@
-+/*
-+ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
-+ *
-+ *
-+ *    (C) Copyright 2005, Intec Automation,
-+ *                        Mike Lavender (mike@steroidmicros)
-+ *
-+ *    (C) Copyright 2007-2008, Freescale Inc,
-+ *                    Yaroslav Vinogradov
-+ *                    Andrey Butok
-+ *                    Kurt Mahan
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ *   v0.003   12 February 2008        Andrey Butok, Freescale Semiconductor
-+ *            Added suport of MCF5227x DSPI module.
-+ *   v0.002   2007    Yaroslav Vinogradov, Freescale Semiconductor
-+ *            Added suport of MCF5445x DSPI module.
-+ *   v0.001   2005            Mike Lavender, Intec Automation,
-+ *            Intial version. Coldfire QSPI master driver.
-+ *
-+ */
-+
-+
-+/****************************************************************************/
-+
-+/*
-+ * Includes
-+ */
-+
-+#include <linux/autoconf.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/device.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+#include <linux/workqueue.h>
-+#include <linux/delay.h>
-+
-+#include <asm/delay.h>
-+#include <asm/mcfsim.h>
-+#include <asm/mcfqspi.h>
-+#include <asm/coldfire.h>
-+
-+#if defined(CONFIG_M5445X)
-+      #include <asm/virtconvert.h>
-+
-+      #define SPI_DSPI
-+      #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
-+              #define SPI_DSPI_EDMA
-+              #ifdef CONFIG_MMU
-+                      #define SPI_USE_MMU
-+              #endif
-+              #include <asm/mcf5445x_edma.h>
-+      #endif
-+
-+      #include <asm/mcf5445x_dspi.h>
-+#endif
-+
-+#if defined(CONFIG_M547X_8X)
-+      #define SPI_DSPI
-+
-+      #include <asm/virtconvert.h>
-+      #include <asm/m5485dspi.h>
-+#endif
-+
-+#ifdef CONFIG_M5227x
-+      #define SPI_DSPI
-+
-+      #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
-+              #define SPI_DSPI_EDMA
-+      #endif
-+#endif
-+
-+
-+#if defined(SPI_DSPI_EDMA)
-+
-+/* edma buffer size in transfer units (32bits) */
-+#define EDMA_BUFFER_SIZE      (PAGE_SIZE/4)
-+#define EDMA_BUFSIZE_KMALLOC  (EDMA_BUFFER_SIZE*4)
-+
-+#define DSPI_DMA_RX_TCD               MCF_EDMA_CHAN_DSPI_RX
-+#define DSPI_DMA_TX_TCD       MCF_EDMA_CHAN_DSPI_TX
-+
-+#include <asm/mcf_edma.h>
-+#endif
-+
-+MODULE_AUTHOR("Mike Lavender");
-+MODULE_DESCRIPTION("ColdFire SPI Contoller");
-+MODULE_LICENSE("GPL");
-+
-+#define DRIVER_NAME "Coldfire QSPI/DSPI"
-+
-+/****************************************************************************/
-+
-+/*
-+ * Local constants and macros
-+ */
-+
-+#define QSPI_RAM_SIZE         0x10    /* 16 word table */
-+#define QSPI_TRANSMIT_RAM     0x00
-+#define QSPI_RECEIVE_RAM      0x10
-+#define QSPI_COMMAND_RAM      0x20
-+
-+#define QSPI_COMMAND          0x7000  /* 15:   X = Continuous CS
-+                                       * 14:   1 = Get BITSE from QMR[BITS]
-+                                       * 13:   1 = Get DT    from QDLYR[DTL]
-+                                       * 12:   1 = Get DSK   from QDLYR[QCD]
-+                                       * 8-11: XXXX = next 4 bytes for CS
-+                                       * 0-7:  0000 0000 Reserved
-+                                       */
-+
-+#define QIR_WCEF                0x0008  /* write collison */
-+#define QIR_ABRT                0x0004  /* abort */
-+#define QIR_SPIF                0x0001  /* finished */
-+
-+#define QIR_WCEFE                     0x0800
-+#define QIR_ABRTE                     0x0400
-+#define QIR_SPIFE                     0x0100
-+
-+#define QIR_WCEFB                     0x8000
-+#define QIR_ABRTB                     0x4000
-+#define QIR_ABRTL                     0x1000
-+
-+#define QMR_BITS              0x3C00
-+#define QMR_BITS_8              0x2000
-+
-+#define QCR_CONT                      0x8000
-+
-+#define QDLYR_SPE             0x8000
-+
-+#define QWR_ENDQP_MASK                0x0F00
-+#define QWR_CSIV              0x1000  /* 1 = active low chip selects */
-+
-+
-+#define START_STATE ((void*)0)
-+#define RUNNING_STATE ((void*)1)
-+#define DONE_STATE ((void*)2)
-+#define ERROR_STATE ((void*)-1)
-+
-+#define QUEUE_RUNNING 0
-+#define QUEUE_STOPPED 1
-+
-+/****************************************************************************/
-+
-+/*
-+ * Local Data Structures
-+ */
-+
-+struct transfer_state {
-+      u32 index;
-+      u32 len;
-+      void *tx;
-+      void *tx_end;
-+      void *rx;
-+      void *rx_end;
-+      char flags;
-+#define TRAN_STATE_RX_VOID       0x01
-+#define TRAN_STATE_TX_VOID       0x02
-+#define TRAN_STATE_WORD_ODD_NUM          0x04
-+      u8 cs;
-+      u16 void_write_data;
-+      unsigned cs_change:1;
-+};
-+
-+typedef struct {
-+      unsigned master:1;
-+      unsigned dohie:1;
-+      unsigned bits:4;
-+      unsigned cpol:1;
-+      unsigned cpha:1;
-+      unsigned baud:8;
-+} QMR;
-+
-+typedef struct {
-+      unsigned spe:1;
-+      unsigned qcd:7;
-+      unsigned dtl:8;
-+} QDLYR;
-+
-+typedef struct {
-+      unsigned halt:1;
-+      unsigned wren:1;
-+      unsigned wrto:1;
-+      unsigned csiv:1;
-+      unsigned endqp:4;
-+      unsigned cptqp:4;
-+      unsigned newqp:4;
-+} QWR;
-+
-+
-+typedef struct {
-+      unsigned master:1;
-+      unsigned cont_scke:1;
-+      unsigned dconf:2;
-+      unsigned frz:1;
-+      unsigned mtfe:1;
-+      unsigned pcsse:1;
-+      unsigned rooe:1;
-+      unsigned pcsis:8;
-+      unsigned reserved15:1;
-+      unsigned mdis:1;
-+      unsigned dis_tx:1;
-+      unsigned dis_rxf:1;
-+      unsigned clr_tx:1;
-+      unsigned clr_rxf:1;
-+      unsigned smpl_pt:2;
-+      unsigned reserved71:7;
-+      unsigned halt:1;
-+} DSPI_MCR;
-+
-+typedef struct {
-+      unsigned dbr:1;
-+      unsigned fmsz:4;
-+      unsigned cpol:1;
-+      unsigned cpha:1;
-+      unsigned lsbfe:1;
-+      unsigned pcssck:2;
-+      unsigned pasc:2;
-+      unsigned pdt:2;
-+      unsigned pbr:2;
-+      unsigned cssck:4;
-+      unsigned asc:4;
-+      unsigned dt:4;
-+      unsigned br:4;
-+} DSPI_CTAR;
-+
-+struct chip_data {
-+#if defined(SPI_DSPI)
-+      /* dspi data */
-+      union {
-+              u32 mcr_val;
-+              DSPI_MCR mcr;
-+      };
-+      union {
-+              u32 ctar_val;
-+              DSPI_CTAR ctar;
-+      };
-+#else
-+      union {
-+              u16 qmr_val;
-+              QMR qmr;
-+      };
-+      union {
-+              u16 qdlyr_val;
-+              QDLYR qdlyr;
-+      };
-+      union {
-+              u16 qwr_val;
-+              QWR qwr;
-+      };
-+#endif
-+
-+      u16 void_write_data;
-+};
-+
-+
-+struct driver_data {
-+      /* Driver model hookup */
-+      struct platform_device *pdev;
-+
-+      /* SPI framework hookup */
-+      struct spi_master *master;
-+
-+      /* Driver message queue */
-+      struct workqueue_struct *workqueue;
-+      struct work_struct pump_messages;
-+      spinlock_t lock;
-+      struct list_head queue;
-+      int busy;
-+      int run;
-+
-+      /* Message Transfer pump */
-+      struct tasklet_struct pump_transfers;
-+
-+      /* Current message transfer state info */
-+      struct spi_message* cur_msg;
-+      struct spi_transfer* cur_transfer;
-+      struct chip_data *cur_chip;
-+      size_t len;
-+      void *tx;
-+      void *tx_end;
-+      void *rx;
-+      void *rx_end;
-+      char flags;
-+#define TRAN_STATE_RX_VOID       0x01
-+#define TRAN_STATE_TX_VOID       0x02
-+#define TRAN_STATE_WORD_ODD_NUM          0x04
-+      u8 cs;
-+      u16 void_write_data;
-+      unsigned cs_change:1;
-+
-+      u32 trans_cnt;
-+      u32 wce_cnt;
-+      u32 abrt_cnt;
-+#if defined(SPI_DSPI)
-+      u32 *mcr;                       /* DSPI MCR register */
-+      u32 *ctar;                      /* DSPI CTAR register */
-+      u32 *dspi_dtfr;         /* DSPI DTFR register */
-+      u32 *dspi_drfr;         /* DSPI DRFR register */
-+      u32 *dspi_rser;         /* DSPI RSER register */
-+      u32 *dspi_sr;           /* DSPI status register */
-+      u8      dspi_ctas;              /* DSPI CTAS value*/
-+#if defined(SPI_DSPI_EDMA)
-+      void*   edma_tx_buf;
-+      void*   edma_rx_buf;
-+#endif
-+#else
-+      u16 *qmr;          /* QSPI mode register      */
-+      u16 *qdlyr;        /* QSPI delay register     */
-+      u16 *qwr;          /* QSPI wrap register      */
-+      u16 *qir;          /* QSPI interrupt register */
-+      u16 *qar;          /* QSPI address register   */
-+      u16 *qdr;          /* QSPI data register      */
-+      u16 *qcr;          /* QSPI command register   */
-+#endif
-+#if defined(CONFIG_M532x) || defined(CONFIG_M537x)
-+      u16 *par;          /* Pin assignment register */
-+#else
-+      u8  *par;          /* Pin assignment register */
-+#endif
-+      u8  *int_icr;      /* Interrupt level and priority register */
-+      u32 *int_mr;       /* Interrupt mask register */
-+      void (*cs_control)(u8 cs, u8 command);
-+};
-+
-+#define DSPI_CS(cs) ((1<<(cs))<<16)
-+
-+
-+/****************************************************************************/
-+
-+/*
-+ * SPI local functions
-+ */
-+
-+static void *next_transfer(struct driver_data *drv_data)
-+{
-+      struct spi_message *msg = drv_data->cur_msg;
-+      struct spi_transfer *trans = drv_data->cur_transfer;
-+
-+      /* Move to next transfer */
-+      if (trans->transfer_list.next != &msg->transfers) {
-+              drv_data->cur_transfer =
-+                      list_entry(trans->transfer_list.next,
-+                                      struct spi_transfer,
-+                                      transfer_list);
-+              return RUNNING_STATE;
-+      } else
-+              return DONE_STATE;
-+}
-+
-+
-+#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(15)
-+#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(15)
-+#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(7)
-+#define DSPI_FIFO_SIZE 16
-+
-+static inline int is_word_transfer(struct driver_data *drv_data)
-+{
-+#if defined(SPI_DSPI)
-+      return ((*drv_data->ctar & DSPI_BITS_16) == DSPI_BITS_8) ? 0 : 1;
-+#else
-+      return ((*drv_data->qmr & QMR_BITS) == QMR_BITS_8) ? 0 : 1;
-+#endif
-+}
-+
-+static void inline set_8bit_transfer_mode(struct driver_data *drv_data)
-+{
-+#if defined(SPI_DSPI)
-+      *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_8;
-+#else
-+      *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS) | QMR_BITS_8;
-+#endif
-+}
-+
-+static void inline set_16bit_transfer_mode(struct driver_data *drv_data)
-+{
-+#if defined(SPI_DSPI)
-+      *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_16;
-+#else
-+      *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS);
-+#endif
-+}
-+
-+static int write(struct driver_data *drv_data)
-+{
-+      int tx_count = 0;
-+#ifndef SPI_DSPI
-+      int cmd_count = 0;
-+#endif
-+      int tx_word;
-+
-+#if defined(SPI_DSPI)
-+#if defined(SPI_DSPI_EDMA)
-+      u32* edma_wr;
-+#endif
-+      u16 d16;
-+      u8  d8;
-+      u32 dspi_pushr;
-+      int first = 1;
-+#endif
-+
-+      tx_word = is_word_transfer(drv_data);
-+
-+      /* If we are in word mode, but only have a single byte to transfer
-+       * then switch to byte mode temporarily.  Will switch back at the
-+       * end of the transfer. */
-+      if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
-+              drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
-+              set_8bit_transfer_mode(drv_data);
-+              tx_word = 0;
-+      }
-+
-+
-+#if defined(SPI_DSPI)
-+#if defined(SPI_DSPI_EDMA)
-+      edma_wr = (u32*)(drv_data->edma_tx_buf);
-+#endif
-+
-+#if defined(SPI_DSPI_EDMA)
-+      while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) {
-+#else
-+      while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) {
-+#endif
-+              if (tx_word) {
-+                      if ((drv_data->tx_end - drv_data->tx) == 1)
-+                              break;
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID)) {
-+                              d16 = *(u16 *)drv_data->tx;
-+                      } else {
-+                              d16 = drv_data->void_write_data;
-+                      }
-+
-+                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16)
-+                                      | DSPI_CS(drv_data->cs)
-+                                      | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas);
-+                      drv_data->tx += 2;
-+
-+#if defined(SPI_DSPI_EDMA)
-+                      if (drv_data->tx == drv_data->tx_end  || tx_count==EDMA_BUFFER_SIZE-1) {
-+#else
-+                      if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
-+#endif
-+                              /* last transfer in the queue */
-+                              dspi_pushr |= MCF_DSPI_DTFR_EOQ;
-+                              if (drv_data->cs_change) {
-+                                      dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
-+                              }
-+                      }
-+
-+                      if (first) {
-+                              first = 0;
-+                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
-+                      }
-+#if defined(SPI_DSPI_EDMA)
-+                      *edma_wr = dspi_pushr;
-+                      edma_wr++;
-+#else
-+                      *drv_data->dspi_dtfr = dspi_pushr;
-+#endif
-+
-+
-+              } else {
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID)) {
-+                              d8 = *(u8 *)drv_data->tx;
-+                      } else {
-+                              d8 = *(u8 *)&drv_data->void_write_data;
-+                      }
-+
-+                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8)
-+                                               | DSPI_CS(drv_data->cs)
-+                                               | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
-+                                               | MCF_DSPI_DTFR_CONT;
-+
-+                      drv_data->tx++;
-+
-+                      if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
-+                              /* last transfer in the queue */
-+                              dspi_pushr |= MCF_DSPI_DTFR_EOQ;
-+                              if (drv_data->cs_change) {
-+                                      dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
-+                              }
-+                      }
-+
-+                      if (first) {
-+                              first = 0;
-+                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
-+                      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+                      *edma_wr = dspi_pushr;
-+                      edma_wr++;
-+#else
-+                      *drv_data->dspi_dtfr = dspi_pushr;
-+#endif
-+
-+              }
-+              tx_count++;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+
-+      if (tx_count>0) {
-+
-+              /* TBD: initiate eDMA transfer */
-+              mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD,
-+#ifdef SPI_USE_MMU
-+                                      virt_to_phys(drv_data->edma_tx_buf),
-+#else
-+                                      drv_data->edma_tx_buf,
-+#endif
-+                                      (u32)drv_data->dspi_dtfr,
-+                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                                      4, /* soff */
-+                                      4, /* nbytes */
-+                                      0, /* slast */
-+                                      tx_count, /* citer */
-+                                      tx_count, /* biter */
-+                                      0, /* doff */
-+                                      0, /* dlastsga */
-+                                      0, /* major_int */
-+                                      1  /* disable_req */
-+                                      );
-+
-+              mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD,
-+                                      (u32)drv_data->dspi_drfr,
-+#ifdef SPI_USE_MMU
-+                                      virt_to_phys(drv_data->edma_rx_buf),
-+#else
-+                                      drv_data->edma_rx_buf,
-+#endif
-+                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                                      0, /* soff */
-+                                      4, /* nbytes */
-+                                      0, /* slast */
-+                                      tx_count, /* citer */
-+                                      tx_count, /* biter */
-+                                      4, /* doff */
-+                                      0, /* dlastsga */
-+                                      0, /* major_int */
-+                                      1  /* disable_req */
-+                                      );
-+
-+
-+              start_edma_transfer(DSPI_DMA_TX_TCD); /* transmit SPI data */
-+              start_edma_transfer(DSPI_DMA_RX_TCD); /* receive SPI data */
-+      }
-+#endif
-+
-+#else
-+
-+      *drv_data->qar = QSPI_TRANSMIT_RAM;
-+      while ((drv_data->tx < drv_data->tx_end) && (tx_count < QSPI_RAM_SIZE)) {
-+              if (tx_word) {
-+                      if ((drv_data->tx_end - drv_data->tx) == 1)
-+                              break;
-+
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
-+                              *drv_data->qdr = *(u16 *)drv_data->tx;
-+                      else
-+                              *drv_data->qdr = drv_data->void_write_data;
-+                      drv_data->tx += 2;
-+              } else {
-+                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
-+                              *drv_data->qdr = *(u8 *)drv_data->tx;
-+                      else
-+                              *drv_data->qdr = *(u8 *)&drv_data->void_write_data;
-+                      drv_data->tx++;
-+              }
-+              tx_count++;
-+      }
-+
-+
-+      *drv_data->qar = QSPI_COMMAND_RAM;
-+      while (cmd_count < tx_count) {
-+              u16 qcr =   QSPI_COMMAND
-+                        | QCR_CONT
-+                        | (~((0x01 << drv_data->cs) << 8) & 0x0F00);
-+
-+              if ( (cmd_count == tx_count - 1)
-+                   && (drv_data->tx == drv_data->tx_end)
-+                   && (drv_data->cs_change) ) {
-+                      qcr &= ~QCR_CONT;
-+              }
-+              *drv_data->qcr = qcr;
-+              cmd_count++;
-+      }
-+
-+      *drv_data->qwr = (*drv_data->qwr & ~QWR_ENDQP_MASK) | ((cmd_count - 1) << 8);
-+
-+      /* Fire it up! */
-+      *drv_data->qdlyr |= QDLYR_SPE;
-+#endif
-+
-+      return tx_count;
-+}
-+
-+
-+static int read(struct driver_data *drv_data)
-+{
-+      int rx_count = 0;
-+      int rx_word;
-+#if defined(SPI_DSPI_EDMA)
-+      u32* rx_edma;
-+#endif
-+      u16 d;
-+      rx_word = is_word_transfer(drv_data);
-+
-+#if defined(SPI_DSPI)
-+#if defined(SPI_DSPI_EDMA)
-+      rx_edma = (u32*) drv_data->edma_tx_buf;
-+      while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) {
-+#else
-+      while ((drv_data->rx < drv_data->rx_end) && (rx_count < DSPI_FIFO_SIZE)) {
-+#endif
-+              if (rx_word) {
-+                      if ((drv_data->rx_end - drv_data->rx) == 1)
-+                              break;
-+#if defined(SPI_DSPI_EDMA)
-+                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
-+                      rx_edma++;
-+#else
-+                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
-+#endif
-+
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u16 *)drv_data->rx = d;
-+                      drv_data->rx += 2;
-+              } else {
-+#if defined(SPI_DSPI_EDMA)
-+                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
-+                      rx_edma++;
-+#else
-+                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
-+#endif
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u8 *)drv_data->rx = d;
-+                      drv_data->rx++;
-+              }
-+              rx_count++;
-+      }
-+#else
-+      *drv_data->qar = QSPI_RECEIVE_RAM;
-+      while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) {
-+              if (rx_word) {
-+                      if ((drv_data->rx_end - drv_data->rx) == 1)
-+                              break;
-+
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u16 *)drv_data->rx = *drv_data->qdr;
-+                      drv_data->rx += 2;
-+              } else {
-+                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
-+                              *(u8 *)drv_data->rx = *drv_data->qdr;
-+                      drv_data->rx++;
-+              }
-+              rx_count++;
-+      }
-+#endif
-+
-+      return rx_count;
-+}
-+
-+
-+static inline void qspi_setup_chip(struct driver_data *drv_data)
-+{
-+      struct chip_data *chip = drv_data->cur_chip;
-+
-+#if defined(SPI_DSPI)
-+
-+      *drv_data->mcr = chip->mcr_val;
-+
-+      /* TBD: remove later */
-+/* JKM -- validate */
-+      chip->ctar_val = 0x78560118;
-+
-+      *drv_data->ctar = chip->ctar_val;
-+      *drv_data->dspi_rser =  0
-+                              | MCF_DSPI_DRSER_EOQFE
-+#if defined(SPI_DSPI_EDMA)
-+                              | MCF_DSPI_DRSER_TFFFE
-+                              | MCF_DSPI_DRSER_TFFFS
-+#endif
-+                              ;
-+#else
-+      *drv_data->qmr = chip->qmr_val;
-+      *drv_data->qdlyr = chip->qdlyr_val;
-+      *drv_data->qwr = chip->qwr_val;
-+
-+      /*
-+       * Enable all the interrupts and clear all the flags
-+       */
-+      *drv_data->qir =  (QIR_SPIFE | QIR_ABRTE | QIR_WCEFE)
-+                      | (QIR_WCEFB | QIR_ABRTB | QIR_ABRTL)
-+                      | (QIR_SPIF  | QIR_ABRT  | QIR_WCEF);
-+#endif
-+}
-+
-+#if defined(SPI_DSPI_EDMA)
-+static int edma_tx_handler(int channel, void* dev)
-+{
-+      if (channel == DSPI_DMA_TX_TCD) {
-+              stop_edma_transfer(DSPI_DMA_TX_TCD);
-+      }
-+      return IRQ_HANDLED;
-+}
-+
-+static int edma_rx_handler(int channel, void* dev)
-+{
-+      if (channel == DSPI_DMA_RX_TCD) {
-+              stop_edma_transfer(DSPI_DMA_RX_TCD);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+#endif
-+
-+static irqreturn_t qspi_interrupt(int irq, void *dev_id)
-+{
-+      struct driver_data *drv_data = (struct driver_data *)dev_id;
-+      struct spi_message *msg = drv_data->cur_msg;
-+#if defined(SPI_DSPI)
-+#if !defined(SPI_DSPI_EDMA)
-+      u32 irq_status = *drv_data->dspi_sr;
-+#endif
-+#else
-+      u16 irq_status = *drv_data->qir;
-+#endif
-+
-+      /* Clear all flags immediately */
-+#if defined(SPI_DSPI)
-+      *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF;
-+#else
-+      *drv_data->qir |= (QIR_SPIF | QIR_ABRT | QIR_WCEF);
-+#endif
-+
-+      if (!drv_data->cur_msg || !drv_data->cur_msg->state) {
-+#if !defined(SPI_DSPI_EDMA)
-+              /* if eDMA is used it happens some time (at least once)*/
-+              printk(KERN_ERR "coldfire-qspi: bad message or transfer "
-+              "state in interrupt handler. IRQ status=%x\n", irq_status);
-+#endif
-+              return IRQ_NONE;
-+      }
-+
-+#if !defined(SPI_DSPI)
-+      if (irq_status & QIR_SPIF) {
-+#endif
-+              /*
-+               * Read the data into the buffer and reload and start
-+               * queue with new data if not finished.  If finished
-+               * then setup the next transfer
-+               */
-+               read(drv_data);
-+
-+               if (drv_data->rx == drv_data->rx_end) {
-+                      /*
-+                       * Finished now - fall through and schedule next
-+                       * transfer tasklet
-+                       */
-+                      if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) {
-+                              set_16bit_transfer_mode(drv_data);
-+                      }
-+
-+                      msg->state = next_transfer(drv_data);
-+                      msg->actual_length += drv_data->len;
-+               } else {
-+                      /* not finished yet - keep going */
-+                      write(drv_data);
-+                      return IRQ_HANDLED;
-+               }
-+#if !defined(SPI_DSPI)
-+      } else {
-+              if (irq_status & QIR_WCEF)
-+                      drv_data->wce_cnt++;
-+
-+              if (irq_status & QIR_ABRT)
-+                      drv_data->abrt_cnt++;
-+
-+              msg->state = ERROR_STATE;
-+      }
-+#endif
-+
-+      tasklet_schedule(&drv_data->pump_transfers);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+/* caller already set message->status; dma and pio irqs are blocked */
-+static void giveback(struct driver_data *drv_data)
-+{
-+      struct spi_transfer* last_transfer;
-+      unsigned long flags;
-+      struct spi_message *msg;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+      msg = drv_data->cur_msg;
-+      drv_data->cur_msg = NULL;
-+      drv_data->cur_transfer = NULL;
-+      drv_data->cur_chip = NULL;
-+      queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      last_transfer = list_entry(msg->transfers.prev,
-+                                      struct spi_transfer,
-+                                      transfer_list);
-+
-+      if (!last_transfer->cs_change)
-+              drv_data->cs_control(drv_data->cs, QSPI_CS_DROP);
-+
-+      msg->state = NULL;
-+      if (msg->complete)
-+              msg->complete(msg->context);
-+}
-+
-+
-+static void pump_transfers(unsigned long data)
-+{
-+      struct driver_data *drv_data = (struct driver_data *)data;
-+      struct spi_message *message = NULL;
-+      struct spi_transfer *transfer = NULL;
-+      struct spi_transfer *previous = NULL;
-+      struct chip_data *chip = NULL;
-+      unsigned long flags;
-+
-+      /* Get current state information */
-+      message = drv_data->cur_msg;
-+      transfer = drv_data->cur_transfer;
-+      chip = drv_data->cur_chip;
-+
-+      /* Handle for abort */
-+      if (message->state == ERROR_STATE) {
-+              message->status = -EIO;
-+              giveback(drv_data);
-+              return;
-+      }
-+
-+      /* Handle end of message */
-+      if (message->state == DONE_STATE) {
-+              message->status = 0;
-+              giveback(drv_data);
-+              return;
-+      }
-+
-+      if (message->state == START_STATE) {
-+              qspi_setup_chip(drv_data);
-+
-+              if (drv_data->cs_control)
-+                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
-+      }
-+
-+      /* Delay if requested at end of transfer*/
-+      if (message->state == RUNNING_STATE) {
-+              previous = list_entry(transfer->transfer_list.prev,
-+                                      struct spi_transfer,
-+                                      transfer_list);
-+
-+              if (drv_data->cs_control && transfer->cs_change)
-+                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_DROP);
-+
-+              if (previous->delay_usecs)
-+                      udelay(previous->delay_usecs);
-+
-+              if (drv_data->cs_control && transfer->cs_change)
-+                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
-+      }
-+
-+      drv_data->flags = 0;
-+      drv_data->tx = (void *)transfer->tx_buf;
-+      drv_data->tx_end = drv_data->tx + transfer->len;
-+      drv_data->rx = transfer->rx_buf;
-+      drv_data->rx_end = drv_data->rx + transfer->len;
-+      drv_data->len = transfer->len;
-+      if (!drv_data->rx)
-+              drv_data->flags |= TRAN_STATE_RX_VOID;
-+      if (!drv_data->tx)
-+              drv_data->flags |= TRAN_STATE_TX_VOID;
-+      drv_data->cs = message->spi->chip_select;
-+      drv_data->cs_change = transfer->cs_change;
-+      drv_data->void_write_data = chip->void_write_data;
-+
-+      message->state = RUNNING_STATE;
-+
-+      /* Go baby, go */
-+      local_irq_save(flags);
-+      write(drv_data);
-+      local_irq_restore(flags);
-+}
-+
-+
-+static void pump_messages(struct work_struct *work)
-+{
-+      struct driver_data *drv_data;
-+      unsigned long flags;
-+
-+      drv_data = container_of(work, struct driver_data, pump_messages);
-+
-+      /* Lock queue and check for queue work */
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+      if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) {
-+              drv_data->busy = 0;
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return;
-+      }
-+
-+      /* Make sure we are not already running a message */
-+      if (drv_data->cur_msg) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return;
-+      }
-+
-+      /* Extract head of queue */
-+      drv_data->cur_msg = list_entry(drv_data->queue.next,
-+                                      struct spi_message, queue);
-+      list_del_init(&drv_data->cur_msg->queue);
-+
-+      /* Initial message state*/
-+      drv_data->cur_msg->state = START_STATE;
-+      drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
-+                                              struct spi_transfer,
-+                                              transfer_list);
-+
-+      /* Setup the SPI Registers using the per chip configuration */
-+      drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
-+
-+      /* Mark as busy and launch transfers */
-+      tasklet_schedule(&drv_data->pump_transfers);
-+
-+      drv_data->busy = 1;
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+}
-+
-+/****************************************************************************/
-+
-+/*
-+ * SPI master implementation
-+ */
-+
-+static int transfer(struct spi_device *spi, struct spi_message *msg)
-+{
-+      struct driver_data *drv_data = spi_master_get_devdata(spi->master);
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      if (drv_data->run == QUEUE_STOPPED) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return -ESHUTDOWN;
-+      }
-+
-+      msg->actual_length = 0;
-+      msg->status = -EINPROGRESS;
-+      msg->state = START_STATE;
-+
-+      list_add_tail(&msg->queue, &drv_data->queue);
-+
-+      if (drv_data->run == QUEUE_RUNNING && !drv_data->busy)
-+              queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      return 0;
-+}
-+
-+
-+static int setup(struct spi_device *spi)
-+{
-+      struct coldfire_spi_chip *chip_info;
-+      struct chip_data *chip;
-+#ifndef SPI_DSPI
-+      u32 baud_divisor = 255;
-+#endif
-+
-+      chip_info = (struct coldfire_spi_chip *)spi->controller_data;
-+
-+      /* Only alloc on first setup */
-+      chip = spi_get_ctldata(spi);
-+      if (chip == NULL) {
-+              chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL);
-+              if (!chip)
-+                      return -ENOMEM;
-+              spi->mode = chip_info->mode;
-+              spi->bits_per_word = chip_info->bits_per_word;
-+      }
-+
-+#if defined(SPI_DSPI)
-+      chip->mcr.master = 1;
-+      chip->mcr.cont_scke = 0;
-+      chip->mcr.dconf = 0;
-+      chip->mcr.frz = 0;
-+      chip->mcr.mtfe = 0;
-+      chip->mcr.pcsse = 0;
-+      chip->mcr.rooe = 0;
-+      chip->mcr.pcsis = 0xFF;
-+      chip->mcr.reserved15 = 0;
-+      chip->mcr.mdis = 0;
-+      chip->mcr.dis_tx = 0;
-+      chip->mcr.dis_rxf = 0;
-+      chip->mcr.clr_tx = 1;
-+      chip->mcr.clr_rxf = 1;
-+      chip->mcr.smpl_pt = 0;
-+      chip->mcr.reserved71 = 0;
-+      chip->mcr.halt = 0;
-+
-+      if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
-+              chip->ctar.fmsz = spi->bits_per_word-1;
-+      } else {
-+              printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
-+              kfree(chip);
-+              return -ENODEV;
-+      }
-+
-+      if (spi->mode & SPI_CPHA)
-+              chip->ctar.cpha = 1;
-+      else
-+              chip->ctar.cpha = 0;
-+
-+      if (spi->mode & SPI_CPOL)
-+              chip->ctar.cpol = 1;
-+      else
-+              chip->ctar.cpol = 0;
-+
-+      if (spi->mode & SPI_LSB_FIRST)
-+              chip->ctar.lsbfe = 1;
-+      else
-+              chip->ctar.lsbfe = 0;
-+
-+      /* This values are default for audio device */
-+      chip->ctar.dbr = 0;
-+      chip->ctar.pbr = 2;
-+      chip->ctar.br = 8;
-+
-+      /* This values are default for audio device */
-+      chip->ctar.pcssck = 1;
-+      chip->ctar.pasc = 1;
-+      chip->ctar.pdt = 1;
-+      chip->ctar.cssck = 0;
-+      chip->ctar.asc = 1;
-+      chip->ctar.dt = 1;
-+
-+      chip->void_write_data = chip_info->void_write_data;
-+
-+#else
-+
-+      chip->qwr.csiv = 1;    /* Chip selects are active low */
-+      chip->qmr.master = 1;  /* Must set to master mode */
-+      chip->qmr.dohie = 1;   /* Data output high impediance enabled */
-+      chip->void_write_data = chip_info->void_write_data;
-+
-+      chip->qdlyr.qcd = chip_info->del_cs_to_clk;
-+      chip->qdlyr.dtl = chip_info->del_after_trans;
-+
-+      if (spi->max_speed_hz != 0)
-+              baud_divisor = (MCF_CLK/(2*spi->max_speed_hz));
-+
-+      if (baud_divisor < 2)
-+              baud_divisor = 2;
-+
-+      if (baud_divisor > 255)
-+              baud_divisor = 255;
-+
-+      chip->qmr.baud = baud_divisor;
-+
-+      /*printk( "SPI: spi->max_speed_hz %d\n", spi->max_speed_hz );*/
-+      /*printk( "SPI: Baud set to %d\n", chip->qmr.baud );*/
-+
-+      if (spi->mode & SPI_CPHA)
-+              chip->qmr.cpha = 1;
-+
-+      if (spi->mode & SPI_CPOL)
-+              chip->qmr.cpol = 1;
-+
-+      if (spi->bits_per_word == 16) {
-+              chip->qmr.bits = 0;
-+      } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) {
-+              chip->qmr.bits = spi->bits_per_word;
-+      } else {
-+              printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
-+              kfree(chip);
-+              return -ENODEV;
-+      }
-+
-+#endif
-+
-+      spi_set_ctldata(spi, chip);
-+
-+      return 0;
-+}
-+
-+static int init_queue(struct driver_data *drv_data)
-+{
-+      INIT_LIST_HEAD(&drv_data->queue);
-+      spin_lock_init(&drv_data->lock);
-+
-+      drv_data->run = QUEUE_STOPPED;
-+      drv_data->busy = 0;
-+
-+      tasklet_init(&drv_data->pump_transfers,
-+                      pump_transfers, (unsigned long)drv_data);
-+
-+      INIT_WORK(&drv_data->pump_messages, pump_messages);
-+
-+      drv_data->workqueue = create_singlethread_workqueue(
-+                                      drv_data->master->dev.parent->bus_id);
-+      if (drv_data->workqueue == NULL)
-+              return -EBUSY;
-+
-+      return 0;
-+}
-+
-+static int start_queue(struct driver_data *drv_data)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      if (drv_data->run == QUEUE_RUNNING || drv_data->busy) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              return -EBUSY;
-+      }
-+
-+      drv_data->run = QUEUE_RUNNING;
-+      drv_data->cur_msg = NULL;
-+      drv_data->cur_transfer = NULL;
-+      drv_data->cur_chip = NULL;
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      queue_work(drv_data->workqueue, &drv_data->pump_messages);
-+
-+      return 0;
-+}
-+
-+static int stop_queue(struct driver_data *drv_data)
-+{
-+      unsigned long flags;
-+      unsigned limit = 500;
-+      int status = 0;
-+
-+      spin_lock_irqsave(&drv_data->lock, flags);
-+
-+      /* This is a bit lame, but is optimized for the common execution path.
-+       * A wait_queue on the drv_data->busy could be used, but then the common
-+       * execution path (pump_messages) would be required to call wake_up or
-+       * friends on every SPI message. Do this instead */
-+      drv_data->run = QUEUE_STOPPED;
-+      while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
-+              spin_unlock_irqrestore(&drv_data->lock, flags);
-+              msleep(10);
-+              spin_lock_irqsave(&drv_data->lock, flags);
-+      }
-+
-+      if (!list_empty(&drv_data->queue) || drv_data->busy)
-+              status = -EBUSY;
-+
-+      spin_unlock_irqrestore(&drv_data->lock, flags);
-+
-+      return status;
-+}
-+
-+static int destroy_queue(struct driver_data *drv_data)
-+{
-+      int status;
-+
-+      status = stop_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      destroy_workqueue(drv_data->workqueue);
-+
-+      return 0;
-+}
-+
-+
-+static void cleanup(struct spi_device *spi)
-+{
-+      struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
-+
-+      dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n",
-+              spi->master->bus_num, spi->chip_select);
-+
-+      kfree(chip);
-+}
-+
-+
-+/****************************************************************************/
-+
-+/*
-+ * Generic Device driver routines and interface implementation
-+ */
-+
-+static int coldfire_spi_probe(struct platform_device *pdev)
-+{
-+      struct device *dev = &pdev->dev;
-+      struct coldfire_spi_master *platform_info;
-+      struct spi_master *master;
-+      struct driver_data *drv_data = 0;
-+      struct resource *memory_resource;
-+      int irq;
-+      int status = 0;
-+      int i;
-+
-+      platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
-+
-+      master = spi_alloc_master(dev, sizeof(struct driver_data));
-+      if (!master)
-+              return -ENOMEM;
-+
-+      drv_data = spi_master_get_devdata(master);
-+      drv_data->master = master;
-+
-+      INIT_LIST_HEAD(&drv_data->queue);
-+      spin_lock_init(&drv_data->lock);
-+
-+      master->bus_num = platform_info->bus_num;
-+      master->num_chipselect = platform_info->num_chipselect;
-+      master->cleanup = cleanup;
-+      master->setup = setup;
-+      master->transfer = transfer;
-+
-+      drv_data->cs_control = platform_info->cs_control;
-+      if (drv_data->cs_control)
-+              for(i = 0; i < master->num_chipselect; i++)
-+                      drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
-+
-+      /* Setup register addresses */
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-module");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "can not find platform module memory\n");
-+              goto out_error_master_alloc;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+      drv_data->edma_tx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA);
-+      if (!drv_data->edma_tx_buf) {
-+              dev_dbg(dev, "cannot allocate eDMA TX memory\n");
-+              goto out_error_master_alloc;
-+      }
-+      drv_data->edma_rx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA);
-+      if (!drv_data->edma_rx_buf) {
-+              kfree(drv_data->edma_tx_buf);
-+              dev_dbg(dev, "cannot allocate eDMA RX memory\n");
-+              goto out_error_master_alloc;
-+      }
-+#endif
-+      
-+#if defined(SPI_DSPI)
-+
-+      drv_data->mcr       = (void *)(memory_resource->start + 0x00000000);
-+      drv_data->ctar      = (void *)(memory_resource->start + 0x0000000C);
-+      drv_data->dspi_sr   = (void *)(memory_resource->start + 0x0000002C);
-+      drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030);
-+      drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034);
-+      drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038);
-+
-+#else
-+
-+      drv_data->qmr   = (void *)(memory_resource->start + 0x00000000);
-+      drv_data->qdlyr = (void *)(memory_resource->start + 0x00000004);
-+      drv_data->qwr   = (void *)(memory_resource->start + 0x00000008);
-+      drv_data->qir   = (void *)(memory_resource->start + 0x0000000c);
-+      drv_data->qar   = (void *)(memory_resource->start + 0x00000010);
-+      drv_data->qdr   = (void *)(memory_resource->start + 0x00000014);
-+      drv_data->qcr   = (void *)(memory_resource->start + 0x00000014);
-+
-+#endif
-+
-+      /* Setup register addresses */
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-par");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "can not find platform par memory\n");
-+              goto out_error_master_alloc;
-+      }
-+
-+      drv_data->par = (void *)memory_resource->start;
-+
-+      /* Setup register addresses */
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-level");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "can not find platform par memory\n");
-+              goto out_error_master_alloc;
-+      }
-+
-+      drv_data->int_icr = (void *)memory_resource->start;
-+
-+      /* Setup register addresses */
-+      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-mask");
-+      if (!memory_resource) {
-+              dev_dbg(dev, "can not find platform par memory\n");
-+              goto out_error_master_alloc;
-+      }
-+
-+      drv_data->int_mr = (void *)memory_resource->start;
-+
-+      if (platform_info->irq_list) {
-+              /* multiple IRQs */
-+              int *irqlist = platform_info->irq_list;
-+              while ((irq = *irqlist++)) {
-+                      int off = *irqlist++;
-+                      int lvl = *irqlist++;
-+                      int msk = *irqlist++;
-+                      status = request_irq(irq, qspi_interrupt, IRQF_DISABLED,
-+                                           dev->bus_id, drv_data);
-+                      if (status < 0) {
-+                              dev_err(&pdev->dev, 
-+                                      "unable to attach ColdFire DSPI interrupt\n");
-+                              goto out_error_master_alloc;
-+                      }
-+
-+                      if (lvl)
-+                              *(drv_data->int_icr + off) = lvl;
-+
-+                      if (msk)
-+                              *drv_data->int_mr &= ~msk;
-+              }
-+      }
-+      else {
-+              irq = platform_info->irq_vector;
-+
-+              status = request_irq(platform_info->irq_vector, qspi_interrupt,
-+                                   IRQF_DISABLED, dev->bus_id, drv_data);
-+              if (status < 0) {
-+                      dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
-+                      goto out_error_master_alloc;
-+              }
-+
-+              *drv_data->int_icr = platform_info->irq_lp;
-+              *drv_data->int_mr &= ~platform_info->irq_mask;
-+      }
-+
-+      /* Now that we have all the addresses etc.  Let's set it up */
-+      if (platform_info->par_val)
-+              *drv_data->par = platform_info->par_val;
-+
-+#ifdef CONFIG_M5227x
-+      MCF_GPIO_PAR_IRQ = 0x04; /* Mistake in RM documentation */
-+#endif
-+
-+#ifdef SPI_DSPI
-+      drv_data->dspi_ctas = 0; /* TBD: change later */
-+#endif
-+
-+      /* Initial and start queue */
-+      status = init_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "problem initializing queue\n");
-+              goto out_error_irq_alloc;
-+      }
-+      status = start_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "problem starting queue\n");
-+              goto out_error_irq_alloc;
-+      }
-+
-+      /* Register with the SPI framework */
-+      platform_set_drvdata(pdev, drv_data);
-+      status = spi_register_master(master);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "problem registering spi master\n");
-+              status = -EINVAL;
-+                goto out_error_queue_alloc;
-+      }
-+
-+#if defined(SPI_DSPI_EDMA)
-+      if (mcf_edma_request_channel(DSPI_DMA_TX_TCD,
-+                                   edma_tx_handler,
-+                                   NULL,
-+                                   pdev,
-+                                   NULL, /* spinlock */
-+                                   DRIVER_NAME
-+                                   )!=0) {
-+              dev_err(&pdev->dev, "problem requesting edma transmit channel\n");
-+              status = -EINVAL;
-+              goto out_error_queue_alloc;
-+      }
-+
-+      if (mcf_edma_request_channel(DSPI_DMA_RX_TCD,
-+                                   edma_rx_handler,
-+                                   NULL,
-+                                   pdev,
-+                                   NULL, /* spinlock */
-+                                   DRIVER_NAME
-+                                   )!=0) {
-+              dev_err(&pdev->dev, "problem requesting edma receive channel\n");
-+              status = -EINVAL;
-+              goto out_edma_transmit;
-+      }
-+#endif
-+
-+      printk(KERN_INFO "SPI: Coldfire master initialized\n" );
-+      return status;
-+
-+#if defined(SPI_DSPI_EDMA)
-+out_edma_transmit:
-+      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
-+#endif
-+
-+out_error_queue_alloc:
-+      destroy_queue(drv_data);
-+
-+out_error_irq_alloc:
-+      free_irq(irq, drv_data);
-+
-+out_error_master_alloc:
-+      spi_master_put(master);
-+      return status;
-+
-+}
-+
-+static int coldfire_spi_remove(struct platform_device *pdev)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int irq;
-+      int status = 0;
-+
-+      if (!drv_data)
-+              return 0;
-+
-+#if defined(SPI_DSPI_EDMA)
-+      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
-+      mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev);
-+#endif        
-+
-+      /* Remove the queue */
-+      status = destroy_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      /* Release IRQ */
-+/* JKM -- check for list and remove list */
-+      irq = platform_get_irq(pdev, 0);
-+      if (irq >= 0)
-+              free_irq(irq, drv_data);
-+
-+      /* Disconnect from the SPI framework */
-+      spi_unregister_master(drv_data->master);
-+
-+      /* Prevent double remove */
-+      platform_set_drvdata(pdev, NULL);
-+
-+      return 0;
-+}
-+
-+static void coldfire_spi_shutdown(struct platform_device *pdev)
-+{
-+      int status = 0;
-+
-+      if ((status = coldfire_spi_remove(pdev)) != 0)
-+              dev_err(&pdev->dev, "shutdown failed with %d\n", status);
-+}
-+
-+
-+#ifdef CONFIG_PM
-+static int suspend_devices(struct device *dev, void *pm_message)
-+{
-+      pm_message_t *state = pm_message;
-+
-+      if (dev->power.power_state.event != state->event) {
-+              dev_warn(dev, "pm state does not match request\n");
-+              return -1;
-+      }
-+
-+      return 0;
-+}
-+
-+static int coldfire_spi_suspend(struct platform_device *pdev, pm_message_t state)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int status = 0;
-+
-+      /* Check all childern for current power state */
-+      if (device_for_each_child(&pdev->dev, &state, suspend_devices) != 0) {
-+              dev_warn(&pdev->dev, "suspend aborted\n");
-+              return -1;
-+      }
-+
-+      status = stop_queue(drv_data);
-+      if (status != 0)
-+              return status;
-+
-+      return 0;
-+}
-+
-+static int coldfire_spi_resume(struct platform_device *pdev)
-+{
-+      struct driver_data *drv_data = platform_get_drvdata(pdev);
-+      int status = 0;
-+
-+      /* Start the queue running */
-+      status = start_queue(drv_data);
-+      if (status != 0) {
-+              dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
-+              return status;
-+      }
-+
-+      return 0;
-+}
-+#else
-+#define coldfire_spi_suspend NULL
-+#define coldfire_spi_resume NULL
-+#endif /* CONFIG_PM */
-+
-+static struct platform_driver driver = {
-+      .driver = {
-+              .name = "spi_coldfire",
-+              .bus = &platform_bus_type,
-+              .owner = THIS_MODULE,
-+      },
-+      .probe = coldfire_spi_probe,
-+      .remove = __devexit_p(coldfire_spi_remove),
-+      .shutdown = coldfire_spi_shutdown,
-+      .suspend = coldfire_spi_suspend,
-+      .resume = coldfire_spi_resume,
-+};
-+
-+static int __init coldfire_spi_init(void)
-+{
-+      platform_driver_register(&driver);
-+
-+      return 0;
-+}
-+module_init(coldfire_spi_init);
-+
-+static void __exit coldfire_spi_exit(void)
-+{
-+      platform_driver_unregister(&driver);
-+}
-+module_exit(coldfire_spi_exit);
---- /dev/null
-+++ b/drivers/spi/spi-m5445x.c
-@@ -0,0 +1,156 @@
-+/***************************************************************************/
-+/*
-+ *    linux/arch/m68k/coldfire/spi-m5445x.c
-+ *
-+ *    Sub-architcture dependant initialization code for the Freescale
-+ *    5445x SPI module
-+ *
-+ *    Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *    Copyright Freescale Semiconductor, Inc 2007
-+ *
-+ *    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/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/param.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/device.h>
-+#include <linux/platform_device.h>
-+#include <linux/spi/spi.h>
-+
-+#include <asm/dma.h>
-+#include <asm/traps.h>
-+#include <asm/machdep.h>
-+#include <asm/coldfire.h>
-+#include <asm/mcfsim.h>
-+#include <asm/mcfqspi.h>
-+#include <asm/mcf5445x_gpio.h>
-+
-+#define SPI_NUM_CHIPSELECTS   0x10
-+#define SPI_PAR_VAL  (0 | MCF_GPIO_PAR_DSPI_PCS5_PCS5 | MCF_GPIO_PAR_DSPI_PCS2_PCS2 \
-+              | MCF_GPIO_PAR_DSPI_PCS1_PCS1 | MCF_GPIO_PAR_DSPI_PCS0_PCS0 | MCF_GPIO_PAR_DSPI_SIN_SIN \
-+              | MCF_GPIO_PAR_DSPI_SOUT_SOUT | MCF_GPIO_PAR_DSPI_SCK_SCK)
-+
-+#define MCF5445x_DSPI_IRQ_SOURCE      (31)
-+#define MCF5445x_DSPI_IRQ_VECTOR      (64 + MCF5445x_DSPI_IRQ_SOURCE)
-+
-+#define MCF5445x_DSPI_PAR     (0xFC0A4063)
-+#define MCF5445x_DSPI_MCR     (0xFC05C000)
-+#define MCF5445x_INTC0_ICR    (0xFC048040)
-+#define MCF5445x_INTC0_IMRL   (0xFC04800C)
-+
-+
-+#define M5445x_AUDIO_IRQ_SOURCE 49
-+#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE)
-+#define M5445x_AUDIO_IRQ_LEVEL        4
-+
-+void coldfire_qspi_cs_control(u8 cs, u8 command)
-+{
-+}
-+
-+#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO)
-+static struct coldfire_spi_chip ssi_audio_chip_info = {
-+      .mode = SPI_MODE_0,
-+      .bits_per_word = 16,
-+      .del_cs_to_clk = 16,
-+      .del_after_trans = 16,
-+      .void_write_data = 0
-+};
-+
-+#endif
-+
-+static struct spi_board_info spi_board_info[] = {
-+
-+#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO)
-+      {
-+              .modalias = "ssi_audio",
-+              .max_speed_hz = 300000,
-+              .bus_num = 1,
-+              .chip_select = 5,
-+              .irq = M5445x_AUDIO_IRQ_VECTOR,
-+              .platform_data = NULL,
-+              .controller_data = &ssi_audio_chip_info
-+      }
-+#endif
-+
-+};
-+
-+static struct coldfire_spi_master coldfire_master_info = {
-+      .bus_num = 1,
-+      .num_chipselect = SPI_NUM_CHIPSELECTS,
-+      .irq_source = MCF5445x_DSPI_IRQ_SOURCE,
-+      .irq_vector = MCF5445x_DSPI_IRQ_VECTOR,
-+      .irq_mask = (0x01 << MCF5445x_DSPI_IRQ_SOURCE),
-+      .irq_lp = 0x2,  /* Level */
-+      .par_val = SPI_PAR_VAL,
-+//    .par_val16 = SPI_PAR_VAL,
-+      .cs_control = coldfire_qspi_cs_control,
-+};
-+
-+static struct resource coldfire_spi_resources[] = {
-+      [0] = {
-+              .name = "qspi-par",
-+              .start = MCF5445x_DSPI_PAR,
-+              .end = MCF5445x_DSPI_PAR,
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [1] = {
-+              .name = "qspi-module",
-+              .start = MCF5445x_DSPI_MCR,
-+              .end = MCF5445x_DSPI_MCR + 0xB8,
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [2] = {
-+              .name = "qspi-int-level",
-+              .start = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE,
-+              .end = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE,
-+              .flags = IORESOURCE_MEM
-+      },
-+
-+      [3] = {
-+              .name = "qspi-int-mask",
-+              .start = MCF5445x_INTC0_IMRL,
-+              .end = MCF5445x_INTC0_IMRL,
-+              .flags = IORESOURCE_MEM
-+      }
-+};
-+
-+static struct platform_device coldfire_spi = {
-+      .name = "spi_coldfire", //"coldfire-qspi",
-+      .id = -1,
-+      .resource = coldfire_spi_resources,
-+      .num_resources = ARRAY_SIZE(coldfire_spi_resources),
-+      .dev = {
-+              .platform_data = &coldfire_master_info,
-+      }
-+};
-+
-+static int __init spi_dev_init(void)
-+{
-+      int retval = 0;
-+      
-+      retval = platform_device_register(&coldfire_spi);
-+
-+      if (retval < 0) {
-+              printk(KERN_ERR "SPI-m5445x: platform_device_register failed with code=%d\n", retval);
-+              goto out;
-+      }
-+
-+      if (ARRAY_SIZE(spi_board_info))
-+              retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-+
-+
-+out:
-+      return retval;
-+}
-+
-+arch_initcall(spi_dev_init);
---- /dev/null
-+++ b/drivers/spi/ssi_audio.c
-@@ -0,0 +1,921 @@
-+/*
-+ * MCF5445x audio driver.
-+ *
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ * Copyright Freescale Semiconductor, Inc. 2006, 2007
-+ *
-+ * 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/device.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/spi/spi.h>
-+#include <linux/fs.h>
-+#include <linux/kernel.h>
-+#include <linux/major.h>
-+#include <asm/mcfsim.h>
-+#include <linux/interrupt.h>
-+#include <linux/soundcard.h>
-+#include <asm/uaccess.h>
-+#include <asm/virtconvert.h>
-+
-+#include <asm/coldfire.h>
-+#include <asm/coldfire_edma.h>
-+#ifdef CONFIG_M5445X
-+#include <asm/mcf5445x_ssi.h>
-+#include <asm/mcf5445x_ccm.h>
-+#include <asm/mcf5445x_gpio.h>
-+#endif
-+
-+#define SOUND_DEVICE_NAME "sound"
-+#define DRIVER_NAME "ssi_audio"
-+
-+/* #define AUDIO_DEBUG */
-+
-+#ifdef CONFIG_MMU
-+#define USE_MMU
-+#endif
-+
-+#define MAX_SPEED_HZ 12000000
-+
-+#define M5445x_AUDIO_IRQ_SOURCE 49
-+#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE)
-+#define M5445x_AUDIO_IRQ_LEVEL        5
-+
-+/* TLV320DAC23 audio chip registers */
-+
-+#define CODEC_LEFT_IN_REG             (0x00)
-+#define CODEC_RIGHT_IN_REG            (0x01)
-+#define CODEC_LEFT_HP_VOL_REG         (0x02)
-+#define CODEC_RIGHT_HP_VOL_REG                (0x03)
-+#define CODEC_ANALOG_APATH_REG                (0x04)
-+#define CODEC_DIGITAL_APATH_REG               (0x05)
-+#define CODEC_POWER_DOWN_REG          (0x06)
-+#define CODEC_DIGITAL_IF_FMT_REG      (0x07)
-+#define CODEC_SAMPLE_RATE_REG         (0x08)
-+#define CODEC_DIGITAL_IF_ACT_REG      (0x09)
-+#define CODEC_RESET_REG                       (0x0f)
-+
-+#define CODEC_SAMPLE_8KHZ             (0x0C)
-+#define CODEC_SAMPLE_16KHZ            (0x58)
-+#define CODEC_SAMPLE_22KHZ            (0x62)
-+#define CODEC_SAMPLE_32KHZ            (0x18)
-+#define CODEC_SAMPLE_44KHZ            (0x22)
-+#define CODEC_SAMPLE_48KHZ            (0x00)
-+
-+/* Audio buffer data size */
-+#define       BUFSIZE         (64*1024)
-+/* DMA transfer size */
-+#define DMASIZE               (16*1024)
-+
-+/* eDMA channel for SSI channel 0 TX */
-+#define DMA_TCD       MCF_EDMA_CHAN_TIMER2
-+/* eDMA channel for SSI channel 1 TX */
-+#define DMA_TCD2      MCF_EDMA_CHAN_TIMER3
-+
-+struct ssi_audio {
-+      struct spi_device *spi;
-+      u32 speed;
-+      u32 stereo;
-+      u32 bits;
-+      u32 format;
-+      u8 isopen;
-+      u8 dmaing;
-+      u8 ssi_enabled;
-+      u8 channel;
-+      spinlock_t lock;
-+      u8* audio_buf;
-+};
-+
-+static struct ssi_audio* audio_device = NULL;
-+volatile u32 audio_start;
-+volatile u32 audio_count;
-+volatile u32 audio_append;
-+volatile u32 audio_appstart;
-+volatile u32 audio_txbusy;
-+
-+struct ssi_audio_format {
-+      unsigned int    format;
-+      unsigned int    bits;
-+} ssi_audio_formattable[] = {
-+      { AFMT_MU_LAW,          8 },
-+      { AFMT_A_LAW,           8 },
-+      { AFMT_IMA_ADPCM,       8 },
-+      { AFMT_U8,              8 },
-+      { AFMT_S16_LE,          16 },
-+      { AFMT_S16_BE,          16 },
-+      { AFMT_S8,              8 },
-+      { AFMT_U16_LE,          16 },
-+      { AFMT_U16_BE,          16 },
-+};
-+
-+#define       FORMATSIZE      (sizeof(ssi_audio_formattable) / sizeof(struct ssi_audio_format))
-+
-+static void ssi_audio_setsamplesize(int val)
-+{
-+      int     i;
-+
-+      if (audio_device == NULL) return;
-+
-+      for (i = 0; (i < FORMATSIZE); i++) {
-+              if (ssi_audio_formattable[i].format == val) {
-+                      audio_device->format = ssi_audio_formattable[i].format;
-+                      audio_device->bits = ssi_audio_formattable[i].bits;
-+                      break;
-+              }
-+      }
-+
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n",
-+             audio_device->format, audio_device->bits);
-+#endif
-+}
-+
-+static void ssi_audio_txdrain(void)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_txdrain()\n");
-+#endif
-+
-+      if (audio_device == NULL) return;
-+
-+      while (!signal_pending(current)) {
-+              if (audio_txbusy == 0)
-+                      break;
-+              current->state = TASK_INTERRUPTIBLE;
-+              schedule_timeout(1);
-+      }
-+}
-+
-+#ifdef CONFIG_SSIAUDIO_USE_EDMA
-+/*
-+ *    Configure and start DMA engine.
-+ */
-+void __inline__ ssi_audio_dmarun(void)
-+{
-+      set_edma_params(DMA_TCD,
-+#ifdef USE_MMU
-+                      virt_to_phys(&(audio_device->audio_buf[audio_start])),
-+#else
-+                      (u32)&(audio_device->audio_buf[audio_start]),
-+#endif
-+                      (u32)&MCF_SSI_TX0,
-+                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                      8,
-+                      4,
-+                      0,
-+                      audio_count/8,
-+                      audio_count/8,
-+                      0,
-+                      0,
-+                      0, // major_int
-+                      0  // disable_req
-+                      );
-+
-+      set_edma_params(DMA_TCD2,
-+#ifdef USE_MMU
-+                      virt_to_phys(&(audio_device->audio_buf[audio_start+4])),
-+#else
-+                      (u32)&(audio_device->audio_buf[audio_start+4]),
-+#endif
-+                      (u32)&MCF_SSI_TX1,
-+                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
-+                      8,
-+                      4,
-+                      0,
-+                      audio_count/8,
-+                      audio_count/8,
-+                      0,
-+                      0,
-+                      1, // major_int
-+                      0  // disable_req
-+                      );
-+
-+      audio_device->dmaing = 1;
-+      audio_txbusy = 1;
-+
-+      start_edma_transfer(DMA_TCD);
-+      start_edma_transfer(DMA_TCD2);
-+}
-+
-+/**
-+ * ssi_audio_dmabuf - Start DMA'ing a new buffer of data if any available.
-+ */
-+static void ssi_audio_dmabuf(void)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n",
-+             audio_append, audio_appstart);
-+#endif
-+
-+      /* If already running then nothing to do... */
-+      if (audio_device->dmaing)
-+              return;
-+
-+      /* Set DMA buffer size */
-+      audio_count = (audio_append >= audio_appstart) ?
-+              (audio_append - audio_appstart) :
-+              (BUFSIZE - audio_appstart);
-+      if (audio_count > DMASIZE)
-+              audio_count = DMASIZE;
-+
-+      /* Adjust pointers and counters accordingly */
-+      audio_appstart += audio_count;
-+      if (audio_appstart >= BUFSIZE)
-+              audio_appstart = 0;
-+
-+      if (audio_count > 0)
-+              ssi_audio_dmarun();
-+      else {
-+              audio_txbusy = 0;
-+#ifdef AUDIO_DEBUG
-+              printk(DRIVER_NAME ":DMA buffer is empty!\n");
-+#endif
-+      }
-+}
-+
-+void __inline__ stop_dma(void)
-+{
-+      stop_edma_transfer(DMA_TCD);
-+      stop_edma_transfer(DMA_TCD2);
-+}
-+
-+static int ssi_audio_dma_handler_empty(int channel, void *dev_id)
-+{
-+      return IRQ_HANDLED;
-+}
-+
-+static int ssi_audio_dma_handler(int channel, void *dev_id)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_dma_handler(channel=%d)\n", channel);
-+#endif
-+
-+      /* Clear DMA interrupt */
-+      stop_dma();
-+
-+      audio_device->dmaing = 0;
-+
-+      /* Update data pointers and counts */
-+      audio_start += audio_count;
-+      if (audio_start >= BUFSIZE)
-+              audio_start = 0;
-+      audio_count = 0;
-+
-+      /* Start new DMA buffer if we can */
-+      ssi_audio_dmabuf();
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void init_dma(void)
-+{
-+      /* SSI DMA Signals mapped to DMA request */
-+      MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_TIMDMA;
-+      init_edma();
-+}
-+
-+#endif        /* CONFIG_SSIAUDIO_USE_EDMA */
-+
-+/* Write CODEC register using SPI
-+ *   address - CODEC register address
-+ *   data - data to be written into register
-+ */
-+static int codec_write(u8 addr, u16 data)
-+{
-+      u16 spi_word;
-+
-+      if (audio_device==NULL || audio_device->spi==NULL)
-+              return -ENODEV;
-+
-+      spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF);
-+      return spi_write(audio_device->spi, (const u8*)&spi_word,
-+                       sizeof(spi_word));
-+}
-+
-+static inline void enable_ssi(void)
-+{
-+      if (audio_device==NULL || audio_device->ssi_enabled) return;
-+      audio_device->ssi_enabled = 1;
-+      MCF_SSI_CR |= MCF_SSI_CR_SSI_EN;  /* enable SSI module */
-+      MCF_SSI_CR |= MCF_SSI_CR_TE;      /* enable tranmitter */
-+}
-+
-+static inline void disable_ssi(void)
-+{
-+      if (audio_device==NULL || audio_device->ssi_enabled==0) return;
-+      MCF_SSI_CR &= ~MCF_SSI_CR_TE;           /* disable transmitter */
-+      MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN;       /* disable SSI module  */
-+      audio_device->ssi_enabled = 0;
-+}
-+
-+/* Audio CODEC initialization */
-+static void adjust_codec_speed(void) {
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed);
-+#endif
-+      disable_ssi();
-+      switch (audio_device->speed) {
-+      case 8000:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(255);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ);
-+              break;
-+      case 16000:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(129);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ);
-+              break;
-+      case 22000:
-+      case 22050:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(94);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ);
-+              break;
-+      case 44000:
-+      case 44100:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
-+              break;
-+      case 48000:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(42);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ);
-+              break;
-+      default:
-+              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
-+              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
-+      }
-+}
-+
-+static void codec_reset(void)
-+{
-+      codec_write(CODEC_RESET_REG, 0); /* reset the audio chip */
-+      udelay(1500); /* wait for reset */
-+}
-+
-+static void init_audio_codec(void)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":init_audio_codec()\n");
-+#endif
-+      codec_reset();
-+
-+      codec_write(CODEC_LEFT_IN_REG, 0x017);
-+      codec_write(CODEC_RIGHT_IN_REG, 0x017);
-+      codec_write(CODEC_POWER_DOWN_REG, 0x000); /* Turn off line input */
-+      codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x00A); /* I2S slave mode */
-+      /* codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x042); // I2S master mode */
-+      codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */
-+
-+      /* set sample rate */
-+      adjust_codec_speed();
-+
-+      codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */
-+      codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */
-+      codec_write(CODEC_DIGITAL_IF_ACT_REG, 1); /* Activate digital interface */
-+      codec_write(CODEC_ANALOG_APATH_REG, 0x0F2);
-+}
-+
-+
-+static void chip_init(void)
-+{
-+#ifdef CONFIG_SSIAUDIO_USE_EDMA
-+      init_dma();
-+#endif
-+
-+      /* Enable the SSI pins */
-+      MCF_GPIO_PAR_SSI = (0
-+                          | MCF_GPIO_PAR_SSI_MCLK
-+                          | MCF_GPIO_PAR_SSI_STXD(3)
-+                          | MCF_GPIO_PAR_SSI_SRXD(3)
-+                          | MCF_GPIO_PAR_SSI_FS(3)
-+                          | MCF_GPIO_PAR_SSI_BCLK(3) );
-+}
-+
-+static void init_ssi(void)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":init_ssi()\n");
-+#endif
-+
-+      /* Dividers are for MCF54445 on 266Mhz, the output is 44.1Khz*/
-+      /* Enable SSI clock in CCM */
-+      MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
-+
-+      /* Issue a SSI reset */
-+      MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN;  /* disable SSI module */
-+
-+      /* SSI module uses internal CPU clock */
-+      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSISRC;
-+
-+      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUE;
-+      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUS_UP;
-+
-+      MCF_SSI_CR = 0
-+                      | MCF_SSI_CR_CIS
-+                      | MCF_SSI_CR_TCH    /* Enable two channel mode */
-+                      | MCF_SSI_CR_MCE    /* Set clock out on SSI_MCLK pin */
-+                      | MCF_SSI_CR_I2S_MASTER    /* Set I2S master mode */
-+                      | MCF_SSI_CR_SYN      /* Enable synchronous mode */
-+                      | MCF_SSI_CR_NET
-+                      ;
-+
-+      MCF_SSI_TCR = 0
-+                      | MCF_SSI_TCR_TXDIR  /* internally generated bit clock */
-+                      | MCF_SSI_TCR_TFDIR  /* internally generated frame sync */
-+                      | MCF_SSI_TCR_TSCKP  /* Clock data on falling edge of bit clock */
-+                      | MCF_SSI_TCR_TFSI   /* Frame sync active low */
-+                      | MCF_SSI_TCR_TEFS   /* TX frame sync 1 bit before data */
-+                      | MCF_SSI_TCR_TFEN0  /* TX FIFO 0 enabled */
-+                      | MCF_SSI_TCR_TFEN1  /* TX FIFO 1 enabled */
-+                      | MCF_SSI_TCR_TXBIT0
-+                      ;
-+
-+      MCF_SSI_CCR = MCF_SSI_CCR_WL(7)  /* 16 bit word length */
-+                      | MCF_SSI_CCR_DC(1)      /* Frame rate divider */
-+                      | MCF_SSI_CCR_PM(0)
-+                      | MCF_SSI_CCR_DIV2
-+                      ;
-+
-+      MCF_SSI_FCSR = 0
-+                      | MCF_SSI_FCSR_TFWM0(2)
-+                      | MCF_SSI_FCSR_TFWM1(2)
-+                      ;
-+
-+      MCF_SSI_IER =   0 // interrupts
-+#ifndef CONFIG_SSIAUDIO_USE_EDMA
-+                              | MCF_SSI_IER_TIE   /* transmit interrupts */
-+                              | MCF_SSI_IER_TFE0  /* transmit FIFO 0 empty */
-+                              | MCF_SSI_IER_TFE1  /* transmit FIFO 1 empty */
-+#else
-+                              | MCF_SSI_IER_TDMAE /* DMA request enabled */
-+                              | MCF_SSI_IER_TFE0  /* transmit FIFO 0 empty */
-+                              | MCF_SSI_IER_TFE1  /* transmit FIFO 1 empty */
-+#endif
-+                              ;
-+
-+#ifndef CONFIG_SSIAUDIO_USE_EDMA
-+      /* enable IRQ:  SSI interrupt */
-+      MCF_INTC1_ICR(M5445x_AUDIO_IRQ_SOURCE) = M5445x_AUDIO_IRQ_LEVEL;
-+      MCF_INTC1_CIMR = M5445x_AUDIO_IRQ_SOURCE;
-+#endif
-+}
-+
-+#ifndef CONFIG_SSIAUDIO_USE_EDMA
-+/* interrupt for SSI */
-+static int ssi_audio_isr(int irq, void *dev_id)
-+{
-+      unsigned long   *bp;
-+
-+      if (audio_txbusy==0)
-+              return IRQ_HANDLED;
-+
-+      spin_lock(&(audio_device->lock));
-+
-+      if (audio_start == audio_append) {
-+              disable_ssi();
-+              audio_txbusy = 0;
-+      } else {
-+              if (MCF_SSI_ISR & (MCF_SSI_ISR_TFE0|MCF_SSI_ISR_TFE1)) {
-+                      bp = (unsigned long *) &audio_device->audio_buf[audio_start];
-+                      if (audio_device->channel) {
-+                              MCF_SSI_TX1 = *bp;
-+                              audio_device->channel = 0;
-+                      } else {
-+                              MCF_SSI_TX0 = *bp;
-+                              audio_device->channel = 1;
-+                      }
-+                      audio_start += 4;
-+                      if (audio_start >= BUFSIZE)
-+                              audio_start = 0;
-+              }
-+      }
-+
-+      spin_unlock(&(audio_device->lock));
-+
-+      return IRQ_HANDLED;
-+}
-+#endif
-+
-+/* Set initial driver playback defaults. */
-+static void init_driver_variables(void)
-+{
-+      audio_device->speed = 44100;
-+      audio_device->format = AFMT_S16_LE;
-+      audio_device->bits = 16;
-+      audio_device->stereo = 1;
-+      audio_device->ssi_enabled = 0;
-+
-+      audio_start = 0;
-+      audio_count = 0;
-+      audio_append = 0;
-+      audio_appstart = 0;
-+      audio_txbusy = 0;
-+      audio_device->dmaing = 0;
-+}
-+
-+/* open audio device */
-+static int ssi_audio_open(struct inode *inode, struct file *filp)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_open()\n");
-+#endif
-+
-+      if (audio_device==NULL) return (-ENODEV);
-+
-+      if (audio_device->isopen)
-+              return(-EBUSY);
-+
-+      spin_lock(&(audio_device->lock));
-+
-+      audio_device->isopen = 1;
-+
-+      init_driver_variables();
-+      init_ssi();
-+      init_audio_codec();
-+
-+      spin_unlock(&(audio_device->lock));
-+
-+      udelay(100);
-+
-+      return 0;
-+}
-+
-+/* close audio device */
-+static int ssi_audio_close(struct inode *inode, struct file *filp)
-+{
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_close()\n");
-+#endif
-+
-+      if (audio_device==NULL) return (-ENODEV);
-+
-+      ssi_audio_txdrain();
-+
-+      spin_lock(&(audio_device->lock));
-+
-+#ifdef CONFIG_SSIAUDIO_USE_EDMA
-+      stop_dma();
-+#endif
-+      disable_ssi();
-+      codec_reset();
-+      init_driver_variables();
-+      audio_device->isopen = 0;
-+
-+      spin_unlock(&(audio_device->lock));
-+      return 0;
-+}
-+
-+/* write to audio device */
-+static ssize_t ssi_audio_write(struct file *filp, const char *buf,
-+      size_t count, loff_t *ppos)
-+{
-+      unsigned long   *dp, *buflp;
-+      unsigned short  *bufwp;
-+      unsigned char   *bufbp;
-+      unsigned int    slen, bufcnt, i, s, e;
-+
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n",
-+             (int)buf, count);
-+#endif
-+
-+      if (audio_device==NULL)
-+              return (-ENODEV);
-+
-+      if (count <= 0)
-+              return 0;
-+
-+      spin_lock(&(audio_device->lock));
-+
-+      buflp = (unsigned long *) buf;
-+      bufwp = (unsigned short *) buf;
-+      bufbp = (unsigned char *) buf;
-+
-+      bufcnt = count & ~0x3;
-+
-+      bufcnt <<= 1;
-+      if (audio_device->stereo == 0)
-+              bufcnt <<= 1;
-+      if (audio_device->bits == 8)
-+              bufcnt <<= 1;
-+
-+tryagain:
-+      /*
-+       * Get a snapshot of buffer, so we can figure out how
-+       * much data we can fit in...
-+       */
-+      s = audio_start;
-+      e = audio_append;
-+      dp = (unsigned long *) &(audio_device->audio_buf[e]);
-+
-+      slen = ((s > e) ? (s - e) : (BUFSIZE - (e - s))) - 4;
-+      if (slen > bufcnt)
-+              slen = bufcnt;
-+      if ((BUFSIZE - e) < slen)
-+              slen = BUFSIZE - e;
-+
-+      if (slen == 0) {
-+              if (signal_pending(current))
-+                      return(-ERESTARTSYS);
-+              set_current_state(TASK_INTERRUPTIBLE);
-+              schedule_timeout(1);
-+              goto tryagain;
-+      }
-+
-+      /*
-+       * For DMA we need to have data as 32 bit
-+       * values (since SSI TX register is 32 bit).
-+       * So, the incoming 16 bit data must be put to buffer as 32 bit values.
-+       * Also, the endianess is converted if needed
-+       */
-+      if (audio_device->stereo) {
-+              if (audio_device->bits == 16) {
-+                      if (audio_device->format==AFMT_S16_LE) {
-+                              /*- convert endianess, probably could be done by SSI also */
-+                              for (i = 0; (i < slen); i += 4) {
-+                                      unsigned short val = le16_to_cpu((*bufwp++));
-+                                      *dp++ = val;
-+                              }
-+                      } else {
-+                              for (i = 0; (i < slen); i += 4) {
-+                                      *dp++ = *bufwp++;
-+                              }
-+                      }
-+              } else {
-+                      for (i = 0; (i < slen); i += 4) {
-+                              *dp    = (((unsigned long) *bufbp++) << 24);
-+                              *dp++ |= (((unsigned long) *bufbp++) << 8);
-+                      }
-+              }
-+      } else {
-+              if (audio_device->bits == 16) {
-+                      for (i = 0; (i < slen); i += 4) {
-+                              *dp++ = (((unsigned long)*bufwp)<<16) | *bufwp;
-+                              bufwp++;
-+                      }
-+              } else {
-+                      for (i = 0; (i < slen); i += 4) {
-+                              *dp++ = (((unsigned long) *bufbp) << 24) |
-+                                      (((unsigned long) *bufbp) << 8);
-+                              bufbp++;
-+                      }
-+              }
-+      }
-+
-+      e += slen;
-+      if (e >= BUFSIZE)
-+              e = 0;
-+      audio_append = e;
-+
-+      /* If not outputing audio, then start now */
-+      if (audio_txbusy == 0) {
-+              audio_txbusy++;
-+              audio_device->channel = 0;
-+              enable_ssi();
-+#ifdef CONFIG_SSIAUDIO_USE_EDMA
-+              ssi_audio_dmabuf(); /* start first DMA transfer */
-+#endif
-+      }
-+
-+      bufcnt -= slen;
-+
-+      if (bufcnt > 0)
-+              goto tryagain;
-+
-+      spin_unlock(&(audio_device->lock));
-+
-+      return count;
-+}
-+
-+/* ioctl: control the driver */
-+static int ssi_audio_ioctl(struct inode *inode, struct file *filp,
-+      unsigned int cmd, unsigned long arg)
-+{
-+      long val;
-+      int rc = 0;
-+
-+#ifdef AUDIO_DEBUG
-+    printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n",
-+         (int)cmd, (int)arg);
-+#endif
-+
-+      if (audio_device==NULL)
-+              return (-ENODEV);
-+
-+      switch (cmd) {
-+
-+      case SNDCTL_DSP_SPEED:
-+              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
-+                      get_user(val, (unsigned long *) arg);
-+#ifdef AUDIO_DEBUG
-+                      printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SPEED: %ld\n", val);
-+#endif
-+                      ssi_audio_txdrain();
-+                      audio_device->speed = val;
-+                      init_audio_codec();
-+              } else {
-+                      rc = -EINVAL;
-+              }
-+              break;
-+
-+      case SNDCTL_DSP_SAMPLESIZE:
-+              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
-+                      get_user(val, (unsigned long *) arg);
-+#ifdef AUDIO_DEBUG
-+                      printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SAMPLESIZE: %d\n", val);
-+#endif
-+                      ssi_audio_txdrain();
-+                      ssi_audio_setsamplesize(val);
-+              } else {
-+                      rc = -EINVAL;
-+              }
-+              break;
-+
-+      case SNDCTL_DSP_STEREO:
-+              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
-+                      get_user(val, (unsigned long *) arg);
-+                      ssi_audio_txdrain();
-+                      audio_device->stereo = val;
-+              } else {
-+                      rc = -EINVAL;
-+              }
-+              break;
-+
-+      case SNDCTL_DSP_GETBLKSIZE:
-+              if (access_ok(VERIFY_WRITE, (void *) arg, sizeof(long)))
-+                      put_user(BUFSIZE, (long *) arg);
-+              else
-+                      rc = -EINVAL;
-+              break;
-+
-+      case SNDCTL_DSP_SYNC:
-+              ssi_audio_txdrain();
-+              break;
-+
-+      default:
-+              rc = -EINVAL;
-+              break;
-+      }
-+
-+      return rc;
-+}
-+
-+struct file_operations        ssi_audio_fops = {
-+      open: ssi_audio_open,           /* open */
-+      release: ssi_audio_close,       /* close */
-+      write: ssi_audio_write,         /* write */
-+      ioctl: ssi_audio_ioctl,         /* ioctl */
-+};
-+
-+/* initialize audio driver */
-+static int __devinit ssi_audio_probe(struct spi_device *spi)
-+{
-+      struct ssi_audio *audio;
-+      int err;
-+
-+#ifdef AUDIO_DEBUG
-+      printk(DRIVER_NAME": probe\n");
-+#endif
-+
-+      if (!spi->irq) {
-+              dev_dbg(&spi->dev, "no IRQ?\n");
-+              return -ENODEV;
-+      }
-+
-+      /* don't exceed max specified sample rate */
-+      if (spi->max_speed_hz > MAX_SPEED_HZ) {
-+              dev_dbg(&spi->dev, "f(sample) %d KHz?\n",
-+                              (spi->max_speed_hz)/1000);
-+              return -EINVAL;
-+      }
-+
-+      /* register charcter device */
-+      if (register_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME, &ssi_audio_fops) < 0) {
-+              printk(KERN_WARNING DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR);
-+              dev_dbg(&spi->dev, DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR);
-+              return -ENODEV;
-+      }
-+
-+      audio = kzalloc(sizeof(struct ssi_audio), GFP_KERNEL);
-+      if (!audio) {
-+              err = -ENOMEM;
-+              goto err_out;
-+      }
-+
-+      /* DMA buffer must be from GFP_DMA zone, so it will not be cached */
-+      audio->audio_buf = kmalloc(BUFSIZE, GFP_DMA);
-+      if (audio->audio_buf == NULL) {
-+              dev_dbg(&spi->dev, DRIVER_NAME ": failed to allocate DMA[%d] buffer\n", BUFSIZE);
-+              err = -ENOMEM;
-+              goto err_free_mem;
-+      }
-+
-+      audio_device = audio;
-+
-+      dev_set_drvdata(&spi->dev, audio);
-+      spi->dev.power.power_state = PMSG_ON;
-+
-+      audio->spi = spi;
-+
-+#ifndef CONFIG_SSIAUDIO_USE_EDMA
-+      if (request_irq(spi->irq, ssi_audio_isr, IRQF_DISABLED, spi->dev.bus_id, audio)) {
-+              dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
-+              err = -EBUSY;
-+              goto err_free_mem;
-+      }
-+
-+#else
-+      /* request 2 eDMA channels since two channel output mode is used */
-+      if (request_edma_channel(DMA_TCD,
-+                               ssi_audio_dma_handler_empty,
-+                               NULL,
-+                               audio,
-+                               &(audio_device->lock),
-+                               DRIVER_NAME)!=0) {
-+              dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD);
-+              err = -EBUSY;
-+              goto err_free_mem;
-+      }
-+      if (request_edma_channel(DMA_TCD2,
-+                               ssi_audio_dma_handler,
-+                               NULL,
-+                               audio,
-+                               &(audio_device->lock),
-+                               DRIVER_NAME)!=0) {
-+              dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2);
-+              err = -EBUSY;
-+              goto err_free_mem;
-+      }
-+
-+#endif
-+      chip_init();
-+      printk(DRIVER_NAME ": Probed successfully\n");
-+
-+      return 0;
-+
-+ err_free_mem:
-+      kfree(audio);
-+      audio_device = NULL;
-+ err_out:
-+      unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME);
-+      return err;
-+}
-+
-+static int __devexit ssi_audio_remove(struct spi_device *spi)
-+{
-+      struct ssi_audio *audio = dev_get_drvdata(&spi->dev);
-+
-+      ssi_audio_txdrain();
-+#ifndef CONFIG_SSIAUDIO_USE_EDMA
-+      free_irq(spi->irq, audio);
-+#else
-+      free_edma_channel(DMA_TCD, audio);
-+      free_edma_channel(DMA_TCD2, audio);
-+#endif
-+      kfree(audio->audio_buf);
-+      kfree(audio);
-+      audio_device = NULL;
-+      unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME);
-+      dev_dbg(&spi->dev, "unregistered audio\n");
-+      return 0;
-+}
-+
-+static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message)
-+{
-+      return 0;
-+}
-+
-+static int ssi_audio_resume(struct spi_device *spi)
-+{
-+      return 0;
-+}
-+
-+static struct spi_driver ssi_audio_driver = {
-+      .driver = {
-+              .name   = DRIVER_NAME,
-+              .bus    = &spi_bus_type,
-+              .owner  = THIS_MODULE,
-+      },
-+      .probe          = ssi_audio_probe,
-+      .remove         = __devexit_p(ssi_audio_remove),
-+      .suspend        = ssi_audio_suspend,
-+      .resume         = ssi_audio_resume,
-+};
-+
-+static int __init ssi_audio_init(void)
-+{
-+      return spi_register_driver(&ssi_audio_driver);
-+}
-+module_init(ssi_audio_init);
-+
-+static void __exit ssi_audio_exit(void)
-+{
-+      spi_unregister_driver(&ssi_audio_driver);
-+}
-+module_exit(ssi_audio_exit);
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Freescale Semiconductor, Inc.");
-+MODULE_DESCRIPTION("SSI/I2S Audio Driver");
---- a/drivers/usb/gadget/ether.c
-+++ b/drivers/usb/gadget/ether.c
-@@ -287,6 +287,9 @@ MODULE_PARM_DESC(host_addr, "Host Ethern
- #define       DEV_CONFIG_CDC
- #endif
-+#ifdef CONFIG_USB_GADGET_MCF5445X
-+#define DEV_CONFIG_CDC
-+#endif
- /*-------------------------------------------------------------------------*/
---- a/drivers/usb/gadget/fsl_usb2_udc.h
-+++ b/drivers/usb/gadget/fsl_usb2_udc.h
-@@ -83,16 +83,6 @@ struct usb_dr_host {
-       u32 endptctrl[6];       /* Endpoint Control Registers */
- };
-- /* non-EHCI USB system interface registers (Big Endian) */
--struct usb_sys_interface {
--      u32 snoop1;
--      u32 snoop2;
--      u32 age_cnt_thresh;     /* Age Count Threshold Register */
--      u32 pri_ctrl;           /* Priority Control Register */
--      u32 si_ctrl;            /* System Interface Control Register */
--      u8 res[236];
--      u32 control;            /* General Purpose Control Register */
--};
- /* ep0 transfer state */
- #define WAIT_FOR_SETUP          0
-@@ -101,10 +91,6 @@ struct usb_sys_interface {
- #define WAIT_FOR_OUT_STATUS     3
- #define DATA_STATE_RECV         4
--/* Device Controller Capability Parameter register */
--#define DCCPARAMS_DC                          0x00000080
--#define DCCPARAMS_DEN_MASK                    0x0000001f
--
- /* Frame Index Register Bit Masks */
- #define       USB_FRINDEX_MASKS                       0x3fff
- /* USB CMD  Register Bit Masks */
-@@ -180,172 +166,6 @@ struct usb_sys_interface {
- /* endpoint list address bit masks */
- #define USB_EP_LIST_ADDRESS_MASK              0xfffff800
--/* PORTSCX  Register Bit Masks */
--#define  PORTSCX_CURRENT_CONNECT_STATUS       0x00000001
--#define  PORTSCX_CONNECT_STATUS_CHANGE        0x00000002
--#define  PORTSCX_PORT_ENABLE                  0x00000004
--#define  PORTSCX_PORT_EN_DIS_CHANGE           0x00000008
--#define  PORTSCX_OVER_CURRENT_ACT             0x00000010
--#define  PORTSCX_OVER_CURRENT_CHG             0x00000020
--#define  PORTSCX_PORT_FORCE_RESUME            0x00000040
--#define  PORTSCX_PORT_SUSPEND                 0x00000080
--#define  PORTSCX_PORT_RESET                   0x00000100
--#define  PORTSCX_LINE_STATUS_BITS             0x00000C00
--#define  PORTSCX_PORT_POWER                   0x00001000
--#define  PORTSCX_PORT_INDICTOR_CTRL           0x0000C000
--#define  PORTSCX_PORT_TEST_CTRL               0x000F0000
--#define  PORTSCX_WAKE_ON_CONNECT_EN           0x00100000
--#define  PORTSCX_WAKE_ON_CONNECT_DIS          0x00200000
--#define  PORTSCX_WAKE_ON_OVER_CURRENT         0x00400000
--#define  PORTSCX_PHY_LOW_POWER_SPD            0x00800000
--#define  PORTSCX_PORT_FORCE_FULL_SPEED        0x01000000
--#define  PORTSCX_PORT_SPEED_MASK              0x0C000000
--#define  PORTSCX_PORT_WIDTH                   0x10000000
--#define  PORTSCX_PHY_TYPE_SEL                 0xC0000000
--
--/* bit 11-10 are line status */
--#define  PORTSCX_LINE_STATUS_SE0              0x00000000
--#define  PORTSCX_LINE_STATUS_JSTATE           0x00000400
--#define  PORTSCX_LINE_STATUS_KSTATE           0x00000800
--#define  PORTSCX_LINE_STATUS_UNDEF            0x00000C00
--#define  PORTSCX_LINE_STATUS_BIT_POS          10
--
--/* bit 15-14 are port indicator control */
--#define  PORTSCX_PIC_OFF                      0x00000000
--#define  PORTSCX_PIC_AMBER                    0x00004000
--#define  PORTSCX_PIC_GREEN                    0x00008000
--#define  PORTSCX_PIC_UNDEF                    0x0000C000
--#define  PORTSCX_PIC_BIT_POS                  14
--
--/* bit 19-16 are port test control */
--#define  PORTSCX_PTC_DISABLE                  0x00000000
--#define  PORTSCX_PTC_JSTATE                   0x00010000
--#define  PORTSCX_PTC_KSTATE                   0x00020000
--#define  PORTSCX_PTC_SEQNAK                   0x00030000
--#define  PORTSCX_PTC_PACKET                   0x00040000
--#define  PORTSCX_PTC_FORCE_EN                 0x00050000
--#define  PORTSCX_PTC_BIT_POS                  16
--
--/* bit 27-26 are port speed */
--#define  PORTSCX_PORT_SPEED_FULL              0x00000000
--#define  PORTSCX_PORT_SPEED_LOW               0x04000000
--#define  PORTSCX_PORT_SPEED_HIGH              0x08000000
--#define  PORTSCX_PORT_SPEED_UNDEF             0x0C000000
--#define  PORTSCX_SPEED_BIT_POS                26
--
--/* bit 28 is parallel transceiver width for UTMI interface */
--#define  PORTSCX_PTW                          0x10000000
--#define  PORTSCX_PTW_8BIT                     0x00000000
--#define  PORTSCX_PTW_16BIT                    0x10000000
--
--/* bit 31-30 are port transceiver select */
--#define  PORTSCX_PTS_UTMI                     0x00000000
--#define  PORTSCX_PTS_ULPI                     0x80000000
--#define  PORTSCX_PTS_FSLS                     0xC0000000
--#define  PORTSCX_PTS_BIT_POS                  30
--
--/* otgsc Register Bit Masks */
--#define  OTGSC_CTRL_VUSB_DISCHARGE            0x00000001
--#define  OTGSC_CTRL_VUSB_CHARGE               0x00000002
--#define  OTGSC_CTRL_OTG_TERM                  0x00000008
--#define  OTGSC_CTRL_DATA_PULSING              0x00000010
--#define  OTGSC_STS_USB_ID                     0x00000100
--#define  OTGSC_STS_A_VBUS_VALID               0x00000200
--#define  OTGSC_STS_A_SESSION_VALID            0x00000400
--#define  OTGSC_STS_B_SESSION_VALID            0x00000800
--#define  OTGSC_STS_B_SESSION_END              0x00001000
--#define  OTGSC_STS_1MS_TOGGLE                 0x00002000
--#define  OTGSC_STS_DATA_PULSING               0x00004000
--#define  OTGSC_INTSTS_USB_ID                  0x00010000
--#define  OTGSC_INTSTS_A_VBUS_VALID            0x00020000
--#define  OTGSC_INTSTS_A_SESSION_VALID         0x00040000
--#define  OTGSC_INTSTS_B_SESSION_VALID         0x00080000
--#define  OTGSC_INTSTS_B_SESSION_END           0x00100000
--#define  OTGSC_INTSTS_1MS                     0x00200000
--#define  OTGSC_INTSTS_DATA_PULSING            0x00400000
--#define  OTGSC_INTR_USB_ID                    0x01000000
--#define  OTGSC_INTR_A_VBUS_VALID              0x02000000
--#define  OTGSC_INTR_A_SESSION_VALID           0x04000000
--#define  OTGSC_INTR_B_SESSION_VALID           0x08000000
--#define  OTGSC_INTR_B_SESSION_END             0x10000000
--#define  OTGSC_INTR_1MS_TIMER                 0x20000000
--#define  OTGSC_INTR_DATA_PULSING              0x40000000
--
--/* USB MODE Register Bit Masks */
--#define  USB_MODE_CTRL_MODE_IDLE              0x00000000
--#define  USB_MODE_CTRL_MODE_DEVICE            0x00000002
--#define  USB_MODE_CTRL_MODE_HOST              0x00000003
--#define  USB_MODE_CTRL_MODE_RSV               0x00000001
--#define  USB_MODE_SETUP_LOCK_OFF              0x00000008
--#define  USB_MODE_STREAM_DISABLE              0x00000010
--/* Endpoint Flush Register */
--#define EPFLUSH_TX_OFFSET                   0x00010000
--#define EPFLUSH_RX_OFFSET                   0x00000000
--
--/* Endpoint Setup Status bit masks */
--#define  EP_SETUP_STATUS_MASK                 0x0000003F
--#define  EP_SETUP_STATUS_EP0                0x00000001
--
--/* ENDPOINTCTRLx  Register Bit Masks */
--#define  EPCTRL_TX_ENABLE                     0x00800000
--#define  EPCTRL_TX_DATA_TOGGLE_RST            0x00400000      /* Not EP0 */
--#define  EPCTRL_TX_DATA_TOGGLE_INH            0x00200000      /* Not EP0 */
--#define  EPCTRL_TX_TYPE                       0x000C0000
--#define  EPCTRL_TX_DATA_SOURCE                0x00020000      /* Not EP0 */
--#define  EPCTRL_TX_EP_STALL                   0x00010000
--#define  EPCTRL_RX_ENABLE                     0x00000080
--#define  EPCTRL_RX_DATA_TOGGLE_RST            0x00000040      /* Not EP0 */
--#define  EPCTRL_RX_DATA_TOGGLE_INH            0x00000020      /* Not EP0 */
--#define  EPCTRL_RX_TYPE                       0x0000000C
--#define  EPCTRL_RX_DATA_SINK                  0x00000002      /* Not EP0 */
--#define  EPCTRL_RX_EP_STALL                   0x00000001
--
--/* bit 19-18 and 3-2 are endpoint type */
--#define  EPCTRL_EP_TYPE_CONTROL               0
--#define  EPCTRL_EP_TYPE_ISO                   1
--#define  EPCTRL_EP_TYPE_BULK                  2
--#define  EPCTRL_EP_TYPE_INTERRUPT             3
--#define  EPCTRL_TX_EP_TYPE_SHIFT              18
--#define  EPCTRL_RX_EP_TYPE_SHIFT              2
--
--/* SNOOPn Register Bit Masks */
--#define  SNOOP_ADDRESS_MASK                   0xFFFFF000
--#define  SNOOP_SIZE_ZERO                      0x00    /* snooping disable */
--#define  SNOOP_SIZE_4KB                       0x0B    /* 4KB snoop size */
--#define  SNOOP_SIZE_8KB                       0x0C
--#define  SNOOP_SIZE_16KB                      0x0D
--#define  SNOOP_SIZE_32KB                      0x0E
--#define  SNOOP_SIZE_64KB                      0x0F
--#define  SNOOP_SIZE_128KB                     0x10
--#define  SNOOP_SIZE_256KB                     0x11
--#define  SNOOP_SIZE_512KB                     0x12
--#define  SNOOP_SIZE_1MB                       0x13
--#define  SNOOP_SIZE_2MB                       0x14
--#define  SNOOP_SIZE_4MB                       0x15
--#define  SNOOP_SIZE_8MB                       0x16
--#define  SNOOP_SIZE_16MB                      0x17
--#define  SNOOP_SIZE_32MB                      0x18
--#define  SNOOP_SIZE_64MB                      0x19
--#define  SNOOP_SIZE_128MB                     0x1A
--#define  SNOOP_SIZE_256MB                     0x1B
--#define  SNOOP_SIZE_512MB                     0x1C
--#define  SNOOP_SIZE_1GB                       0x1D
--#define  SNOOP_SIZE_2GB                       0x1E    /* 2GB snoop size */
--
--/* pri_ctrl Register Bit Masks */
--#define  PRI_CTRL_PRI_LVL1                    0x0000000C
--#define  PRI_CTRL_PRI_LVL0                    0x00000003
--
--/* si_ctrl Register Bit Masks */
--#define  SI_CTRL_ERR_DISABLE                  0x00000010
--#define  SI_CTRL_IDRC_DISABLE                 0x00000008
--#define  SI_CTRL_RD_SAFE_EN                   0x00000004
--#define  SI_CTRL_RD_PREFETCH_DISABLE          0x00000002
--#define  SI_CTRL_RD_PREFEFETCH_VAL            0x00000001
--
--/* control Register Bit Masks */
--#define  USB_CTRL_IOENB                       0x00000004
--#define  USB_CTRL_ULPI_INT0EN                 0x00000001
- /* Endpoint Queue Head data struct
-  * Rem: all the variables of qh are LittleEndian Mode
-@@ -477,7 +297,10 @@ struct fsl_udc {
-       unsigned int irq;
-       struct usb_ctrlrequest local_setup_buff;
--      spinlock_t lock;
-+      spinlock_t lock;                /* udc lock */
-+      struct fsl_usb2_platform_data *pdata;
-+      u32 xcvr_type;
-+
-       struct otg_transceiver *transceiver;
-       unsigned softconnect:1;
-       unsigned vbus_active:1;
-@@ -514,7 +337,7 @@ struct fsl_udc {
- #define DBG(fmt, args...)     printk(KERN_DEBUG "[%s]  " fmt "\n", \
-                               __FUNCTION__, ## args)
- #else
--#define DBG(fmt, args...)     do{}while(0)
-+#define DBG(fmt, args...)     do {} while (0)
- #endif
- #if 0
-@@ -548,7 +371,7 @@ static void dump_msg(const char *label, 
- #ifdef VERBOSE
- #define VDBG          DBG
- #else
--#define VDBG(stuff...)        do{}while(0)
-+#define VDBG(stuff...)        do {} while (0)
- #endif
- #define ERR(stuff...)         pr_err("udc: " stuff)
-@@ -573,11 +396,14 @@ static void dump_msg(const char *label, 
- #define ep_maxpacket(EP)      ((EP)->ep.maxpacket)
- #define ep_is_in(EP)  ( (ep_index(EP) == 0) ? (EP->udc->ep0_dir == \
-                       USB_DIR_IN ):((EP)->desc->bEndpointAddress \
--                      & USB_DIR_IN)==USB_DIR_IN)
-+                      & USB_DIR_IN) == USB_DIR_IN)
- #define get_ep_by_pipe(udc, pipe)     ((pipe == 1)? &udc->eps[0]: \
-                                       &udc->eps[pipe])
- #define get_pipe_by_windex(windex)    ((windex & USB_ENDPOINT_NUMBER_MASK) \
-                                       * 2 + ((windex & USB_DIR_IN) ? 1 : 0))
- #define get_pipe_by_ep(EP)    (ep_index(EP) * 2 + ep_is_in(EP))
-+/* Bulk only class request */
-+#define USB_BULK_RESET_REQUEST          0xff
-+
- #endif
---- a/drivers/usb/gadget/gadget_chips.h
-+++ b/drivers/usb/gadget/gadget_chips.h
-@@ -147,6 +147,11 @@
- #define       gadget_is_m66592(g)     0
- #endif
-+#ifdef CONFIG_USB_GADGET_MCF5445X
-+#define gadget_is_mcf5445x(g) !strcmp("fsl-usb2-udc", (g)->name)
-+#else
-+#define gadget_is_mcf5445x(g) 0
-+#endif
- // CONFIG_USB_GADGET_SX2
- // CONFIG_USB_GADGET_AU1X00
-@@ -212,5 +217,7 @@ static inline int usb_gadget_controller_
-               return 0x20;
-       else if (gadget_is_m66592(gadget))
-               return 0x21;
-+      else if (gadget_is_mcf5445x(gadget))
-+              return 0x22;
-       return -ENOENT;
- }
---- a/drivers/usb/gadget/Kconfig
-+++ b/drivers/usb/gadget/Kconfig
-@@ -231,6 +231,26 @@ config SUPERH_BUILT_IN_M66592
-          However, this problem is improved if change a value of
-          NET_IP_ALIGN to 4.
-+config USB_GADGET_MCF5445X
-+      boolean "MCF5445X USB Device Controller"
-+      depends on M54455 && USB_M5445X_ULPI
-+      select USB_GADGET_DUALSPEED
-+      help
-+         Freescale's MCF5445X processors include
-+         an integrated device controller (as part of the OTG module).
-+         It has four programmable, bidirectional endpoints,
-+         including endpoint 0.
-+
-+         Say "y" to link the driver statically, or "m" to build a
-+         dynamically linked module called "mcf5445_udc" and force all
-+         gadget drivers to also be dynamically linked.
-+
-+config USB_MCF5445X
-+      tristate
-+      depends on USB_GADGET_MCF5445X
-+      default USB_GADGET
-+      select USB_GADGET_SELECTED
-+
- config USB_GADGET_GOKU
-       boolean "Toshiba TC86C001 'Goku-S'"
-       depends on PCI
-@@ -285,17 +305,6 @@ config USB_OMAP
-       default USB_GADGET
-       select USB_GADGET_SELECTED
--config USB_OTG
--      boolean "OTG Support"
--      depends on USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD
--      help
--         The most notable feature of USB OTG is support for a
--         "Dual-Role" device, which can act as either a device
--         or a host.  The initial role choice can be changed
--         later, when two dual-role devices talk to each other.
--
--         Select this only if your OMAP board has a Mini-AB connector.
--
- config USB_GADGET_S3C2410
-       boolean "S3C2410 USB Device Controller"
-       depends on ARCH_S3C2410
-@@ -369,6 +378,18 @@ config USB_DUMMY_HCD
- endchoice
-+config USB_OTG
-+      boolean "OTG Support"
-+      depends on (USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD) || \
-+                 (USB_GADGET_MCF5445X && USB_M5445X_ULPI)
-+      help
-+         The most notable feature of USB OTG is support for a
-+         "Dual-Role" device, which can act as either a device
-+         or a host.  The initial role choice can be changed
-+         later, when two dual-role devices talk to each other.
-+
-+         Select this only if your OMAP board has a Mini-AB connector.
-+
- config USB_GADGET_DUALSPEED
-       bool
-       depends on USB_GADGET
---- a/drivers/usb/gadget/Makefile
-+++ b/drivers/usb/gadget/Makefile
-@@ -17,6 +17,7 @@ obj-$(CONFIG_USB_AT91)               += at91_udc.o
- obj-$(CONFIG_USB_ATMEL_USBA)  += atmel_usba_udc.o
- obj-$(CONFIG_USB_FSL_USB2)    += fsl_usb2_udc.o
- obj-$(CONFIG_USB_M66592)      += m66592-udc.o
-+obj-$(CONFIG_USB_MCF5445X)    += mcf5445x_udc.o
- #
- # USB gadget drivers
---- /dev/null
-+++ b/drivers/usb/gadget/mcf5445x_udc.c
-@@ -0,0 +1,2745 @@
-+/*
-+ * Copyright Freescale Semiconductor, Inc. 2006-2007
-+ *
-+ *      Based on mpc_udc.c code
-+ *      of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.)
-+ *
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ *   v0.004   30 July 2007            Duck
-+ *            mcf5445x port
-+ *   v0.003   27 October 2006         Andrey Butok
-+ *            Added M5329EVB support (without external transceiver).
-+ *   v0.002   29 September 2006       Andrey Butok
-+ *            Some little changes. Added OTG support.
-+ *   v0.001   12 July 2006            Andrey Butok
-+ *            Initial Release - developed on uClinux with 2.6.17.1 kernel.
-+ *            Based on mpc_udc.c code
-+ *            of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.)
-+ *
-+ */
-+
-+#undef DEBUG
-+#undef VERBOSE
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/ioport.h>
-+#include <linux/types.h>
-+#include <linux/errno.h>
-+#include <linux/delay.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/irq.h>
-+#include <linux/timer.h>
-+#include <linux/list.h>
-+#include <linux/interrupt.h>
-+#include <linux/proc_fs.h>
-+#include <linux/mm.h>
-+#include <linux/platform_device.h>
-+#include <linux/moduleparam.h>
-+#include <linux/device.h>
-+#include <linux/usb/ch9.h>
-+#include <linux/usb/gadget.h>
-+#include <linux/usb/otg.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/dmapool.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_xcvr.h>
-+#include <linux/usb/fsl_usb2.h>
-+#include <linux/pm.h>
-+
-+#include <asm/byteorder.h>
-+#include <asm/system.h>
-+#include <asm/unaligned.h>
-+#include <asm/dma.h>
-+
-+#include <asm/mcfsim.h>
-+#include <asm/cacheflush.h>
-+
-+#include "fsl_usb2_udc.h"
-+
-+#define       DRIVER_DESC     "Freescale High-Speed USB SoC Device Controller driver"
-+#define       DRIVER_AUTHOR   "Freescale Semiconductor Inc."
-+#define       DRIVER_VERSION  "30 July 2007"
-+
-+#define cpu_to_hc32(x)        (x)
-+#define hc32_to_cpu(x)        (x)
-+
-+static int udc_suspend(struct fsl_udc *udc);
-+
-+#define       DMA_ADDR_INVALID        (~(dma_addr_t)0)
-+
-+static const char driver_name[] = "fsl-usb2-udc";
-+static const char driver_desc[] = DRIVER_DESC;
-+
-+volatile static struct fsl_usb_device_regs *dr_regs;
-+volatile static struct usb_sys_interface *usb_sys_regs;
-+
-+/* it is initialized in probe()  */
-+static struct fsl_udc *udc_controller;
-+
-+static const struct usb_endpoint_descriptor
-+fsl_ep0_desc = {
-+      .bLength =              USB_DT_ENDPOINT_SIZE,
-+      .bDescriptorType =      USB_DT_ENDPOINT,
-+      .bEndpointAddress =     0,
-+      .bmAttributes =         USB_ENDPOINT_XFER_CONTROL,
-+      .wMaxPacketSize =       USB_MAX_CTRL_PAYLOAD,
-+};
-+
-+static int fsl_udc_suspend(struct device *dev, pm_message_t state);
-+static int fsl_udc_resume(struct device *dev);
-+static void fsl_ep_fifo_flush(struct usb_ep *_ep);
-+
-+/********************************************************************
-+ *    Internal Used Function
-+********************************************************************/
-+/*-----------------------------------------------------------------
-+ * done() - retire a request; caller blocked irqs
-+ * @status : request status to be set, only works when
-+ *    request is still in progress.
-+ *--------------------------------------------------------------*/
-+static void done(struct fsl_ep *ep, struct fsl_req *req, int status)
-+{
-+      struct fsl_udc *udc = NULL;
-+      unsigned char stopped = ep->stopped;
-+
-+      udc = (struct fsl_udc *)ep->udc;
-+
-+      pr_debug("udc: req=0x%p\n", req);
-+      if (req->head) {
-+              pr_debug("udc: freeing head=0x%p\n", req->head);
-+              dma_pool_free(udc->td_pool, req->head, req->head->td_dma);
-+      }
-+
-+      /* the req->queue pointer is used by ep_queue() func, in which
-+       * the request will be added into a udc_ep->queue 'd tail
-+       * so here the req will be dropped from the ep->queue
-+       */
-+      list_del_init(&req->queue);
-+
-+      /* req.status should be set as -EINPROGRESS in ep_queue() */
-+      if (req->req.status == -EINPROGRESS)
-+              req->req.status = status;
-+      else
-+              status = req->req.status;
-+
-+      pr_debug("udc: req=0x%p  mapped=%x\n", req, req->mapped);
-+
-+      if (req->mapped) {
-+              pr_debug("udc: calling dma_unmap_single(buf,%s)  req=0x%p  "
-+                       "a=0x%x  len=%d\n",
-+                       ep_is_in(ep) ? "to_dvc" : "from_dvc",
-+                       req, req->req.dma, req->req.length);
-+
-+              dma_unmap_single(ep->udc->gadget.dev.parent,
-+                               req->req.dma, req->req.length, ep_is_in(ep) ?
-+                               DMA_TO_DEVICE : DMA_FROM_DEVICE);
-+
-+              req->req.dma = DMA_ADDR_INVALID;
-+              req->mapped = 0;
-+              pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma);
-+      } else {
-+              if ((req->req.length != 0)
-+                  && (req->req.dma != DMA_ADDR_INVALID)) {
-+                      pr_debug("udc: calling dma_sync_single_for_cpu(buf,%s) "
-+                               "req=0x%p  dma=0x%x  len=%d\n",
-+                               ep_is_in(ep) ? "to_dvc" : "from_dvc", req,
-+                               req->req.dma, req->req.length);
-+
-+                      dma_sync_single_for_cpu(ep->udc->gadget.dev.parent,
-+                                              req->req.dma, req->req.length,
-+                                              ep_is_in(ep) ? DMA_TO_DEVICE :
-+                                              DMA_FROM_DEVICE);
-+              }
-+      }
-+
-+      if (status && (status != -ESHUTDOWN)) {
-+              pr_debug("udc: complete %s req 0c%p stat %d len %u/%u\n",
-+                       ep->ep.name, &req->req, status,
-+                       req->req.actual, req->req.length);
-+      }
-+
-+      /* don't modify queue heads during completion callback */
-+      ep->stopped = 1;
-+
-+      spin_unlock(&ep->udc->lock);
-+
-+      /* this complete() should a func implemented by gadget layer,
-+       * eg fsg->bulk_in_complete() */
-+      if (req->req.complete) {
-+              pr_debug("udc: calling gadget's complete()  req=0x%p\n", req);
-+              req->req.complete(&ep->ep, &req->req);
-+              pr_debug("udc: back from gadget's complete()\n");
-+      }
-+
-+      spin_lock(&ep->udc->lock);
-+      ep->stopped = stopped;
-+}
-+
-+/*
-+ * nuke(): delete all requests related to this ep
-+ * called with spinlock held
-+ *--------------------------------------------------------------*/
-+static void nuke(struct fsl_ep *ep, int status)
-+{
-+      ep->stopped = 1;
-+
-+      /* Flush fifo */
-+      fsl_ep_fifo_flush(&ep->ep);
-+
-+      /* Whether this eq has request linked */
-+      while (!list_empty(&ep->queue)) {
-+              struct fsl_req *req = NULL;
-+
-+              req = list_entry(ep->queue.next, struct fsl_req, queue);
-+              done(ep, req, status);
-+      }
-+}
-+
-+/*------------------------------------------------------------------
-+      Internal Hardware related function
-+ ------------------------------------------------------------------*/
-+
-+static int dr_controller_setup(struct fsl_udc *udc)
-+{
-+      unsigned int tmp;
-+      unsigned int __attribute((unused)) ctrl = 0;
-+      unsigned long timeout;
-+      struct fsl_usb2_platform_data *pdata;
-+
-+#define FSL_UDC_RESET_TIMEOUT 1000
-+
-+      /* before here, make sure dr_regs has been initialized */
-+      if (!udc)
-+              return -EINVAL;
-+      pdata = udc->pdata;
-+
-+      /* Stop and reset the usb controller */
-+      tmp = fsl_readl(&dr_regs->usbcmd);
-+      tmp &= ~USB_CMD_RUN_STOP;
-+      fsl_writel(tmp, &dr_regs->usbcmd);
-+
-+      tmp = fsl_readl(&dr_regs->usbcmd);
-+      tmp |= USB_CMD_CTRL_RESET;
-+      fsl_writel(tmp, &dr_regs->usbcmd);
-+
-+      /* Wait for reset to complete */
-+      timeout = jiffies + FSL_UDC_RESET_TIMEOUT;
-+      while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) {
-+              if (time_after(jiffies, timeout)) {
-+                      ERR("udc reset timeout! \n");
-+                      return -ETIMEDOUT;
-+              }
-+              cpu_relax();
-+      }
-+
-+      tmp = fsl_readl(&dr_regs->usbmode);
-+      tmp &= ~0x3;    /* clear mode bits */
-+      tmp |= USB_MODE_CTRL_MODE_DEVICE;
-+      /* Disable Setup Lockout */
-+      tmp |= USB_MODE_SETUP_LOCK_OFF;
-+      if (pdata->es)
-+              tmp |= USBMODE_ES;
-+      fsl_writel(tmp, &dr_regs->usbmode);
-+
-+      if (pdata->xcvr_ops && pdata->xcvr_ops->set_device)
-+              pdata->xcvr_ops->set_device();
-+
-+      /* Clear the setup status */
-+      fsl_writel(0, &dr_regs->usbsts);
-+
-+      tmp = udc->ep_qh_dma;
-+      tmp &= USB_EP_LIST_ADDRESS_MASK;
-+      fsl_writel(tmp, &dr_regs->endpointlistaddr);
-+
-+      /*
-+      VDBG("vir[qh_base] is %p phy[qh_base] is 0x%8x reg is 0x%8x",
-+              (int)udc->ep_qh, (int)tmp,
-+              fsl_readl(&dr_regs->endpointlistaddr));
-+      */
-+
-+
-+      if (pdata->have_sysif_regs) {
-+              /* Config control enable i/o output, cpu endian register */
-+              ctrl = __raw_readl(&usb_sys_regs->control);
-+              ctrl |= USB_CTRL_IOENB;
-+              __raw_writel(ctrl, &usb_sys_regs->control);
-+      }
-+
-+#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
-+      /* Turn on cache snooping hardware, since some PowerPC platforms
-+       * wholly rely on hardware to deal with cache coherent. */
-+
-+      if (pdata->have_sysif_regs) {
-+              /* Setup Snooping for all the 4GB space */
-+              tmp = SNOOP_SIZE_2GB;   /* starts from 0x0, size 2G */
-+              __raw_writel(tmp, &usb_sys_regs->snoop1);
-+              tmp |= 0x80000000;      /* starts from 0x8000000, size 2G */
-+              __raw_writel(tmp, &usb_sys_regs->snoop2);
-+      }
-+#endif
-+
-+      return 0;
-+}
-+
-+static void pullup_enable(struct fsl_udc *udc)
-+{
-+      u32 temp;
-+
-+      unsigned short ccm = fsl_readw(&MCF_CCM_UOCSR);
-+      ccm |= MCF_CCM_UOCSR_BVLD;
-+      ccm &= ~MCF_CCM_UOCSR_SEND;
-+      fsl_writew(ccm, &MCF_CCM_UOCSR);
-+
-+      /* Enable DR irq reg */
-+      temp = USB_INTR_INT_EN | USB_INTR_ERR_INT_EN
-+              | USB_INTR_PTC_DETECT_EN | USB_INTR_RESET_EN
-+              | USB_INTR_DEVICE_SUSPEND | USB_INTR_SYS_ERR_EN;
-+
-+      fsl_writel(temp, &dr_regs->usbintr);
-+
-+      /* Set controller to Run */
-+      temp = fsl_readl(&dr_regs->usbcmd);
-+      temp |= USB_CMD_RUN_STOP;
-+      fsl_writel(temp, &dr_regs->usbcmd);
-+}
-+
-+static void pullup_disable(struct fsl_udc *udc)
-+{
-+      unsigned int tmp;
-+      unsigned short ccm;
-+
-+      VDBG();
-+      /* disable all INTRs */
-+      fsl_writel(0, &dr_regs->usbintr);
-+
-+      ccm = fsl_readw(&MCF_CCM_UOCSR);
-+      ccm &= ~MCF_CCM_UOCSR_BVLD;
-+      fsl_writew(ccm, &MCF_CCM_UOCSR);
-+
-+      /* set controller to Stop */
-+      tmp = fsl_readl(&dr_regs->usbcmd);
-+      tmp &= ~USB_CMD_RUN_STOP;
-+      fsl_writel(tmp, &dr_regs->usbcmd);
-+}
-+
-+static void dr_controller_run(struct fsl_udc *udc)
-+{
-+      VDBG();
-+      pullup_enable(udc);
-+      udc->stopped = 0;
-+}
-+
-+static void dr_controller_stop(struct fsl_udc *udc)
-+{
-+      pullup_disable(udc);
-+      udc->stopped = 1;
-+      udc->gadget.b_hnp_enable = 0;
-+      udc->gadget.a_hnp_support = 0;
-+      udc->gadget.a_alt_hnp_support = 0;
-+}
-+
-+void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type)
-+{
-+      unsigned int tmp_epctrl = 0;
-+
-+      tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+      if (dir) {
-+              if (ep_num)
-+                      tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST;
-+              tmp_epctrl |= EPCTRL_TX_ENABLE;
-+              tmp_epctrl |= ((unsigned int)(ep_type)
-+                              << EPCTRL_TX_EP_TYPE_SHIFT);
-+      } else {
-+              if (ep_num)
-+                      tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST;
-+              tmp_epctrl |= EPCTRL_RX_ENABLE;
-+              tmp_epctrl |= ((unsigned int)(ep_type)
-+                              << EPCTRL_RX_EP_TYPE_SHIFT);
-+      }
-+
-+      fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]);
-+}
-+
-+static void dr_ep_change_stall(unsigned char ep_num, unsigned char dir,
-+                             int value)
-+{
-+      u32 tmp_epctrl = 0;
-+
-+      tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+
-+      if (value) {
-+              /* set the stall bit */
-+              if (dir)
-+                      tmp_epctrl |= EPCTRL_TX_EP_STALL;
-+              else
-+                      tmp_epctrl |= EPCTRL_RX_EP_STALL;
-+      } else {
-+              /* clear the stall bit and reset data toggle */
-+              if (dir) {
-+                      tmp_epctrl &= ~EPCTRL_TX_EP_STALL;
-+                      tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST;
-+              } else {
-+                      tmp_epctrl &= ~EPCTRL_RX_EP_STALL;
-+                      tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST;
-+              }
-+      }
-+      fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]);
-+}
-+
-+/* Get stall status of a specific ep
-+   Return: 0: not stalled; 1:stalled */
-+static int dr_ep_get_stall(unsigned char ep_num, unsigned char dir)
-+{
-+      u32 epctrl;
-+
-+      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+      if (dir)
-+              return (epctrl & EPCTRL_TX_EP_STALL) ? 1 : 0;
-+      else
-+              return (epctrl & EPCTRL_RX_EP_STALL) ? 1 : 0;
-+}
-+
-+/********************************************************************
-+      Internal Structure Build up functions
-+********************************************************************/
-+
-+/*------------------------------------------------------------------
-+* struct_ep_qh_setup(): set the Endpoint Capabilites field of QH
-+ * @zlt: Zero Length Termination Select (1: disable; 0: enable)
-+ * @mult: Mult field
-+ ------------------------------------------------------------------*/
-+static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num,
-+              unsigned char dir, unsigned char ep_type,
-+              unsigned int max_pkt_len,
-+              unsigned int zlt, unsigned char mult)
-+{
-+      struct ep_queue_head *p_QH = &udc->ep_qh[2 * ep_num + dir];
-+      unsigned int tmp = 0;
-+
-+      /* set the Endpoint Capabilites in QH */
-+      switch (ep_type) {
-+      case USB_ENDPOINT_XFER_CONTROL:
-+              /* Interrupt On Setup (IOS). for control ep  */
-+              tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS)
-+                      | EP_QUEUE_HEAD_IOS;
-+              break;
-+      case USB_ENDPOINT_XFER_ISOC:
-+              tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS)
-+                      | (mult << EP_QUEUE_HEAD_MULT_POS);
-+              break;
-+      case USB_ENDPOINT_XFER_BULK:
-+      case USB_ENDPOINT_XFER_INT:
-+              tmp = max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS;
-+              break;
-+      default:
-+              VDBG("error ep type is %d", ep_type);
-+              return;
-+      }
-+      if (zlt)
-+              tmp |= EP_QUEUE_HEAD_ZLT_SEL;
-+      p_QH->max_pkt_length = cpu_to_hc32(tmp);
-+
-+      return;
-+}
-+
-+/* Setup qh structure and ep register for ep0. */
-+static void ep0_setup(struct fsl_udc *udc)
-+{
-+      /* the intialization of an ep includes: fields in QH, Regs,
-+       * fsl_ep struct */
-+      struct_ep_qh_setup(udc, 0, USB_RECV, USB_ENDPOINT_XFER_CONTROL,
-+                      USB_MAX_CTRL_PAYLOAD, 0, 0);
-+      struct_ep_qh_setup(udc, 0, USB_SEND, USB_ENDPOINT_XFER_CONTROL,
-+                      USB_MAX_CTRL_PAYLOAD, 0, 0);
-+      dr_ep_setup(0, USB_RECV, USB_ENDPOINT_XFER_CONTROL);
-+      dr_ep_setup(0, USB_SEND, USB_ENDPOINT_XFER_CONTROL);
-+
-+      return;
-+
-+}
-+
-+/***********************************************************************
-+              Endpoint Management Functions
-+***********************************************************************/
-+
-+/*-------------------------------------------------------------------------
-+ * when configurations are set, or when interface settings change
-+ * for example the do_set_interface() in gadget layer,
-+ * the driver will enable or disable the relevant endpoints
-+ * ep0 doesn't use this routine. It is always enabled.
-+-------------------------------------------------------------------------*/
-+static int fsl_ep_enable(struct usb_ep *_ep,
-+              const struct usb_endpoint_descriptor *desc)
-+{
-+      struct fsl_udc *udc = NULL;
-+      struct fsl_ep *ep = NULL;
-+      unsigned short max = 0;
-+      unsigned char mult = 0, zlt;
-+      int retval = -EINVAL;
-+      unsigned long flags = 0;
-+
-+      ep = container_of(_ep, struct fsl_ep, ep);
-+
-+      /* catch various bogus parameters */
-+      if (!_ep || !desc || ep->desc
-+                      || (desc->bDescriptorType != USB_DT_ENDPOINT))
-+              return -EINVAL;
-+
-+      udc = ep->udc;
-+
-+      if (!udc->driver || (udc->gadget.speed == USB_SPEED_UNKNOWN))
-+              return -ESHUTDOWN;
-+
-+      max = le16_to_cpu(desc->wMaxPacketSize);
-+
-+      /* Disable automatic zlp generation.  Driver is reponsible to indicate
-+       * explicitly through req->req.zero.  This is needed to enable multi-td
-+       * request. */
-+      zlt = 1;
-+
-+      /* Assume the max packet size from gadget is always correct */
-+      switch (desc->bmAttributes & 0x03) {
-+      case USB_ENDPOINT_XFER_CONTROL:
-+      case USB_ENDPOINT_XFER_BULK:
-+      case USB_ENDPOINT_XFER_INT:
-+              /* mult = 0.  Execute N Transactions as demonstrated by
-+               * the USB variable length packet protocol where N is
-+               * computed using the Maximum Packet Length (dQH) and
-+               * the Total Bytes field (dTD) */
-+              mult = 0;
-+              break;
-+      case USB_ENDPOINT_XFER_ISOC:
-+              /* Calculate transactions needed for high bandwidth iso */
-+              mult = (unsigned char)(1 + ((max >> 11) & 0x03));
-+              max = max & 0x8ff;      /* bit 0~10 */
-+              /* 3 transactions at most */
-+              if (mult > 3)
-+                      goto en_done;
-+              break;
-+      default:
-+              goto en_done;
-+      }
-+
-+      spin_lock_irqsave(&udc->lock, flags);
-+      ep->ep.maxpacket = max;
-+      ep->desc = desc;
-+      ep->stopped = 0;
-+
-+      /* Controller related setup */
-+      /* Init EPx Queue Head (Ep Capabilites field in QH
-+       * according to max, zlt, mult) */
-+      struct_ep_qh_setup(udc, (unsigned char) ep_index(ep),
-+                      (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN)
-+                                      ?  USB_SEND : USB_RECV),
-+                      (unsigned char) (desc->bmAttributes
-+                                      & USB_ENDPOINT_XFERTYPE_MASK),
-+                      max, zlt, mult);
-+
-+      /* Init endpoint ctrl register */
-+      dr_ep_setup((unsigned char) ep_index(ep),
-+                      (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN)
-+                                      ? USB_SEND : USB_RECV),
-+                      (unsigned char) (desc->bmAttributes
-+                                      & USB_ENDPOINT_XFERTYPE_MASK));
-+
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+      retval = 0;
-+
-+      VDBG("enabled %s (ep%d%s) maxpacket %d", ep->ep.name,
-+                      ep->desc->bEndpointAddress & 0x0f,
-+                      (desc->bEndpointAddress & USB_DIR_IN)
-+                              ? "in" : "out", max);
-+en_done:
-+      return retval;
-+}
-+
-+/*---------------------------------------------------------------------
-+ * @ep : the ep being unconfigured. May not be ep0
-+ * Any pending and uncomplete req will complete with status (-ESHUTDOWN)
-+*---------------------------------------------------------------------*/
-+static int fsl_ep_disable(struct usb_ep *_ep)
-+{
-+      struct fsl_udc *udc = NULL;
-+      struct fsl_ep *ep = NULL;
-+      unsigned long flags = 0;
-+      u32 epctrl;
-+      int ep_num;
-+
-+      ep = container_of(_ep, struct fsl_ep, ep);
-+      if (!_ep || !ep->desc) {
-+              pr_debug("udc: %s not enabled\n", _ep ? ep->ep.name : NULL);
-+              return -EINVAL;
-+      }
-+
-+      /* disable ep on controller */
-+      ep_num = ep_index(ep);
-+      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+      if (ep_is_in(ep))
-+              epctrl &= ~EPCTRL_TX_ENABLE;
-+      else
-+              epctrl &= ~EPCTRL_RX_ENABLE;
-+      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
-+
-+      udc = (struct fsl_udc *)ep->udc;
-+      spin_lock_irqsave(&udc->lock, flags);
-+
-+      /* nuke all pending requests (does flush) */
-+      nuke(ep, -ESHUTDOWN);
-+
-+      ep->desc = 0;
-+      ep->stopped = 1;
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+
-+      pr_debug("udc: disabled %s OK\n", _ep->name);
-+      return 0;
-+}
-+
-+/*---------------------------------------------------------------------
-+ * allocate a request object used by this endpoint
-+ * the main operation is to insert the req->queue to the eq->queue
-+ * Returns the request, or null if one could not be allocated
-+*---------------------------------------------------------------------*/
-+static struct usb_request *
-+fsl_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
-+{
-+      struct fsl_req *req = NULL;
-+
-+      req = kzalloc(sizeof *req, gfp_flags);
-+      if (!req)
-+              return NULL;
-+
-+      req->req.dma = DMA_ADDR_INVALID;
-+      pr_debug("udc: req=0x%p   set req.dma=0x%x\n", req, req->req.dma);
-+      INIT_LIST_HEAD(&req->queue);
-+
-+      return &req->req;
-+}
-+
-+static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req)
-+{
-+      struct fsl_req *req;
-+
-+      req = container_of(_req, struct fsl_req, req);
-+      pr_debug("udc: req=0x%p\n", req);
-+
-+      if (_req)
-+              kfree(req);
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
-+{
-+      int i = ep_index(ep) * 2 + ep_is_in(ep);
-+      u32 temp, bitmask, tmp_stat;
-+      struct ep_queue_head *dQH = &ep->udc->ep_qh[i];
-+
-+      pr_debug("udc: queue req=0x%p to ep index %d\n", req, i);
-+
-+      bitmask = ep_is_in(ep)
-+              ? (1 << (ep_index(ep) + 16))
-+              : (1 << (ep_index(ep)));
-+
-+      /* check if the pipe is empty */
-+      if (!(list_empty(&ep->queue))) {
-+              /* Add td to the end */
-+              struct fsl_req *lastreq;
-+              lastreq = list_entry(ep->queue.prev, struct fsl_req, queue);
-+              lastreq->tail->next_td_ptr =
-+                      cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK);
-+              /* Read prime bit, if 1 goto done */
-+              if (fsl_readl(&dr_regs->endpointprime) & bitmask)
-+                      goto out;
-+
-+              do {
-+                      /* Set ATDTW bit in USBCMD */
-+                      temp = fsl_readl(&dr_regs->usbcmd);
-+                      fsl_writel(temp | USB_CMD_ATDTW, &dr_regs->usbcmd);
-+
-+                      /* Read correct status bit */
-+                      tmp_stat = fsl_readl(&dr_regs->endptstatus) & bitmask;
-+
-+              } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_ATDTW));
-+
-+              /* Write ATDTW bit to 0 */
-+              temp = fsl_readl(&dr_regs->usbcmd);
-+              fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd);
-+
-+              if (tmp_stat)
-+                      goto out;
-+      }
-+
-+      /* Write dQH next pointer and terminate bit to 0 */
-+      temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK;
-+      dQH->next_dtd_ptr = cpu_to_hc32(temp);
-+
-+      /* Clear active and halt bit */
-+      temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE
-+                      | EP_QUEUE_HEAD_STATUS_HALT));
-+      dQH->size_ioc_int_sts &= temp;
-+
-+      /* Prime endpoint by writing 1 to ENDPTPRIME */
-+      temp = ep_is_in(ep)
-+              ? (1 << (ep_index(ep) + 16))
-+              : (1 << (ep_index(ep)));
-+      fsl_writel(temp, &dr_regs->endpointprime);
-+out:
-+      return 0;
-+}
-+
-+/* Fill in the dTD structure
-+ * @req: request that the transfer belongs to
-+ * @length: return actually data length of the dTD
-+ * @dma: return dma address of the dTD
-+ * @is_last: return flag if it is the last dTD of the request
-+ * return: pointer to the built dTD */
-+static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length,
-+              dma_addr_t *dma, int *is_last)
-+{
-+      u32 swap_temp;
-+      struct ep_td_struct *dtd;
-+
-+      /* how big will this transfer be? */
-+      *length = min(req->req.length - req->req.actual,
-+                      (unsigned)EP_MAX_LENGTH_TRANSFER);
-+
-+      dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma);
-+      if (dtd == NULL)
-+              return dtd;
-+
-+      dtd->td_dma = *dma;
-+      /* Clear reserved field */
-+      swap_temp = hc32_to_cpu(dtd->size_ioc_sts);
-+      swap_temp &= ~DTD_RESERVED_FIELDS;
-+      dtd->size_ioc_sts = cpu_to_hc32(swap_temp);
-+
-+      /* Init all of buffer page pointers */
-+      swap_temp = (u32) (req->req.dma + req->req.actual);
-+      dtd->buff_ptr0 = cpu_to_hc32(swap_temp);
-+      dtd->buff_ptr1 = cpu_to_hc32(swap_temp + 0x1000);
-+      dtd->buff_ptr2 = cpu_to_hc32(swap_temp + 0x2000);
-+      dtd->buff_ptr3 = cpu_to_hc32(swap_temp + 0x3000);
-+      dtd->buff_ptr4 = cpu_to_hc32(swap_temp + 0x4000);
-+
-+      req->req.actual += *length;
-+
-+      /* zlp is needed if req->req.zero is set */
-+      if (req->req.zero) {
-+              if (*length == 0 || (*length % req->ep->ep.maxpacket) != 0)
-+                      *is_last = 1;
-+              else
-+                      *is_last = 0;
-+      } else if (req->req.length == req->req.actual)
-+              *is_last = 1;
-+      else
-+              *is_last = 0;
-+
-+      if ((*is_last) == 0)
-+              VDBG("multi-dtd request!\n");
-+      /* Fill in the transfer size; set active bit */
-+      swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE);
-+
-+      /* Enable interrupt for the last dtd of a request */
-+      if (*is_last && !req->req.no_interrupt)
-+              swap_temp |= DTD_IOC;
-+
-+      dtd->size_ioc_sts = cpu_to_hc32(swap_temp);
-+
-+      mb();
-+
-+      VDBG("length = %d address= 0x%x", *length, (int)*dma);
-+
-+      return dtd;
-+}
-+
-+/* Generate dtd chain for a request */
-+static int fsl_req_to_dtd(struct fsl_req *req)
-+{
-+      unsigned        count;
-+      int             is_last;
-+      int             is_first = 1;
-+      struct ep_td_struct     *last_dtd = NULL, *dtd;
-+      dma_addr_t dma;
-+
-+      do {
-+              dtd = fsl_build_dtd(req, &count, &dma, &is_last);
-+              if (dtd == NULL)
-+                      return -ENOMEM;
-+
-+              if (is_first) {
-+                      is_first = 0;
-+                      req->head = dtd;
-+              } else {
-+                      last_dtd->next_td_ptr = hc32_to_cpu(dma);
-+                      last_dtd->next_td_virt = dtd;
-+              }
-+              last_dtd = dtd;
-+
-+              req->dtd_count++;
-+      } while (!is_last);
-+
-+      dtd->next_td_ptr = cpu_to_hc32(DTD_NEXT_TERMINATE);
-+
-+      req->tail = dtd;
-+
-+      return 0;
-+}
-+
-+/* queues (submits) an I/O request to an endpoint */
-+static int
-+fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
-+{
-+      struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep);
-+      struct fsl_req *req = container_of(_req, struct fsl_req, req);
-+      struct fsl_udc *udc;
-+      unsigned long flags;
-+      int is_iso = 0;
-+
-+      /* catch various bogus parameters */
-+      if (!_req || !req->req.complete || !req->req.buf
-+                      || !list_empty(&req->queue)) {
-+              VDBG("%s, bad params\n", __FUNCTION__);
-+              return -EINVAL;
-+      }
-+      if (!_ep || (!ep->desc && ep_index(ep))) {
-+              VDBG("%s, bad ep\n", __FUNCTION__);
-+              return -EINVAL;
-+      }
-+      if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
-+              if (req->req.length > ep->ep.maxpacket)
-+                      return -EMSGSIZE;
-+              is_iso = 1;
-+      }
-+
-+      udc = ep->udc;
-+      if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN)
-+              return -ESHUTDOWN;
-+
-+      req->ep = ep;
-+
-+      /* map virtual address to hardware */
-+      if (req->req.dma == DMA_ADDR_INVALID) {
-+              req->req.dma = dma_map_single(ep->udc->gadget.dev.parent,
-+                                      req->req.buf,
-+                                      req->req.length, ep_is_in(ep)
-+                                              ? DMA_TO_DEVICE
-+                                              : DMA_FROM_DEVICE);
-+              req->mapped = 1;
-+      } else {
-+              dma_sync_single_for_device(ep->udc->gadget.dev.parent,
-+                                      req->req.dma, req->req.length,
-+                                      ep_is_in(ep)
-+                                              ? DMA_TO_DEVICE
-+                                              : DMA_FROM_DEVICE);
-+              req->mapped = 0;
-+      }
-+
-+      req->req.status = -EINPROGRESS;
-+      req->req.actual = 0;
-+      req->dtd_count = 0;
-+
-+      spin_lock_irqsave(&udc->lock, flags);
-+
-+      /* build dtds and push them to device queue */
-+      if (!fsl_req_to_dtd(req)) {
-+              fsl_queue_td(ep, req);
-+      } else {
-+              spin_unlock_irqrestore(&udc->lock, flags);
-+              return -ENOMEM;
-+      }
-+
-+      /* Update ep0 state */
-+      if ((ep_index(ep) == 0))
-+              udc->ep0_state = DATA_STATE_XMIT;
-+
-+      /* irq handler advances the queue */
-+      if (req != NULL)
-+              list_add_tail(&req->queue, &ep->queue);
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+
-+      return 0;
-+}
-+
-+/* dequeues (cancels, unlinks) an I/O request from an endpoint */
-+static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
-+{
-+      struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep);
-+      struct fsl_req *req;
-+      unsigned long flags;
-+      int ep_num, stopped, ret = 0;
-+      u32 epctrl;
-+
-+      if (!_ep || !_req)
-+              return -EINVAL;
-+
-+      spin_lock_irqsave(&ep->udc->lock, flags);
-+      stopped = ep->stopped;
-+
-+      /* Stop the ep before we deal with the queue */
-+      ep->stopped = 1;
-+      ep_num = ep_index(ep);
-+      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+      if (ep_is_in(ep))
-+              epctrl &= ~EPCTRL_TX_ENABLE;
-+      else
-+              epctrl &= ~EPCTRL_RX_ENABLE;
-+      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
-+
-+      /* make sure it's actually queued on this endpoint */
-+      list_for_each_entry(req, &ep->queue, queue) {
-+              if (&req->req == _req)
-+                      break;
-+      }
-+      if (&req->req != _req) {
-+              ret = -EINVAL;
-+              goto out;
-+      }
-+
-+      /* The request is in progress, or completed but not dequeued */
-+      if (ep->queue.next == &req->queue) {
-+              _req->status = -ECONNRESET;
-+              fsl_ep_fifo_flush(_ep); /* flush current transfer */
-+
-+              /* The request isn't the last request in this ep queue */
-+              if (req->queue.next != &ep->queue) {
-+                      struct ep_queue_head *qh;
-+                      struct fsl_req *next_req;
-+
-+                      qh = ep->qh;
-+                      next_req = list_entry(req->queue.next, struct fsl_req,
-+                                      queue);
-+
-+                      /* Point the QH to the first TD of next request */
-+                      fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr);
-+              }
-+
-+              /* The request hasn't been processed, patch up the TD chain */
-+      } else {
-+              struct fsl_req *prev_req;
-+
-+              prev_req = list_entry(req->queue.prev, struct fsl_req, queue);
-+              fsl_writel(fsl_readl(&req->tail->next_td_ptr),
-+                              &prev_req->tail->next_td_ptr);
-+
-+      }
-+
-+      done(ep, req, -ECONNRESET);
-+
-+      /* Enable EP */
-+out:  epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
-+      if (ep_is_in(ep))
-+              epctrl |= EPCTRL_TX_ENABLE;
-+      else
-+              epctrl |= EPCTRL_RX_ENABLE;
-+      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
-+      ep->stopped = stopped;
-+
-+      spin_unlock_irqrestore(&ep->udc->lock, flags);
-+      return ret;
-+}
-+
-+/*-------------------------------------------------------------------------*/
-+
-+/*-----------------------------------------------------------------
-+ * modify the endpoint halt feature
-+ * @ep: the non-isochronous endpoint being stalled
-+ * @value: 1--set halt  0--clear halt
-+ * Returns zero, or a negative error code.
-+*----------------------------------------------------------------*/
-+static int fsl_ep_set_halt(struct usb_ep *_ep, int value)
-+{
-+      struct fsl_ep *ep = NULL;
-+      unsigned long flags = 0;
-+      int status = -EOPNOTSUPP;       /* operation not supported */
-+      unsigned char ep_dir = 0, ep_num = 0;
-+      struct fsl_udc *udc = NULL;
-+
-+      ep = container_of(_ep, struct fsl_ep, ep);
-+      udc = ep->udc;
-+      if (!_ep || !ep->desc) {
-+              status = -EINVAL;
-+              goto out;
-+      }
-+
-+      if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
-+              status = -EOPNOTSUPP;
-+              goto out;
-+      }
-+
-+      /* Attempt to halt IN ep will fail if any transfer requests
-+       * are still queue */
-+      if (value && ep_is_in(ep) && !list_empty(&ep->queue)) {
-+              status = -EAGAIN;
-+              goto out;
-+      }
-+
-+      status = 0;
-+      ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV;
-+      ep_num = (unsigned char)(ep_index(ep));
-+      spin_lock_irqsave(&ep->udc->lock, flags);
-+      dr_ep_change_stall(ep_num, ep_dir, value);
-+      spin_unlock_irqrestore(&ep->udc->lock, flags);
-+
-+      if (ep_index(ep) == 0) {
-+              udc->ep0_state = WAIT_FOR_SETUP;
-+              udc->ep0_dir = 0;
-+      }
-+out:
-+      VDBG(" %s %s halt stat %d", ep->ep.name,
-+                      value ?  "set" : "clear", status);
-+
-+      return status;
-+}
-+
-+static void fsl_ep_fifo_flush(struct usb_ep *_ep)
-+{
-+      struct fsl_ep *ep;
-+      int ep_num, ep_dir;
-+      u32 bits;
-+      unsigned long timeout;
-+#define FSL_UDC_FLUSH_TIMEOUT 1000
-+
-+      if (!_ep) {
-+              return;
-+      } else {
-+              ep = container_of(_ep, struct fsl_ep, ep);
-+              if (!ep->desc)
-+                      return;
-+      }
-+      ep_num = ep_index(ep);
-+      ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV;
-+
-+      if (ep_num == 0)
-+              bits = (1 << 16) | 1;
-+      else if (ep_dir == USB_SEND)
-+              bits = 1 << (16 + ep_num);
-+      else
-+              bits = 1 << ep_num;
-+
-+      timeout = jiffies + FSL_UDC_FLUSH_TIMEOUT;
-+      do {
-+              fsl_writel(bits, &dr_regs->endptflush);
-+
-+              /* Wait until flush complete */
-+              while (fsl_readl(&dr_regs->endptflush)) {
-+                      if (time_after(jiffies, timeout)) {
-+                              ERR("ep flush timeout\n");
-+                              return;
-+                      }
-+                      cpu_relax();
-+              }
-+              /* See if we need to flush again */
-+      } while (fsl_readl(&dr_regs->endptstatus) & bits);
-+}
-+
-+static struct usb_ep_ops fsl_ep_ops = {
-+      .enable = fsl_ep_enable,
-+      .disable = fsl_ep_disable,
-+
-+      .alloc_request = fsl_alloc_request,
-+      .free_request = fsl_free_request,
-+
-+      .queue = fsl_ep_queue,
-+      .dequeue = fsl_ep_dequeue,
-+
-+      .set_halt = fsl_ep_set_halt,
-+      .fifo_flush = fsl_ep_fifo_flush,        /* flush fifo */
-+};
-+
-+/*-------------------------------------------------------------------------
-+              Gadget Driver Layer Operations
-+-------------------------------------------------------------------------*/
-+
-+/*----------------------------------------------------------------------
-+ * Get the current frame number (from DR frame_index Reg )
-+ *----------------------------------------------------------------------*/
-+static int fsl_get_frame(struct usb_gadget *gadget)
-+{
-+      return (int)(fsl_readl(&dr_regs->frindex) & USB_FRINDEX_MASKS);
-+}
-+
-+/*-----------------------------------------------------------------------
-+ * Tries to wake up the host connected to this gadget
-+ -----------------------------------------------------------------------*/
-+static int fsl_wakeup(struct usb_gadget *gadget)
-+{
-+      struct fsl_udc *udc = container_of(gadget, struct fsl_udc, gadget);
-+      u32 portsc;
-+
-+      /* Remote wakeup feature not enabled by host */
-+      if (!udc->remote_wakeup)
-+              return -ENOTSUPP;
-+
-+      portsc = fsl_readl(&dr_regs->portsc1);
-+      /* not suspended? */
-+      if (!(portsc & PORTSCX_PORT_SUSPEND))
-+              return 0;
-+      /* trigger force resume */
-+      portsc |= PORTSCX_PORT_FORCE_RESUME;
-+      fsl_writel(portsc, &dr_regs->portsc1);
-+      return 0;
-+}
-+
-+static int can_pullup(struct fsl_udc *udc)
-+{
-+      return udc->driver && udc->softconnect && udc->vbus_active;
-+}
-+
-+/*
-+ * Notify controller that VBUS is powered, Called by whatever
-+ * detects VBUS sessions
-+ * @param gadger    gadger pointer
-+ * @param is_active is active?
-+ * @return Returns zero on success , or a negative error code
-+ */
-+static int fsl_vbus_session(struct usb_gadget *gadget, int is_active)
-+{
-+      struct fsl_udc  *udc;
-+      unsigned long   flags;
-+
-+      udc = container_of(gadget, struct fsl_udc, gadget);
-+      spin_lock_irqsave(&udc->lock, flags);
-+
-+      pr_debug("udc: VBUS %s\n", is_active ? "on" : "off");
-+      udc->vbus_active = (is_active != 0);
-+
-+      if (can_pullup(udc)) {
-+              pullup_enable(udc);
-+              udc_controller->usb_state = USB_STATE_ATTACHED;
-+      } else {
-+              pullup_disable(udc);
-+              udc_controller->usb_state = USB_STATE_NOTATTACHED;
-+      }
-+      udc_controller->ep0_state = WAIT_FOR_SETUP;
-+      udc_controller->ep0_dir = 0;
-+
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+      return 0;
-+}
-+
-+/* constrain controller's VBUS power usage
-+ * This call is used by gadget drivers during SET_CONFIGURATION calls,
-+ * reporting how much power the device may consume.  For example, this
-+ * could affect how quickly batteries are recharged.
-+ *
-+ * Returns zero on success, else negative errno.
-+ */
-+static int fsl_vbus_draw(struct usb_gadget *gadget, unsigned mA)
-+{
-+#ifdef CONFIG_USB_OTG
-+      struct fsl_udc *udc;
-+
-+      udc = container_of(gadget, struct fsl_udc, gadget);
-+
-+      if (udc->transceiver)
-+              return otg_set_power(udc->transceiver, mA);
-+#endif
-+      return -ENOTSUPP;
-+}
-+
-+/*
-+ * Change Data+ pullup status
-+ * this func is used by usb_gadget_connect/disconnet
-+ */
-+static int fsl_pullup(struct usb_gadget *gadget, int is_on)
-+{
-+      struct fsl_udc *udc;
-+
-+      udc = container_of(gadget, struct fsl_udc, gadget);
-+      udc->softconnect = (is_on != 0);
-+      if (can_pullup(udc))
-+              fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
-+                              &dr_regs->usbcmd);
-+      else
-+              fsl_writel((fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP),
-+                              &dr_regs->usbcmd);
-+
-+      return 0;
-+}
-+
-+/* defined in usb_gadget.h */
-+static struct usb_gadget_ops fsl_gadget_ops = {
-+      .get_frame = fsl_get_frame,
-+      .wakeup = fsl_wakeup,
-+      .vbus_session = fsl_vbus_session,
-+      .vbus_draw = fsl_vbus_draw,
-+      .pullup = fsl_pullup,
-+};
-+
-+/* Set protocol stall on ep0, protocol stall will automatically be cleared
-+   on new transaction */
-+static void ep0stall(struct fsl_udc *udc)
-+{
-+      u32 tmp;
-+
-+      /* must set tx and rx to stall at the same time */
-+      tmp = fsl_readl(&dr_regs->endptctrl[0]);
-+      tmp |= EPCTRL_TX_EP_STALL | EPCTRL_RX_EP_STALL;
-+      fsl_writel(tmp, &dr_regs->endptctrl[0]);
-+      udc->ep0_state = WAIT_FOR_SETUP;
-+      udc->ep0_dir = 0;
-+}
-+
-+/* Prime a status phase for ep0 */
-+static int ep0_prime_status(struct fsl_udc *udc, int direction)
-+{
-+      struct fsl_req *req = udc->status_req;
-+      struct fsl_ep *ep;
-+      int status = 0;
-+
-+      if (direction == EP_DIR_IN)
-+              udc->ep0_dir = USB_DIR_IN;
-+      else
-+              udc->ep0_dir = USB_DIR_OUT;
-+
-+      ep = &udc->eps[0];
-+      udc->ep0_state = WAIT_FOR_OUT_STATUS;
-+
-+      req->ep = ep;
-+      req->req.length = 0;
-+      req->req.status = -EINPROGRESS;
-+      req->req.actual = 0;
-+      req->req.complete = NULL;
-+      req->dtd_count = 0;
-+
-+      if (fsl_req_to_dtd(req) == 0)
-+              status = fsl_queue_td(ep, req);
-+      else
-+              return -ENOMEM;
-+
-+      if (status)
-+              ERR("Can't queue ep0 status request \n");
-+      list_add_tail(&req->queue, &ep->queue);
-+
-+      return status;
-+}
-+
-+static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
-+{
-+      struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
-+
-+      if (!ep->name)
-+              return 0;
-+
-+      nuke(ep, -ESHUTDOWN);
-+
-+      return 0;
-+}
-+
-+/*
-+ * ch9 Set address
-+ */
-+static void ch9setaddress(struct fsl_udc *udc, u16 value, u16 index, u16 length)
-+{
-+      /* Save the new address to device struct */
-+      udc->device_address = (u8) value;
-+      /* Update usb state */
-+      udc->usb_state = USB_STATE_ADDRESS;
-+      /* Status phase */
-+      if (ep0_prime_status(udc, EP_DIR_IN))
-+              ep0stall(udc);
-+}
-+
-+/*
-+ * ch9 Get status
-+ */
-+static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
-+                       u16 index, u16 length)
-+{
-+      u16 tmp = 0;            /* Status, cpu endian */
-+
-+      struct fsl_req *req;
-+      struct fsl_ep *ep;
-+      int status = 0;
-+
-+      ep = &udc->eps[0];
-+
-+      if ((request_type & USB_RECIP_MASK) == USB_RECIP_DEVICE) {
-+              /* Get device status */
-+              tmp = 1 << USB_DEVICE_SELF_POWERED;
-+              tmp |= udc->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP;
-+      } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_INTERFACE) {
-+              /* Get interface status */
-+              /* We don't have interface information in udc driver */
-+              tmp = 0;
-+      } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_ENDPOINT) {
-+              /* Get endpoint status */
-+              struct fsl_ep *target_ep;
-+
-+              target_ep = get_ep_by_pipe(udc, get_pipe_by_windex(index));
-+
-+              /* stall if endpoint doesn't exist */
-+              if (!target_ep->desc)
-+                      goto stall;
-+              tmp = dr_ep_get_stall(ep_index(target_ep), ep_is_in(target_ep))
-+                              << USB_ENDPOINT_HALT;
-+      }
-+
-+      udc->ep0_dir = USB_DIR_IN;
-+      /* Borrow the per device status_req */
-+      req = udc->status_req;
-+      /* Fill in the reqest structure */
-+      *((u16 *) req->req.buf) = cpu_to_le16(tmp);
-+      req->ep = ep;
-+      req->req.length = 2;
-+      req->req.status = -EINPROGRESS;
-+      req->req.actual = 0;
-+      req->req.complete = NULL;
-+      req->dtd_count = 0;
-+
-+      /* prime the data phase */
-+      if ((fsl_req_to_dtd(req) == 0))
-+              status = fsl_queue_td(ep, req);
-+      else                    /* no mem */
-+              goto stall;
-+
-+      if (status) {
-+              ERR("Can't respond to getstatus request \n");
-+              goto stall;
-+      }
-+      list_add_tail(&req->queue, &ep->queue);
-+      udc->ep0_state = DATA_STATE_XMIT;
-+      return;
-+stall:
-+      ep0stall(udc);
-+}
-+
-+static void ch9setconfig(struct fsl_udc *udc, u16 value, u16 index,
-+                       u16 length)
-+{
-+      pr_debug("udc: 1 calling gadget driver->setup\n");
-+      udc->ep0_dir = USB_DIR_IN;
-+      if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) >= 0) {
-+              /* gadget layer deal with the status phase */
-+              udc->usb_state = USB_STATE_CONFIGURED;
-+              udc->ep0_state = WAIT_FOR_OUT_STATUS;
-+              pr_debug("udc: ep0_state now WAIT_FOR_OUT_STATUS\n");
-+      }
-+}
-+
-+static void setup_received_irq(struct fsl_udc *udc,
-+                             struct usb_ctrlrequest *setup)
-+{
-+      u32 tmp;
-+      u16 ptc = 0;            /* port test control */
-+      int handled = 1;        /* set to zero if we do not handle the message,
-+                                 and should pass it to the gadget driver */
-+
-+      /*
-+       * gadget drivers expect the setup pkt to be in wire format,
-+       * so leave it alone and make local copies of stuff we need.
-+       */
-+      u16 wValue = le16_to_cpu(setup->wValue);
-+      u16 wIndex = le16_to_cpu(setup->wIndex);
-+      u16 wLength = le16_to_cpu(setup->wLength);
-+
-+
-+      pr_debug("udc: request=0x%x\n", setup->bRequest);
-+
-+      udc_reset_ep_queue(udc, 0);
-+
-+      /* We asume setup only occurs on EP0 */
-+      if (setup->bRequestType & USB_DIR_IN)
-+              udc->ep0_dir = USB_DIR_IN;
-+      else
-+              udc->ep0_dir = USB_DIR_OUT;
-+
-+      if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) {
-+              /* handle class requests */
-+              switch (setup->bRequest) {
-+
-+              case USB_BULK_RESET_REQUEST:
-+                      udc->ep0_dir = USB_DIR_IN;
-+                      if (udc->driver->setup(&udc->gadget,
-+                                             &udc->local_setup_buff) >= 0) {
-+                              udc->ep0_state = WAIT_FOR_SETUP;
-+                              pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n");
-+                      }
-+                      break;
-+
-+              default:
-+                      handled = 0;
-+                      break;
-+              }
-+      } else if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
-+              /* handle standard requests */
-+              switch (setup->bRequest) {
-+
-+              case USB_REQ_GET_STATUS:
-+                      if ((setup->
-+                           bRequestType & (USB_DIR_IN | USB_TYPE_STANDARD))
-+                          != (USB_DIR_IN | USB_TYPE_STANDARD))
-+                              break;
-+                      ch9getstatus(udc, setup->bRequestType, wValue, wIndex,
-+                                   wLength);
-+                      break;
-+
-+              case USB_REQ_SET_ADDRESS:
-+                      if (setup->bRequestType !=
-+                          (USB_DIR_OUT | USB_TYPE_STANDARD |
-+                           USB_RECIP_DEVICE))
-+                              break;
-+                      ch9setaddress(udc, wValue, wIndex, wLength);
-+                      break;
-+
-+              case USB_REQ_SET_CONFIGURATION:
-+                      if (setup->bRequestType !=
-+                          (USB_DIR_OUT | USB_TYPE_STANDARD |
-+                           USB_RECIP_DEVICE))
-+                              break;
-+                      /* gadget layer take over the status phase */
-+                      ch9setconfig(udc, wValue, wIndex, wLength);
-+                      break;
-+              case USB_REQ_SET_INTERFACE:
-+                      if (setup->bRequestType !=
-+                          (USB_DIR_OUT | USB_TYPE_STANDARD |
-+                           USB_RECIP_INTERFACE))
-+                              break;
-+                      udc->ep0_dir = USB_DIR_IN;
-+                      if (udc->driver->setup(&udc->gadget,
-+                                             &udc->local_setup_buff) >= 0)
-+                              /* gadget layer take over the status phase */
-+                              break;
-+                      /* Requests with no data phase */
-+              case USB_REQ_CLEAR_FEATURE:
-+              case USB_REQ_SET_FEATURE:
-+                      {       /* status transaction */
-+                              int rc = -EOPNOTSUPP;
-+
-+                              if ((setup->bRequestType & USB_TYPE_MASK) !=
-+                                  USB_TYPE_STANDARD)
-+                                      break;
-+
-+                              /* we only support set/clear feature for
-+                               * endpoint */
-+                              if (setup->bRequestType == USB_RECIP_ENDPOINT) {
-+                                      int dir = (wIndex & 0x0080) ?
-+                                          EP_DIR_IN : EP_DIR_OUT;
-+                                      int num = (wIndex & 0x000f);
-+                                      struct fsl_ep *ep;
-+
-+                                      if (wValue != 0
-+                                          || wLength != 0
-+                                          || (num * 2 + dir) > udc->max_ep)
-+                                              break;
-+                                      ep = &udc->eps[num * 2 + dir];
-+
-+                                      if (setup->bRequest ==
-+                                          USB_REQ_SET_FEATURE) {
-+                                              pr_debug("udc: udc: SET_FEATURE"
-+                                                       " doing set_halt\n");
-+                                              rc = fsl_ep_set_halt(&ep-> ep,
-+                                                                   1);
-+                                      } else {
-+                                              pr_debug("udc: CLEAR_FEATURE"
-+                                                       " doing clear_halt\n");
-+                                              rc = fsl_ep_set_halt(&ep-> ep,
-+                                                                   0);
-+                                      }
-+
-+                              } else if (setup->bRequestType ==
-+                                         USB_RECIP_DEVICE) {
-+                                      if (setup->bRequest ==
-+                                          USB_REQ_SET_FEATURE) {
-+                                              ptc = wIndex >> 8;
-+                                              rc = 0;
-+                                      }
-+                                      if (!udc->gadget.is_otg)
-+                                              break;
-+                                      else if (setup->bRequest ==
-+                                               USB_DEVICE_B_HNP_ENABLE)
-+                                              udc->gadget.b_hnp_enable = 1;
-+                                      else if (setup->bRequest ==
-+                                               USB_DEVICE_A_HNP_SUPPORT)
-+                                              udc->gadget.a_hnp_support = 1;
-+                                      else if (setup->bRequest ==
-+                                               USB_DEVICE_A_ALT_HNP_SUPPORT)
-+                                              udc->gadget.a_alt_hnp_support =
-+                                                  1;
-+                                      rc = 0;
-+                              }
-+                              if (rc == 0) {
-+                                      /* send status only if
-+                                       * fsl_ep_set_halt success */
-+                                      if (ep0_prime_status(udc, EP_DIR_IN))
-+                                              ep0stall(udc);
-+                              }
-+                              break;
-+                      }
-+              default:
-+                      handled = 0;
-+                      break;
-+              }
-+      } else {
-+              /* vendor requests */
-+              handled = 0;
-+      }
-+
-+      if (!handled) {
-+              if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff)
-+                  != 0) {
-+                      ep0stall(udc);
-+              } else if (setup->bRequestType & USB_DIR_IN) {
-+                      udc->ep0_state = DATA_STATE_XMIT;
-+                      pr_debug("udc: ep0_state now DATA_STATE_XMIT\n");
-+              } else {
-+                      udc->ep0_state = DATA_STATE_RECV;
-+                      pr_debug("udc: ep0_state now DATA_STATE_RECV\n");
-+              }
-+      }
-+
-+      if (ptc) {
-+              tmp =fsl_readl(&dr_regs->portsc1) | ptc << 16;
-+              fsl_writel(tmp, &dr_regs->portsc1);
-+              pr_debug("udc: switch to test mode.\n");
-+      }
-+}
-+
-+/* Process request for Data or Status phase of ep0
-+ * prime status phase if needed */
-+static void ep0_req_complete(struct fsl_udc *udc, struct fsl_ep *ep0,
-+              struct fsl_req *req)
-+{
-+      if (udc->usb_state == USB_STATE_ADDRESS) {
-+              /* Set the new address */
-+              u32 new_address = (u32) udc->device_address;
-+              fsl_writel(new_address << USB_DEVICE_ADDRESS_BIT_POS,
-+                              &dr_regs->deviceaddr);
-+      }
-+
-+      done(ep0, req, 0);
-+
-+      switch (udc->ep0_state) {
-+      case DATA_STATE_XMIT:
-+              /* receive status phase */
-+              if (ep0_prime_status(udc, EP_DIR_OUT))
-+                      ep0stall(udc);
-+              break;
-+      case DATA_STATE_RECV:
-+              /* send status phase */
-+              if (ep0_prime_status(udc, EP_DIR_IN))
-+                      ep0stall(udc);
-+              break;
-+      case WAIT_FOR_OUT_STATUS:
-+              udc->ep0_state = WAIT_FOR_SETUP;
-+              break;
-+      case WAIT_FOR_SETUP:
-+              ERR("Unexpect ep0 packets \n");
-+              break;
-+      default:
-+              ep0stall(udc);
-+              break;
-+      }
-+}
-+
-+/* Tripwire mechanism to ensure a setup packet payload is extracted without
-+ * being corrupted by another incoming setup packet */
-+static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr)
-+{
-+      u32 temp;
-+      struct ep_queue_head *qh;
-+      struct fsl_usb2_platform_data *pdata = udc->pdata;
-+
-+      qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT];
-+
-+      /* Clear bit in ENDPTSETUPSTAT */
-+      temp = fsl_readl(&dr_regs->endptsetupstat);
-+      fsl_writel(temp | (1 << ep_num), &dr_regs->endptsetupstat);
-+
-+      /* while a hazard exists when setup package arrives */
-+      do {
-+              /* Set Setup Tripwire */
-+              temp = fsl_readl(&dr_regs->usbcmd);
-+              fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd);
-+
-+              /* Copy the setup packet to local buffer */
-+              if (pdata->le_setup_buf) {
-+                      u32 *p = (u32 *)buffer_ptr;
-+                      u32 *s = (u32 *)qh->setup_buffer;
-+                      
-+                      /* Convert little endian setup buffer to CPU endian */
-+                      *p++ = le32_to_cpu(*s++);
-+                      *p = le32_to_cpu(*s);
-+              } else {
-+                      memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8);
-+              }
-+      } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW));
-+
-+      /* Clear Setup Tripwire */
-+      temp = fsl_readl(&dr_regs->usbcmd);
-+      fsl_writel(temp & ~USB_CMD_SUTW, &dr_regs->usbcmd);
-+}
-+
-+/* process-ep_req(): free the completed Tds for this req */
-+static int process_ep_req(struct fsl_udc *udc, int pipe,
-+              struct fsl_req *curr_req)
-+{
-+      struct ep_td_struct *curr_td;
-+      int     td_complete, actual, remaining_length, j, tmp;
-+      int     status = 0;
-+      int     errors = 0;
-+      struct  ep_queue_head *curr_qh = &udc->ep_qh[pipe];
-+      int direction = pipe % 2;
-+
-+      curr_td = curr_req->head;
-+      td_complete = 0;
-+      actual = curr_req->req.length;
-+
-+      for (j = 0; j < curr_req->dtd_count; j++) {
-+              remaining_length = (hc32_to_cpu(curr_td->size_ioc_sts)
-+                                      & DTD_PACKET_SIZE)
-+                              >> DTD_LENGTH_BIT_POS;
-+              actual -= remaining_length;
-+
-+              (errors = hc32_to_cpu(curr_td->size_ioc_sts) & DTD_ERROR_MASK);
-+              if (errors) {
-+                      if (errors & DTD_STATUS_HALTED) {
-+                              ERR("dTD error %08x QH=%d\n", errors, pipe);
-+                              /* Clear the errors and Halt condition */
-+                              tmp = hc32_to_cpu(curr_qh->size_ioc_int_sts);
-+                              tmp &= ~errors;
-+                              curr_qh->size_ioc_int_sts = cpu_to_hc32(tmp);
-+                              status = -EPIPE;
-+                              /* FIXME: continue with next queued TD? */
-+
-+                              break;
-+                      }
-+                      if (errors & DTD_STATUS_DATA_BUFF_ERR) {
-+                              VDBG("Transfer overflow");
-+                              status = -EPROTO;
-+                              break;
-+                      } else if (errors & DTD_STATUS_TRANSACTION_ERR) {
-+                              VDBG("ISO error");
-+                              status = -EILSEQ;
-+                              break;
-+                      } else
-+                              ERR("Unknown error has occured (0x%x)!\r\n",
-+                                      errors);
-+
-+              } else if (hc32_to_cpu(curr_td->size_ioc_sts) &
-+                                      DTD_STATUS_ACTIVE) {
-+                      VDBG("Request not complete");
-+                      status = REQ_UNCOMPLETE;
-+                      return status;
-+              } else if (remaining_length) {
-+                      if (direction) {
-+                              VDBG("Transmit dTD remaining length not zero");
-+                              status = -EPROTO;
-+                              break;
-+                      } else {
-+                              td_complete++;
-+                              break;
-+                      }
-+              } else {
-+                      td_complete++;
-+                      VDBG("dTD transmitted successful ");
-+              }
-+
-+              if (j != curr_req->dtd_count - 1)
-+                      curr_td = curr_td->next_td_virt;
-+      }
-+
-+      if (status)
-+              return status;
-+
-+      curr_req->req.actual = actual;
-+
-+      return 0;
-+}
-+
-+/* Process a DTD completion interrupt */
-+static void dtd_complete_irq(struct fsl_udc *udc)
-+{
-+      u32 bit_pos;
-+      int i, ep_num, direction, bit_mask, status;
-+      struct fsl_ep *curr_ep;
-+      struct fsl_req *curr_req, *temp_req;
-+
-+      /* Clear the bits in the register */
-+      bit_pos = fsl_readl(&dr_regs->endptcomplete);
-+      fsl_writel(bit_pos, &dr_regs->endptcomplete);
-+
-+      if (!bit_pos)
-+              return;
-+
-+      for (i = 0; i < udc->max_ep * 2; i++) {
-+              ep_num = i >> 1;
-+              direction = i % 2;
-+
-+              bit_mask = 1 << (ep_num + 16 * direction);
-+
-+              if (!(bit_pos & bit_mask))
-+                      continue;
-+
-+              curr_ep = get_ep_by_pipe(udc, i);
-+
-+              /* If the ep is configured */
-+              if (curr_ep->name == NULL) {
-+                      WARN("Invalid EP?");
-+                      continue;
-+              }
-+
-+              /* process the req queue until an uncomplete request */
-+              list_for_each_entry_safe(curr_req, temp_req, &curr_ep->queue,
-+                              queue) {
-+                      status = process_ep_req(udc, i, curr_req);
-+
-+                      VDBG("status of process_ep_req= %d, ep = %d",
-+                                      status, ep_num);
-+                      if (status == REQ_UNCOMPLETE)
-+                              break;
-+                      /* write back status to req */
-+                      curr_req->req.status = status;
-+
-+                      if (ep_num == 0) {
-+                              ep0_req_complete(udc, curr_ep, curr_req);
-+                              break;
-+                      } else {
-+                              done(curr_ep, curr_req, status);
-+                      }
-+              }
-+      }
-+}
-+
-+/* Process a port change interrupt */
-+static void port_change_irq(struct fsl_udc *udc)
-+{
-+      u32 speed;
-+
-+      VDBG("portsc=0x%x", fsl_readl(&dr_regs->portsc1) );
-+      if (udc->bus_reset)
-+              udc->bus_reset = 0;
-+
-+      /* Bus resetting is finished */
-+      if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) {
-+              /* Get the speed */
-+              speed = fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SPEED_MASK;
-+              switch (speed) {
-+              case PORTSCX_PORT_SPEED_HIGH:
-+                      udc->gadget.speed = USB_SPEED_HIGH;
-+                      break;
-+              case PORTSCX_PORT_SPEED_FULL:
-+                      udc->gadget.speed = USB_SPEED_FULL;
-+                      break;
-+              case PORTSCX_PORT_SPEED_LOW:
-+                      udc->gadget.speed = USB_SPEED_LOW;
-+                      break;
-+              default:
-+                      udc->gadget.speed = USB_SPEED_UNKNOWN;
-+                      break;
-+              }
-+      }
-+
-+      /* Update USB state */
-+      if (!udc->resume_state)
-+              udc->usb_state = USB_STATE_DEFAULT;
-+}
-+
-+/* Process suspend interrupt */
-+static void suspend_irq(struct fsl_udc *udc)
-+{
-+      udc->resume_state = udc->usb_state;
-+      udc->usb_state = USB_STATE_SUSPENDED;
-+
-+      /* report suspend to the driver, serial.c does not support this */
-+      if (udc->driver->suspend)
-+              udc->driver->suspend(&udc->gadget);
-+}
-+
-+static void bus_resume(struct fsl_udc *udc)
-+{
-+      udc->usb_state = udc->resume_state;
-+      udc->resume_state = 0;
-+
-+      /* report resume to the driver, serial.c does not support this */
-+      if (udc->driver->resume)
-+              udc->driver->resume(&udc->gadget);
-+}
-+
-+/* Clear up all ep queues */
-+static int reset_queues(struct fsl_udc *udc)
-+{
-+      u8 pipe;
-+
-+      for (pipe = 0; pipe < udc->max_pipes; pipe++)
-+              udc_reset_ep_queue(udc, pipe);
-+
-+      /* report disconnect; the driver is already quiesced */
-+      udc->driver->disconnect(&udc->gadget);
-+
-+      return 0;
-+}
-+
-+/* Process reset interrupt */
-+static void reset_irq(struct fsl_udc *udc)
-+{
-+      u32 temp;
-+      unsigned long timeout;
-+
-+      /* Clear the device address */
-+      temp = fsl_readl(&dr_regs->deviceaddr);
-+      fsl_writel(temp & ~USB_DEVICE_ADDRESS_MASK, &dr_regs->deviceaddr);
-+
-+      udc->device_address = 0;
-+
-+      /* Clear usb state */
-+      udc->resume_state = 0;
-+      udc->ep0_dir = 0;
-+      udc->ep0_state = WAIT_FOR_SETUP;
-+      udc->remote_wakeup = 0; /* default to 0 on reset */
-+      udc->gadget.b_hnp_enable = 0;
-+      udc->gadget.a_hnp_support = 0;
-+      udc->gadget.a_alt_hnp_support = 0;
-+
-+      /* Clear all the setup token semaphores */
-+      temp = fsl_readl(&dr_regs->endptsetupstat);
-+      fsl_writel(temp, &dr_regs->endptsetupstat);
-+
-+      /* Clear all the endpoint complete status bits */
-+      temp = fsl_readl(&dr_regs->endptcomplete);
-+      fsl_writel(temp, &dr_regs->endptcomplete);
-+
-+      timeout = jiffies + 100;
-+      while (fsl_readl(&dr_regs->endpointprime)) {
-+              /* Wait until all endptprime bits cleared */
-+              if (time_after(jiffies, timeout)) {
-+                      ERR("Timeout for reset\n");
-+                      break;
-+              }
-+              cpu_relax();
-+      }
-+
-+      /* Write 1s to the flush register */
-+      fsl_writel(0xffffffff, &dr_regs->endptflush);
-+
-+      if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) {
-+              VDBG("Bus reset");
-+              /* Bus is reseting */
-+              udc->bus_reset = 1;
-+              /* Reset all the queues, include XD, dTD, EP queue
-+               * head and TR Queue */
-+              reset_queues(udc);
-+              udc->usb_state = USB_STATE_DEFAULT;
-+      } else {
-+              VDBG("Controller reset");
-+              /* initialize usb hw reg except for regs for EP, not
-+               * touch usbintr reg */
-+              dr_controller_setup(udc);
-+
-+              /* Reset all internal used Queues */
-+              reset_queues(udc);
-+
-+              ep0_setup(udc);
-+
-+              /* Enable DR IRQ reg, Set Run bit, change udc state */
-+              dr_controller_run(udc);
-+              udc->usb_state = USB_STATE_ATTACHED;
-+      }
-+}
-+
-+/*
-+ * USB device controller interrupt handler
-+ */
-+static irqreturn_t fsl_udc_irq(int irq, void *_udc)
-+{
-+      struct fsl_udc *udc = _udc;
-+      u32 irq_src;
-+      irqreturn_t status = IRQ_NONE;
-+      unsigned long flags;
-+
-+      /* Disable ISR for OTG host mode */
-+      if (udc->stopped)
-+              return IRQ_NONE;
-+      spin_lock_irqsave(&udc->lock, flags);
-+      irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr);
-+      /* Clear notification bits */
-+      fsl_writel(irq_src, &dr_regs->usbsts);
-+
-+      VDBG("irq_src [0x%8x]  portsc=0x%x", irq_src,
-+           fsl_readl(&dr_regs->portsc1));
-+
-+      /* Need to resume? */
-+      if (udc->usb_state == USB_STATE_SUSPENDED)
-+              if ((fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SUSPEND) == 0)
-+                      bus_resume(udc);
-+
-+      /* USB Interrupt */
-+      if (irq_src & USB_STS_INT) {
-+              VDBG("Packet int");
-+              /* Setup package, we only support ep0 as control ep */
-+              if (fsl_readl(&dr_regs->endptsetupstat) & EP_SETUP_STATUS_EP0) {
-+                      tripwire_handler(udc, 0,
-+                                      (u8 *) (&udc->local_setup_buff));
-+                      setup_received_irq(udc, &udc->local_setup_buff);
-+                      status = IRQ_HANDLED;
-+              }
-+
-+              /* completion of dtd */
-+              if (fsl_readl(&dr_regs->endptcomplete)) {
-+                      dtd_complete_irq(udc);
-+                      status = IRQ_HANDLED;
-+              }
-+      }
-+
-+      /* SOF (for ISO transfer) */
-+      if (irq_src & USB_STS_SOF) {
-+              status = IRQ_HANDLED;
-+      }
-+
-+      /* Port Change */
-+      if (irq_src & USB_STS_PORT_CHANGE) {
-+              port_change_irq(udc);
-+              status = IRQ_HANDLED;
-+      }
-+
-+      /* Reset Received */
-+      if (irq_src & USB_STS_RESET) {
-+              reset_irq(udc);
-+              status = IRQ_HANDLED;
-+      }
-+
-+      /* Sleep Enable (Suspend) */
-+      if (irq_src & USB_STS_SUSPEND) {
-+              suspend_irq(udc);
-+              status = IRQ_HANDLED;
-+      }
-+
-+      if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) {
-+              VDBG("Error IRQ %x ", irq_src);
-+      }
-+
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+      return status;
-+}
-+
-+/*----------------------------------------------------------------*
-+ * Hook to gadget drivers
-+ * Called by initialization code of gadget drivers
-+*----------------------------------------------------------------*/
-+int usb_gadget_register_driver(struct usb_gadget_driver *driver)
-+{
-+      int retval = -ENODEV;
-+      unsigned long flags = 0;
-+      struct fsl_udc *udc = udc_controller;
-+
-+      pr_debug("udc: udc=0x%p\n", udc);
-+
-+      if (!udc)
-+              return -ENODEV;
-+
-+      if (!driver || (driver->speed != USB_SPEED_FULL
-+                      && driver->speed != USB_SPEED_HIGH)
-+                      || !driver->bind || !driver->disconnect
-+                      || !driver->setup)
-+              return -EINVAL;
-+
-+      if (udc->driver)
-+              return -EBUSY;
-+
-+      /* lock is needed but whether should use this lock or another */
-+      spin_lock_irqsave(&udc->lock, flags);
-+
-+      driver->driver.bus = 0;
-+      udc->softconnect = 1;
-+      /* hook up the driver */
-+      udc->driver = driver;
-+      udc->gadget.dev.driver = &driver->driver;
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+
-+      /* bind udc driver to gadget driver */
-+      retval = driver->bind(&udc->gadget);
-+      if (retval) {
-+              pr_debug("bind to %s --> %d\n", driver->driver.name, retval);
-+              udc->gadget.dev.driver = 0;
-+              udc->driver = 0;
-+              goto out;
-+      }
-+
-+      /* Enable DR IRQ reg and Set usbcmd reg  Run bit */
-+      if (udc->transceiver) {
-+              /* Suspend the controller until OTG enables it */
-+              udc_suspend(udc);
-+              pr_debug("udc: suspend udc for OTG auto detect \n");
-+
-+              /* Export udc suspend/resume call to OTG */
-+              udc->gadget.dev.parent->driver->suspend = fsl_udc_suspend;
-+              udc->gadget.dev.parent->driver->resume = fsl_udc_resume;
-+
-+              retval = otg_set_peripheral(udc->transceiver, &udc->gadget);
-+              if (retval < 0) {
-+                      printk(KERN_ERR "can't bind to transceiver\n");
-+                      driver->unbind(&udc->gadget);
-+                      udc->gadget.dev.driver = 0;
-+                      udc->driver = 0;
-+                      return retval;
-+              }
-+      } else {
-+              /* Enable DR IRQ reg and Set usbcmd reg  Run bit */
-+              dr_controller_run(udc);
-+              udc->usb_state = USB_STATE_ATTACHED;
-+              udc->ep0_state = WAIT_FOR_SETUP;
-+              pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n");
-+              udc->ep0_dir = 0;
-+      }
-+
-+      printk(KERN_INFO "%s: bind to driver %s \n", udc->gadget.name,
-+              driver->driver.name);
-+
-+out:
-+      return retval;
-+}
-+EXPORT_SYMBOL(usb_gadget_register_driver);
-+
-+/* Disconnect from gadget driver */
-+int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
-+{
-+      struct fsl_ep *loop_ep;
-+      unsigned long flags;
-+
-+      if (!udc_controller)
-+              return -ENODEV;
-+
-+      if (!driver || driver != udc_controller->driver || !driver->unbind)
-+              return -EINVAL;
-+
-+#ifdef CONFIG_USB_OTG
-+      if (udc_controller->transceiver)
-+              (void)otg_set_peripheral(udc_controller->transceiver, 0);
-+#endif
-+
-+      /* stop DR, disable intr */
-+      dr_controller_stop(udc_controller);
-+
-+      /* in fact, no needed */
-+      udc_controller->usb_state = USB_STATE_ATTACHED;
-+      udc_controller->ep0_state = WAIT_FOR_SETUP;
-+      udc_controller->ep0_dir = 0;
-+
-+      /* stand operation */
-+      spin_lock_irqsave(&udc_controller->lock, flags);
-+      udc_controller->gadget.speed = USB_SPEED_UNKNOWN;
-+      nuke(&udc_controller->eps[0], -ESHUTDOWN);
-+      list_for_each_entry(loop_ep, &udc_controller->gadget.ep_list,
-+                      ep.ep_list)
-+              nuke(loop_ep, -ESHUTDOWN);
-+      spin_unlock_irqrestore(&udc_controller->lock, flags);
-+
-+      /* unbind gadget and unhook driver. */
-+      driver->unbind(&udc_controller->gadget);
-+      udc_controller->gadget.dev.driver = 0;
-+      udc_controller->driver = 0;
-+
-+      printk(KERN_INFO "unregistered gadget '%s'\n", driver->driver.name);
-+      return 0;
-+}
-+EXPORT_SYMBOL(usb_gadget_unregister_driver);
-+
-+/*-------------------------------------------------------------------------
-+              PROC File System Support
-+-------------------------------------------------------------------------*/
-+#ifdef CONFIG_USB_GADGET_DEBUG_FILES
-+
-+#include <linux/seq_file.h>
-+
-+static const char proc_filename[] = "driver/fsl_usb2_udc";
-+
-+static int fsl_proc_read(char *page, char **start, off_t off, int count,
-+              int *eof, void *_dev)
-+{
-+      char *buf = page;
-+      char *next = buf;
-+      unsigned size = count;
-+      unsigned long flags;
-+      int t, i;
-+      u32 tmp_reg;
-+      struct fsl_ep *ep = NULL;
-+      struct fsl_req *req;
-+
-+      struct fsl_udc *udc = udc_controller;
-+      if (off != 0)
-+              return 0;
-+
-+      spin_lock_irqsave(&udc->lock, flags);
-+
-+      /* ------basic driver infomation ---- */
-+      t = scnprintf(next, size,
-+                      DRIVER_DESC "\n"
-+                      "%s version: %s\n"
-+                      "Gadget driver: %s\n\n",
-+                      driver_name, DRIVER_VERSION,
-+                      udc->driver ? udc->driver->driver.name : "(none)");
-+      size -= t;
-+      next += t;
-+
-+      /* ------ DR Registers ----- */
-+      tmp_reg = fsl_readl(&dr_regs->usbcmd);
-+      t = scnprintf(next, size,
-+                      "USBCMD reg: 0x%08x\n"
-+                      "\tSetupTW: %d\n"
-+                      "\tRun/Stop: %s\n\n",
-+                      tmp_reg,
-+                      (tmp_reg & USB_CMD_SUTW) ? 1 : 0,
-+                      (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop");
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->usbsts);
-+      t = scnprintf(next, size,
-+                      "USB Status Reg: 0x%08x\n"
-+                      "\tDr Suspend: %d   Reset Received: %d   "
-+                      "System Error: %s  USB Error Interrupt: %s\n\n",
-+                      tmp_reg,
-+                      (tmp_reg & USB_STS_SUSPEND) ? 1 : 0,
-+                      (tmp_reg & USB_STS_RESET) ? 1 : 0,
-+                      (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal",
-+                      (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err");
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->usbintr);
-+      t = scnprintf(next, size,
-+                      "USB Interrupt Enable Reg: 0x%08x\n"
-+                      "\tSleep Enable: %d   SOF Received Enable: %d  "
-+                      "Reset Enable: %d\n"
-+                      "\tSystem Error Enable: %d  "
-+                      "Port Change Dectected Enable: %d\n"
-+                      "\tUSB Error Intr Enable: %d  USB Intr Enable: %d\n\n",
-+                      tmp_reg,
-+                      (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_SYS_ERR_EN) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0,
-+                      (tmp_reg & USB_INTR_INT_EN) ? 1 : 0);
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->frindex);
-+      t = scnprintf(next, size,
-+                      "USB Frame Index Reg:  Frame Number is 0x%x\n\n",
-+                      (tmp_reg & USB_FRINDEX_MASKS));
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->deviceaddr);
-+      t = scnprintf(next, size,
-+                      "USB Device Address Reg:  Device Addr is 0x%x\n\n",
-+                      (tmp_reg & USB_DEVICE_ADDRESS_MASK));
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->endpointlistaddr);
-+      t = scnprintf(next, size,
-+                      "USB Endpoint List Address Reg:"
-+                      "Device Addr is 0x%x\n\n",
-+                      (tmp_reg & USB_EP_LIST_ADDRESS_MASK));
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->portsc1);
-+      t = scnprintf(next, size,
-+              "USB Port Status&Control Reg:\n"
-+              "\tPort Transceiver Type : %s" "Port Speed: %s \n"
-+              "\tPHY Low Power Suspend: %s" "Port Reset: %s  "
-+              "Port Suspend Mode: %s \n" "\tOver-current Change: %s  "
-+              "Port Enable/Disable Change: %s\n"
-+              "\tPort Enabled/Disabled: %s"
-+              "Current Connect Status: %s\n\n", ( {
-+                      char *s;
-+                      switch (tmp_reg & PORTSCX_PTS_FSLS) {
-+                      case PORTSCX_PTS_UTMI:
-+                              s = "UTMI"; break;
-+                      case PORTSCX_PTS_ULPI:
-+                              s = "ULPI "; break;
-+                      case PORTSCX_PTS_FSLS:
-+                              s = "FS/LS Serial"; break;
-+                      default:
-+                              s = "None"; break;
-+                      }
-+                      s; } ), ( {
-+                      char *s;
-+                      switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) {
-+                      case PORTSCX_PORT_SPEED_FULL:
-+                              s = "Full Speed"; break;
-+                      case PORTSCX_PORT_SPEED_LOW:
-+                              s = "Low Speed"; break;
-+                      case PORTSCX_PORT_SPEED_HIGH:
-+                              s = "High Speed"; break;
-+                      default:
-+                              s = "Undefined"; break;
-+                      }
-+                      s;
-+              } ),
-+              (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ?
-+              "Normal PHY mode" : "Low power mode",
-+              (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" :
-+              "Not in Reset",
-+              (tmp_reg & PORTSCX_PORT_SUSPEND) ? "In " : "Not in",
-+              (tmp_reg & PORTSCX_OVER_CURRENT_CHG) ? "Dected" :
-+              "No",
-+              (tmp_reg & PORTSCX_PORT_EN_DIS_CHANGE) ? "Disable" :
-+              "Not change",
-+              (tmp_reg & PORTSCX_PORT_ENABLE) ? "Enable" :
-+              "Not correct",
-+              (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ?
-+              "Attached" : "Not-Att");
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->usbmode);
-+      t = scnprintf(next, size,
-+                      "USB Mode Reg:" "Controller Mode is : %s\n\n", ( {
-+                              char *s;
-+                              switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) {
-+                              case USB_MODE_CTRL_MODE_IDLE:
-+                                      s = "Idle"; break;
-+                              case USB_MODE_CTRL_MODE_DEVICE:
-+                                      s = "Device Controller"; break;
-+                              case USB_MODE_CTRL_MODE_HOST:
-+                                      s = "Host Controller"; break;
-+                              default:
-+                                      s = "None"; break;
-+                              }
-+                              s;
-+                      } ));
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = fsl_readl(&dr_regs->endptsetupstat);
-+      t = scnprintf(next, size,
-+                      "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n",
-+                      (tmp_reg & EP_SETUP_STATUS_MASK));
-+      size -= t;
-+      next += t;
-+
-+      for (i = 0; i < udc->max_ep / 2; i++) {
-+              tmp_reg = fsl_readl(&dr_regs->endptctrl[i]);
-+              t = scnprintf(next, size, "EP Ctrl Reg [0x%x]: = [0x%x]\n",
-+                              i, tmp_reg);
-+              size -= t;
-+              next += t;
-+      }
-+      tmp_reg = fsl_readl(&dr_regs->endpointprime);
-+      t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+#ifdef HAVE_SYS_REGS
-+      tmp_reg = usb_sys_regs->snoop1;
-+      t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      tmp_reg = usb_sys_regs->control;
-+      t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n",
-+                      tmp_reg);
-+      size -= t;
-+      next += t;
-+#endif
-+
-+      /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */
-+      ep = &udc->eps[0];
-+      t = scnprintf(next, size, "For %s Maxpkt is 0x%x index is 0x%x\n",
-+                      ep->ep.name, ep_maxpacket(ep), ep_index(ep));
-+      size -= t;
-+      next += t;
-+
-+      if (list_empty(&ep->queue)) {
-+              t = scnprintf(next, size, "its req queue is empty\n\n");
-+              size -= t;
-+              next += t;
-+      } else {
-+              list_for_each_entry(req, &ep->queue, queue) {
-+                      t = scnprintf(next, size,
-+                              "req %p actual 0x%x length 0x%x  buf %p\n",
-+                              &req->req, req->req.actual,
-+                              req->req.length, req->req.buf);
-+                      size -= t;
-+                      next += t;
-+              }
-+      }
-+      /* other gadget->eplist ep */
-+      list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
-+              if (ep->desc) {
-+                      t = scnprintf(next, size,
-+                                      "\nFor %s Maxpkt is 0x%x "
-+                                      "index is 0x%x\n",
-+                                      ep->ep.name, ep_maxpacket(ep),
-+                                      ep_index(ep));
-+                      size -= t;
-+                      next += t;
-+
-+                      if (list_empty(&ep->queue)) {
-+                              t = scnprintf(next, size,
-+                                              "its req queue is empty\n\n");
-+                              size -= t;
-+                              next += t;
-+                      } else {
-+                              list_for_each_entry(req, &ep->queue, queue) {
-+                                      t = scnprintf(next, size,
-+                                              "req %p actual 0x%x length"
-+                                              "0x%x  buf %p\n",
-+                                              &req->req, req->req.actual,
-+                                              req->req.length, req->req.buf);
-+                                      size -= t;
-+                                      next += t;
-+                                      } /* end for each_entry of ep req */
-+                              }       /* end for else */
-+                      }       /* end for if(ep->queue) */
-+              }               /* end (ep->desc) */
-+
-+      spin_unlock_irqrestore(&udc->lock, flags);
-+
-+      *eof = 1;
-+      return count - size;
-+}
-+
-+#define create_proc_file()    create_proc_read_entry(proc_filename, \
-+                              0, NULL, fsl_proc_read, NULL)
-+
-+#define remove_proc_file()    remove_proc_entry(proc_filename, NULL)
-+
-+#else                         /* !CONFIG_USB_GADGET_DEBUG_FILES */
-+
-+#define create_proc_file()    do {} while (0)
-+#define remove_proc_file()    do {} while (0)
-+
-+#endif                                /* CONFIG_USB_GADGET_DEBUG_FILES */
-+
-+/*-------------------------------------------------------------------------*/
-+
-+/* Release udc structures */
-+static void fsl_udc_release(struct device *dev)
-+{
-+      complete(udc_controller->done);
-+      dma_free_coherent(dev, udc_controller->ep_qh_size,
-+                      udc_controller->ep_qh, udc_controller->ep_qh_dma);
-+      kfree(udc_controller);
-+}
-+
-+/******************************************************************
-+      Internal structure setup functions
-+*******************************************************************/
-+/*------------------------------------------------------------------
-+ * init resource for globle controller
-+ * Return the udc handle on success or NULL on failure
-+ ------------------------------------------------------------------*/
-+static struct fsl_udc *__init struct_udc_setup(struct platform_device *pdev)
-+{
-+      struct fsl_udc *udc;
-+      struct fsl_usb2_platform_data *pdata;
-+      size_t size;
-+
-+      udc = kzalloc(sizeof(struct fsl_udc), GFP_KERNEL);
-+      if (udc == NULL) {
-+              ERR("malloc udc failed\n");
-+              return NULL;
-+      }
-+
-+      pdata = pdev->dev.platform_data;
-+      udc->phy_mode = pdata->phy_mode;        /* DDD FIXME */
-+
-+      /* max_ep_nr is bidirectional ep number, max_ep doubles the number */
-+      udc->max_ep = pdata->max_ep_nr * 2;
-+
-+      udc->eps = kzalloc(sizeof(struct fsl_ep) * udc->max_ep, GFP_KERNEL);
-+      if (!udc->eps) {
-+              ERR("malloc fsl_ep failed\n");
-+              goto cleanup;
-+      }
-+
-+      /* initialized QHs, take care of alignment */
-+      size = udc->max_ep * sizeof(struct ep_queue_head);
-+      if (size < QH_ALIGNMENT)
-+              size = QH_ALIGNMENT;
-+      else if ((size % QH_ALIGNMENT) != 0) {
-+              size += QH_ALIGNMENT + 1;
-+              size &= ~(QH_ALIGNMENT - 1);
-+      }
-+      udc->ep_qh = dma_alloc_coherent(&pdev->dev, size,
-+                                      &udc->ep_qh_dma, GFP_KERNEL);
-+      if (!udc->ep_qh) {
-+              ERR("malloc QHs for udc failed\n");
-+              kfree(udc->eps);
-+              goto cleanup;
-+      }
-+
-+      udc->ep_qh_size = size;
-+
-+      /* Initialize ep0 status request structure */
-+      udc->status_req = container_of(fsl_alloc_request(NULL, GFP_KERNEL),
-+                      struct fsl_req, req);
-+      /* allocate a small amount of memory to get valid address */
-+      udc->status_req->req.buf = kmalloc(8, GFP_KERNEL);
-+      udc->status_req->req.dma = virt_to_phys(udc->status_req->req.buf);
-+
-+      udc->resume_state = USB_STATE_NOTATTACHED;
-+      udc->usb_state = USB_STATE_POWERED;
-+      udc->ep0_dir = 0;
-+      udc->remote_wakeup = 0; /* default to 0 on reset */
-+      spin_lock_init(&udc->lock);
-+
-+      return udc;
-+
-+cleanup:
-+      kfree(udc);
-+      return NULL;
-+}
-+
-+/*----------------------------------------------------------------
-+ * Setup the fsl_ep struct for eps
-+ * Link fsl_ep->ep to gadget->ep_list
-+ * ep0out is not used so do nothing here
-+ * ep0in should be taken care
-+ *--------------------------------------------------------------*/
-+static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index,
-+              char *name, int link)
-+{
-+      struct fsl_ep *ep = &udc->eps[index];
-+
-+      ep->udc = udc;
-+      strcpy(ep->name, name);
-+      ep->ep.name = ep->name;
-+
-+      ep->ep.ops = &fsl_ep_ops;
-+      ep->stopped = 0;
-+
-+      /* for ep0: maxP defined in desc
-+       * for other eps, maxP is set by epautoconfig() called by gadget layer
-+       */
-+      ep->ep.maxpacket = (unsigned short) ~0;
-+
-+      /* the queue lists any req for this ep */
-+      INIT_LIST_HEAD(&ep->queue);
-+
-+      /* gagdet.ep_list used for ep_autoconfig so no ep0 */
-+      if (link)
-+              list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
-+      ep->gadget = &udc->gadget;
-+      ep->qh = &udc->ep_qh[index];
-+
-+      return 0;
-+}
-+
-+static int board_init(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+
-+      pr_debug("udc: pdev=0x%p  pdata=0x%p\n", pdev, pdata);
-+
-+      /*
-+       * do platform specific init: check the clock, grab/config pins, etc.
-+       */
-+      if (pdata->platform_init && pdata->platform_init(pdev) != 0)
-+              return -EINVAL;
-+
-+      return 0;
-+}
-+
-+/* Driver probe functions */
-+
-+static int __init fsl_udc_probe(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      struct fsl_udc *udc;
-+      unsigned int i;
-+      struct otg_transceiver *transceiver = NULL;
-+      int status = -ENODEV;
-+      u32 id;
-+      int irq_number;
-+      u64 rsrc_start, rsrc_len;
-+      int ret = -ENODEV;
-+
-+      pr_debug("udc: pdev=0x%p  pdata=0x%p\n", pdev, pdata);
-+
-+      if (board_init(pdev) != 0)
-+              return -EINVAL;
-+
-+      /* Initialize the udc structure including QH member and other member */
-+      udc = (struct fsl_udc *) struct_udc_setup(pdev);
-+      udc_controller = udc;
-+
-+      if (!udc) {
-+              ERR("udc is NULL \n");
-+              return -ENOMEM;
-+      }
-+      dev_set_drvdata(&pdev->dev, udc);
-+      pr_debug("udc_controller=0x%p", udc_controller);
-+
-+      udc->pdata = pdata;
-+      udc->xcvr_type = pdata->xcvr_type;
-+
-+#ifdef CONFIG_USB_OTG
-+      udc->transceiver = otg_get_transceiver();
-+      pr_debug("udc: otg_get_transceiver returns 0x%p", udc->transceiver);
-+#endif
-+
-+      if (pdev->resource[1].flags != IORESOURCE_IRQ)
-+              return -ENODEV;
-+
-+      rsrc_start = pdev->resource[0].start;
-+      rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
-+
-+      pr_debug("     start=0x%ux   end=0x%ux\n",
-+               pdev->resource[0].start, pdev->resource[0].end);
-+      pr_debug("rsrc_start=0x%llx  rsrc_len=0x%llx\n", rsrc_start, rsrc_len);
-+
-+      dr_regs = (struct fsl_usb_device_regs *)pdata->regs;
-+
-+      pr_debug("udc: pdate=0x%p dr_regs=0x%p\n", pdata, dr_regs);
-+      pr_debug("udc: hci_version=0x%x\n", dr_regs->hciversion);
-+      pr_debug("udc: otgsc at 0x%p\n", &dr_regs->otgsc);
-+
-+      id = fsl_readl(&dr_regs->id);
-+      printk(KERN_INFO "FSL2 USBOTG h/w ID=0x%x  revision=0x%x\n",
-+             id & 0x3f, id >> 16);
-+
-+      /* USB OTG module IRQ */
-+      irq_number = platform_get_irq(pdev, 0);
-+      if (irq_number > 128) {
-+              status = request_irq(irq_number, fsl_udc_irq, IRQF_SHARED,
-+                                   driver_name, udc);
-+              if (status) {
-+                      ERR("can't get irq %d, err=%d\n", irq_number, status);
-+                      goto err2;
-+              }
-+      } else {
-+              status = -ENODEV;
-+              goto err2;
-+      }
-+
-+      if (!udc->transceiver) {
-+              /* initialize usb hw reg except for regs for EP,
-+               * leave usbintr reg untouched*/
-+              dr_controller_setup(udc);
-+      }
-+
-+      /* here comes the stand operations for probe
-+       * set the fsl_udc->gadget.xxx
-+       */
-+      udc->gadget.ops = &fsl_gadget_ops;
-+      udc->gadget.is_dualspeed = 1;
-+
-+      /* gadget.ep0 is a pointer */
-+      udc->gadget.ep0 = &udc->eps[0].ep;
-+      INIT_LIST_HEAD(&udc->gadget.ep_list);
-+      udc->gadget.speed = USB_SPEED_UNKNOWN;
-+      udc->gadget.name = driver_name;
-+
-+      /* Setup gadget.dev and register with kernel */
-+      strcpy(udc->gadget.dev.bus_id, "gadget");
-+      udc->gadget.dev.release = fsl_udc_release;
-+      udc->gadget.dev.parent = &pdev->dev;
-+
-+      ret = device_register(&udc->gadget.dev);
-+      if (ret < 0)
-+              goto err3;
-+
-+      if (udc->transceiver)
-+              udc->gadget.is_otg = 1;
-+
-+      /* setup QH and epctrl for ep0 */
-+      ep0_setup(udc);
-+
-+      /* setup udc->eps[] for ep0 */
-+      struct_ep_setup(udc_controller, 0, "ep0", 0);
-+      /* for ep0: the desc defined here;
-+       * for other eps, gadget layer called ep_enable with defined desc
-+       */
-+      udc->eps[0].desc = &fsl_ep0_desc;
-+      udc->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD;
-+
-+      /* setup the udc->eps[] for non-control endpoints and link
-+       * to gadget.ep_list */
-+      for (i = 1; i < (int)(udc->max_ep / 2); i++) {
-+              char name[14];
-+
-+              sprintf(name, "ep%dout", i);
-+              struct_ep_setup(udc, i * 2, name, 1);
-+              sprintf(name, "ep%din", i);
-+              struct_ep_setup(udc, i * 2 + 1, name, 1);
-+      }
-+
-+      /* use dma_pool for TD management */
-+      udc_controller->td_pool = dma_pool_create("udc_td", &pdev->dev,
-+                      sizeof(struct ep_td_struct),
-+                      DTD_ALIGNMENT, UDC_DMA_BOUNDARY);
-+      if (udc->td_pool == NULL) {
-+              ret = -ENOMEM;
-+              goto err4;
-+      }
-+
-+      create_proc_file();
-+      return 0;
-+
-+err4:
-+      device_unregister(&udc_controller->gadget.dev);
-+err3:
-+      free_irq(udc_controller->irq, udc_controller);
-+err2:
-+      kfree(udc);
-+      if (transceiver)
-+              put_device(transceiver->dev);
-+      release_mem_region(pdev->resource[0].start,
-+                         pdev->resource[0].end - pdev->resource[0].start + 1);
-+      return status;
-+
-+}
-+
-+/* Driver removal functions
-+ * Free resources
-+ * Finish pending transaction
-+ */
-+static int __exit fsl_udc_remove(struct platform_device *pdev)
-+{
-+      struct device *dev = &pdev->dev;
-+      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
-+      struct fsl_usb2_platform_data *pdata;
-+      int irq_number;
-+
-+      DECLARE_COMPLETION(done);
-+
-+      pdata = pdev->dev.platform_data;
-+
-+      if (!udc)
-+              return -ENODEV;
-+
-+      udc->done = &done;
-+
-+      /* DR has been stopped in usb_gadget_unregister_driver() */
-+
-+      if (udc->transceiver) {
-+              put_device(udc->transceiver->dev);
-+              udc->transceiver = NULL;
-+      }
-+
-+      /* remove proc */
-+      remove_proc_file();
-+
-+      /* free irq */
-+      irq_number = udc->irq;
-+      free_irq(pdev->resource[1].start, udc);
-+      udc->irq = 0;
-+
-+      /* Free allocated memory */
-+      kfree(udc->status_req->req.buf);
-+      kfree(udc->status_req);
-+      kfree(udc_controller->eps);
-+
-+      dma_pool_destroy(udc_controller->td_pool);
-+      /* deinitlaize all ep: strcut */
-+      /* deinitialize ep0: reg and QH */
-+
-+      device_unregister(&udc->gadget.dev);
-+      /* free udc --wait for the release() finished */
-+      wait_for_completion(&done);
-+
-+      /*
-+       * do platform specific un-initialization:
-+       * release iomux pins, etc.
-+       */
-+      if (pdata->platform_uninit)
-+              pdata->platform_uninit(pdev);
-+
-+      return 0;
-+}
-+
-+static int udc_suspend(struct fsl_udc *udc)
-+{
-+      udc->stopped = 1;
-+      return 0;
-+}
-+
-+/*
-+ * Modify Power management attributes
-+ * Used by OTG statemachine to disable gadget temporarily
-+ * Here we stop the DR controller and disable the irq
-+ * @param dev device controller pointer
-+ * @param state current state
-+ * @return The function returns 0 on success or -1 if failed
-+ */
-+static int fsl_udc_suspend(struct device *dev, pm_message_t state)
-+{
-+      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
-+      pr_debug("udc: Suspend. state=%d\n", state.event);
-+      return udc_suspend(udc);
-+}
-+
-+static int udc_resume(struct fsl_udc *udc)
-+{
-+      /*Enable DR irq reg and set controller Run */
-+      if (udc->stopped) {
-+              dr_controller_setup(udc);
-+              dr_controller_run(udc);
-+      }
-+      udc->usb_state = USB_STATE_ATTACHED;
-+      udc->ep0_state = WAIT_FOR_SETUP;
-+      udc->ep0_dir = 0;
-+      return 0;
-+}
-+
-+/*
-+ * Invoked on USB resume. May be called in_interrupt.
-+ * Here we start the DR controller and enable the irq
-+ * @param dev device controller pointer
-+ * @return The function returns 0 on success or -1 if failed
-+ */
-+static int fsl_udc_resume(struct device *dev)
-+{
-+      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
-+      pr_debug("udc: Resume dev=0x%p udc=0x%p\n", dev, udc);
-+
-+      return udc_resume(udc);
-+}
-+
-+/*-------------------------------------------------------------------------
-+      Register entry point for the peripheral controller driver
-+--------------------------------------------------------------------------*/
-+static struct platform_driver udc_driver = {
-+      .probe   = fsl_udc_probe,
-+      .remove  = __exit_p(fsl_udc_remove),
-+      .driver  = {
-+              .name = (char *)driver_name,
-+              .owner = THIS_MODULE,
-+      },
-+};
-+
-+static int __init udc_init(void)
-+{
-+      printk(KERN_INFO "%s version %s init \n", driver_desc, DRIVER_VERSION);
-+      return platform_driver_register(&udc_driver);
-+}
-+
-+module_init(udc_init);
-+
-+static void __exit udc_exit(void)
-+{
-+      platform_driver_unregister(&udc_driver);
-+      printk(KERN_INFO "%s unregistered \n", driver_desc);
-+}
-+
-+module_exit(udc_exit);
-+
-+MODULE_DESCRIPTION(DRIVER_DESC);
-+MODULE_AUTHOR(DRIVER_AUTHOR);
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/usb/host/ehci-arc.c
-@@ -0,0 +1,436 @@
-+/*
-+ * drivers/usb/host/ehci-arc.c
-+ *
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/* Note: this file is #included by ehci-hcd.c */
-+
-+#include <linux/platform_device.h>
-+#include <linux/usb/fsl_usb2.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/otg.h>
-+
-+#include "ehci-fsl.h"
-+
-+
-+/* FIXME: Power Managment is un-ported so temporarily disable it */
-+#undef CONFIG_PM
-+
-+/* PCI-based HCs are common, but plenty of non-PCI HCs are used too */
-+
-+/* configure so an HC device and id are always provided */
-+/* always called with process context; sleeping is OK */
-+
-+/**
-+ * usb_hcd_fsl_probe - initialize FSL-based HCDs
-+ * @drvier: Driver to be used for this HCD
-+ * @pdev: USB Host Controller being probed
-+ * Context: !in_interrupt()
-+ *
-+ * Allocates basic resources for this USB host controller.
-+ *
-+ */
-+static int usb_hcd_fsl_probe(const struct hc_driver *driver,
-+                           struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      struct usb_hcd *hcd;
-+      struct resource *res;
-+      int irq;
-+      int retval;
-+
-+      pr_debug("initializing FSL-SOC USB Controller\n");
-+
-+      /* Need platform data for setup */
-+      if (!pdata) {
-+              dev_err(&pdev->dev,
-+                      "No platform data for %s.\n", pdev->dev.bus_id);
-+              return -ENODEV;
-+      }
-+
-+      retval = fsl_platform_verify(pdev);
-+      if (retval)
-+              return retval;
-+
-+      /*
-+       * do platform specific init: check the clock, grab/config pins, etc.
-+       */
-+      if (pdata->platform_init && pdata->platform_init(pdev)) {
-+              retval = -ENODEV;
-+              goto err1;
-+      }
-+
-+      res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-+      if (!res) {
-+              dev_err(&pdev->dev,
-+                      "Found HC with no IRQ. Check %s setup!\n",
-+                      pdev->dev.bus_id);
-+              return -ENODEV;
-+      }
-+      irq = res->start;
-+
-+      fsl_platform_set_vbus_power(pdev, 1);
-+
-+      hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id);
-+      if (!hcd) {
-+              retval = -ENOMEM;
-+              goto err1;
-+      }
-+
-+      if (pdata->regs) {
-+              pr_debug("REGS: using pdata->regs (0x%p)\n", pdata->regs);
-+              hcd->regs = pdata->regs;
-+              hcd->rsrc_start = pdata->r_start;
-+              hcd->rsrc_len = pdata->r_len;
-+      } else {
-+              pr_debug("REGS: NO pdata->regs\n");
-+              res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+              if (!res) {
-+                      dev_err(&pdev->dev, "Found HC with no register addr. "
-+                              "Check %s setup!\n", pdev->dev.bus_id);
-+                      retval = -ENODEV;
-+                      goto err2;
-+              }
-+              hcd->rsrc_start = res->start;
-+              hcd->rsrc_len = res->end - res->start + 1;
-+
-+              /*
-+              printk("DDD %s(): rsrc_start=0x%llx  rsrc_len=0x%llx  "
-+                      "pdata=0x%p\n", __FUNCTION__,
-+                      hcd->rsrc_start, hcd->rsrc_len, pdata);
-+              */
-+
-+              if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
-+                                      driver->description)) {
-+                      dev_dbg(&pdev->dev, "request_mem_region failed\n");
-+                      retval = -EBUSY;
-+                      goto err2;
-+              }
-+              hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
-+
-+              if (hcd->regs == NULL) {
-+                      dev_dbg(&pdev->dev, "error mapping memory\n");
-+                      retval = -EFAULT;
-+                      goto err3;
-+              }
-+      }
-+      hcd->power_budget = pdata->power_budget;
-+
-+      /* DDD
-+       * the following must be done by this point, otherwise the OTG
-+       * host port doesn't make it thru initializtion.
-+       * ehci_halt(), called by ehci_fsl_setup() returns -ETIMEDOUT
-+       */
-+      fsl_platform_set_host_mode(hcd);
-+
-+      retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
-+      if (retval != 0)
-+              goto err4;
-+
-+#if defined(CONFIG_USB_OTG)
-+      if (pdata->does_otg) {
-+              struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+
-+              ehci->transceiver = otg_get_transceiver();
-+
-+              if (ehci->transceiver) {
-+                      retval = otg_set_host(ehci->transceiver,
-+                                            &ehci_to_hcd(ehci)->self);
-+                      if (retval) {
-+                              if (ehci->transceiver)
-+                                      put_device(ehci->transceiver->dev);
-+                              goto err3;
-+                      }
-+              } else {
-+                      printk(KERN_ERR "can't find transceiver\n");
-+                      retval = -ENODEV;
-+                      goto err3;
-+              }
-+      }
-+#endif
-+
-+      return retval;
-+
-+err4:
-+      /* DDD only if we did the iomap() iounmap(hcd->regs); */
-+err3:
-+      /* DDD only if we did a request_
-+       * release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
-+       */
-+err2:
-+      usb_put_hcd(hcd);
-+err1:
-+      dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval);
-+      if (pdata->platform_uninit)
-+              pdata->platform_uninit(pdev);
-+      return retval;
-+}
-+
-+/* may be called without controller electrically present */
-+/* may be called with controller, bus, and devices active */
-+
-+/**
-+ * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs
-+ * @dev: USB Host Controller being removed
-+ * Context: !in_interrupt()
-+ *
-+ * Reverses the effect of usb_hcd_fsl_probe().
-+ *
-+ */
-+static void usb_hcd_fsl_remove(struct usb_hcd *hcd,
-+                             struct platform_device *pdev)
-+{
-+      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+
-+      /* DDD shouldn't we turn off the power here? */
-+      fsl_platform_set_vbus_power(pdev, 0);
-+
-+      usb_remove_hcd(hcd);
-+
-+      if (ehci->transceiver) {
-+              (void)otg_set_host(ehci->transceiver, 0);
-+              put_device(ehci->transceiver->dev);
-+      }
-+      usb_put_hcd(hcd);
-+
-+      /*
-+       * do platform specific un-initialization:
-+       * release iomux pins, etc.
-+       */
-+      if (pdata->platform_uninit)
-+              pdata->platform_uninit(pdev);
-+}
-+
-+/* called after powerup, by probe or system-pm "wakeup" */
-+static int ehci_fsl_reinit(struct ehci_hcd *ehci)
-+{
-+      fsl_platform_usb_setup(ehci_to_hcd(ehci));
-+      ehci_port_power(ehci, 0);
-+
-+      return 0;
-+}
-+
-+/* called during probe() after chip reset completes */
-+static int ehci_fsl_setup(struct usb_hcd *hcd)
-+{
-+      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+      int retval;
-+      struct fsl_usb2_platform_data *pdata;
-+      pdata = hcd->self.controller-> platform_data;
-+
-+      ehci->big_endian_desc = pdata->big_endian_desc;
-+      ehci->big_endian_mmio = pdata->big_endian_mmio;
-+
-+      /* EHCI registers start at offset 0x100 */
-+      ehci->caps = hcd->regs + 0x100;
-+      ehci->regs = hcd->regs + 0x100 +
-+          HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
-+
-+      pr_debug("%s(): ehci->caps=0x%p  ehci->regs=0x%p\n", __FUNCTION__,
-+               ehci->caps, ehci->regs);
-+
-+      dbg_hcs_params(ehci, "reset");
-+      dbg_hcc_params(ehci, "reset");
-+
-+      /* cache this readonly data; minimize chip reads */
-+      ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
-+
-+      retval = ehci_halt(ehci);
-+      if (retval)
-+              return retval;
-+
-+      /* data structure init */
-+      retval = ehci_init(hcd);
-+      if (retval)
-+              return retval;
-+
-+      ehci->is_tdi_rh_tt = 1;
-+
-+      ehci->sbrn = 0x20;
-+
-+      ehci_reset(ehci);
-+
-+      retval = ehci_fsl_reinit(ehci);
-+      return retval;
-+}
-+
-+static const struct hc_driver ehci_fsl_hc_driver = {
-+      .description = hcd_name,
-+      .product_desc = "Freescale On-Chip EHCI Host Controller",
-+      .hcd_priv_size = sizeof(struct ehci_hcd),
-+
-+      /*
-+       * generic hardware linkage
-+       */
-+      .irq = ehci_irq,
-+      .flags = FSL_PLATFORM_HC_FLAGS,
-+
-+      /*
-+       * basic lifecycle operations
-+       */
-+      .reset = ehci_fsl_setup,
-+      .start = ehci_run,
-+      .stop = ehci_stop,
-+      .shutdown = ehci_shutdown,
-+
-+      /*
-+       * managing i/o requests and associated device resources
-+       */
-+      .urb_enqueue = ehci_urb_enqueue,
-+      .urb_dequeue = ehci_urb_dequeue,
-+      .endpoint_disable = ehci_endpoint_disable,
-+
-+      /*
-+       * scheduling support
-+       */
-+      .get_frame_number = ehci_get_frame,
-+
-+      /*
-+       * root hub support
-+       */
-+      .hub_status_data = ehci_hub_status_data,
-+      .hub_control = ehci_hub_control,
-+      .bus_suspend = ehci_bus_suspend,
-+      .bus_resume = ehci_bus_resume,
-+};
-+
-+#ifdef CONFIG_USB_OTG
-+/*
-+ * Holding pen for all the EHCI registers except port_status,
-+ * which is a zero element array and hence takes no space.
-+ * The port_status register is saved in usb_ehci_portsc.
-+ */
-+volatile static struct ehci_regs usb_ehci_regs;
-+static u32 usb_ehci_portsc;
-+
-+/* suspend/resume, section 4.3 */
-+
-+/* These routines rely on the bus (pci, platform, etc)
-+ * to handle powerdown and wakeup, and currently also on
-+ * transceivers that don't need any software attention to set up
-+ * the right sort of wakeup.
-+ *
-+ * They're also used for turning on/off the port when doing OTG.
-+ */
-+static int ehci_fsl_drv_suspend(struct platform_device *pdev,
-+                              pm_message_t message)
-+{
-+      struct usb_hcd *hcd = platform_get_drvdata(pdev);
-+      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+      u32 tmp;
-+
-+      pr_debug("%s pdev=0x%p  ehci=0x%p  hcd=0x%p\n",
-+               __FUNCTION__, pdev, ehci, hcd);
-+      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p  hcd->state=%d\n",
-+               __FUNCTION__, ehci->regs, hcd->regs, hcd->state);
-+
-+      hcd->state = HC_STATE_SUSPENDED;
-+      pdev->dev.power.power_state = PMSG_SUSPEND;
-+
-+      if (hcd->driver->suspend)
-+              return hcd->driver->suspend(hcd, message);
-+
-+      /* ignore non-host interrupts */
-+      clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-+
-+      tmp = ehci_readl(ehci, &ehci->regs->command);
-+      tmp &= ~CMD_RUN;
-+      ehci_writel(ehci, tmp, &ehci->regs->command);
-+
-+      memcpy((void *)&usb_ehci_regs, ehci->regs, sizeof(struct ehci_regs));
-+      usb_ehci_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]);
-+
-+      /* clear the W1C bits */
-+      usb_ehci_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS);
-+
-+      fsl_platform_set_vbus_power(pdev, 0);
-+      /* clear PP to cut power to the port */
-+      tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
-+      tmp &= ~PORT_POWER;
-+      ehci_writel(ehci, tmp, &ehci->regs->port_status[0]);
-+
-+      return 0;
-+}
-+
-+static int ehci_fsl_drv_resume(struct platform_device *pdev)
-+{
-+      struct usb_hcd *hcd = platform_get_drvdata(pdev);
-+      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
-+      u32 tmp;
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+
-+      pr_debug("%s pdev=0x%p  pdata=0x%p  ehci=0x%p  hcd=0x%p\n",
-+               __FUNCTION__, pdev, pdata, ehci, hcd);
-+
-+      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p\n",
-+               __FUNCTION__, ehci->regs, hcd->regs);
-+
-+      memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs));
-+
-+      tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
-+      ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
-+      pr_debug("tmp %08x  set usbmode %08x\n", tmp,
-+               ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE));
-+
-+      ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
-+      pr_debug("set portsc %08x  %08x\n", usb_ehci_portsc,
-+               ehci_readl(ehci, &ehci->regs->port_status[0]));
-+
-+      set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
-+      hcd->state = HC_STATE_RUNNING;
-+      pdev->dev.power.power_state = PMSG_ON;
-+
-+      tmp = ehci_readl(ehci, &ehci->regs->command);
-+      tmp |= CMD_RUN;
-+      ehci_writel(ehci, tmp, &ehci->regs->command);
-+
-+      fsl_platform_set_vbus_power(pdev, 1);
-+
-+      usb_hcd_resume_root_hub(hcd);
-+
-+      return 0;
-+}
-+#endif                                /* CONFIG_USB_OTG */
-+
-+static int ehci_fsl_drv_probe(struct platform_device *pdev)
-+{
-+      if (usb_disabled())
-+              return -ENODEV;
-+
-+      return usb_hcd_fsl_probe(&ehci_fsl_hc_driver, pdev);
-+}
-+
-+static int ehci_fsl_drv_remove(struct platform_device *pdev)
-+{
-+      struct usb_hcd *hcd = platform_get_drvdata(pdev);
-+
-+      usb_hcd_fsl_remove(hcd, pdev);
-+
-+      return 0;
-+}
-+
-+MODULE_ALIAS("fsl-ehci");
-+
-+static struct platform_driver ehci_fsl_driver = {
-+      .probe = ehci_fsl_drv_probe,
-+      .remove = ehci_fsl_drv_remove,
-+      .shutdown = usb_hcd_platform_shutdown,
-+#ifdef CONFIG_USB_OTG
-+      .suspend = ehci_fsl_drv_suspend,
-+      .resume  = ehci_fsl_drv_resume,
-+#endif
-+      .driver = {
-+                 .name = "fsl-ehci",
-+                 },
-+};
---- a/drivers/usb/host/ehci-fsl.h
-+++ b/drivers/usb/host/ehci-fsl.h
-@@ -18,6 +18,8 @@
- #ifndef _EHCI_FSL_H
- #define _EHCI_FSL_H
-+#include <linux/usb/fsl_xcvr.h>
-+
- /* offsets for the non-ehci registers in the FSL SOC USB controller */
- #define FSL_SOC_USB_ULPIVP    0x170
- #define FSL_SOC_USB_PORTSC1   0x184
-@@ -34,5 +36,29 @@
- #define FSL_SOC_USB_PRICTRL   0x40c   /* NOTE: big-endian */
- #define FSL_SOC_USB_SICTRL    0x410   /* NOTE: big-endian */
- #define FSL_SOC_USB_CTRL      0x500   /* NOTE: big-endian */
--#define SNOOP_SIZE_2GB                0x1e
-+
-+#ifdef CONFIG_MPC834x
-+#include <sysdev/fsl_usb.h>
-+#endif
-+
-+#ifdef CONFIG_ARCH_MX3
-+#include <asm/arch/mx31_usb.h>
-+#endif
-+
-+#ifdef CONFIG_ARCH_MX27
-+#include <asm/arch/mx27_usb.h>
-+#endif
-+
-+#ifdef CONFIG_M54455
-+#include <asm-m68k/mcf5445x_usb.h>
-+#endif
-+
-+
-+static void fsl_platform_set_vbus_power(struct platform_device *pdev, int on)
-+{
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+
-+      if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power)
-+              pdata->xcvr_ops->set_vbus_power(pdata, on);
-+}
- #endif                                /* _EHCI_FSL_H */
---- a/drivers/usb/host/ehci.h
-+++ b/drivers/usb/host/ehci.h
-@@ -122,6 +122,12 @@ struct ehci_hcd {                 /* one per controlle
-       u8                      sbrn;           /* packed release number */
-+      /*
-+       * OTG controllers and transceivers need software interaction;
-+       * other external transceivers should be software-transparent
-+       */
-+      struct otg_transceiver  *transceiver;
-+
-       /* irq statistics */
- #ifdef EHCI_STATS
-       struct ehci_stats       stats;
-@@ -753,6 +759,22 @@ ehci_port_speed(struct ehci_hcd *ehci, u
- #define writel_be(val, addr)  __raw_writel(val, (__force unsigned *)addr)
- #endif
-+#if defined(CONFIG_COLDFIRE)
-+/*
-+ * Sorry, include/asm-m68k/io.h is messed up.  It will give you a
-+ * BE readl or a LE readl depending on whether or not CONFIG_PCI is set.
-+ * how broken is that?  Do the right thing here.
-+ */
-+#undef readl
-+#undef writel
-+
-+#define readl(addr)           in_le32((__force unsigned *)(addr))
-+#define writel(val,addr)      out_le32((__force unsigned *)(addr),(val))
-+
-+#define readl_be(addr)                in_be32((__force unsigned *)(addr))
-+#define writel_be(val, addr)  out_be32((__force unsigned *)(addr), (val))
-+#endif
-+
- static inline unsigned int ehci_readl(const struct ehci_hcd *ehci,
-               __u32 __iomem * regs)
- {
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -1043,6 +1043,11 @@ MODULE_LICENSE ("GPL");
- #define       PLATFORM_DRIVER         ixp4xx_ehci_driver
- #endif
-+#ifdef CONFIG_M54455
-+#include "ehci-arc.c"
-+#define       PLATFORM_DRIVER         ehci_fsl_driver
-+#endif
-+
- #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
-     !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
- #error "missing bus glue for ehci-hcd"
---- a/drivers/usb/host/ehci-mem.c
-+++ b/drivers/usb/host/ehci-mem.c
-@@ -40,7 +40,8 @@ static inline void ehci_qtd_init(struct 
- {
-       memset (qtd, 0, sizeof *qtd);
-       qtd->qtd_dma = dma;
--      qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
-+      // DDD official code` has: qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
-+      qtd->hw_token = cpu_to_hc32 (ehci, QTD_STS_HALT);
-       qtd->hw_next = EHCI_LIST_END(ehci);
-       qtd->hw_alt_next = EHCI_LIST_END(ehci);
-       INIT_LIST_HEAD (&qtd->qtd_list);
-@@ -211,9 +212,11 @@ static int ehci_mem_init (struct ehci_hc
-       }
-       /* Hardware periodic table */
--      ehci->periodic = (__le32 *)
-+      // DDD official code has: ehci->periodic = (__le32 *)
-+      ehci->periodic = (__hc32 *)
-               dma_alloc_coherent (ehci_to_hcd(ehci)->self.controller,
--                      ehci->periodic_size * sizeof(__le32),
-+                      // DDD official: ehci->periodic_size * sizeof(__le32),
-+                      ehci->periodic_size * sizeof(__hc32),
-                       &ehci->periodic_dma, 0);
-       if (ehci->periodic == NULL) {
-               goto fail;
---- a/drivers/usb/host/Kconfig
-+++ b/drivers/usb/host/Kconfig
-@@ -32,6 +32,7 @@ config USB_EHCI_HCD
- config USB_EHCI_ROOT_HUB_TT
-       bool "Root Hub Transaction Translators (EXPERIMENTAL)"
-       depends on USB_EHCI_HCD && EXPERIMENTAL
-+      default y if M54455
-       ---help---
-         Some EHCI chips have vendor-specific extensions to integrate
-         transaction translators, so that no OHCI or UHCI companion
-@@ -60,12 +61,12 @@ config USB_EHCI_TT_NEWSCHED
- config USB_EHCI_BIG_ENDIAN_MMIO
-       bool
--      depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX)
-+      depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX || M54455)
-       default y
- config USB_EHCI_BIG_ENDIAN_DESC
-       bool
--      depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX)
-+      depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || M54455)
-       default y
- config USB_EHCI_FSL
-@@ -260,3 +261,19 @@ config USB_R8A66597_HCD
-         To compile this driver as a module, choose M here: the
-         module will be called r8a66597-hcd.
-+choice
-+      prompt "Select transceiver"
-+      depends on M54455
-+      default USB_M5445X_ULPI 
-+
-+config USB_M5445X_ULPI
-+      bool "External ULPI"
-+      ---help---
-+        Enable support for the external HS ULPI transceiver.
-+
-+config USB_M5445X_FSLS
-+      bool "On-chip (FL/LS only)"
-+      ---help---
-+        Enable support for the on-chip FL/LS transceiver.
-+endchoice
-+
---- a/drivers/usb/host/Makefile
-+++ b/drivers/usb/host/Makefile
-@@ -6,7 +6,7 @@ ifeq ($(CONFIG_USB_DEBUG),y)
-       EXTRA_CFLAGS            += -DDEBUG
- endif
--obj-$(CONFIG_PCI)             += pci-quirks.o
-+#obj-$(CONFIG_PCI)            += pci-quirks.o
- obj-$(CONFIG_USB_EHCI_HCD)    += ehci-hcd.o
- obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o
---- a/drivers/usb/Kconfig
-+++ b/drivers/usb/Kconfig
-@@ -55,6 +55,7 @@ config USB_ARCH_HAS_EHCI
-       default y if PPC_83xx
-       default y if SOC_AU1200
-       default y if ARCH_IXP4XX
-+      default y if M54455
-       default PCI
- # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
---- a/drivers/usb/Makefile
-+++ b/drivers/usb/Makefile
-@@ -32,3 +32,5 @@ obj-$(CONFIG_USB)            += misc/
- obj-$(CONFIG_USB_ATM)         += atm/
- obj-$(CONFIG_USB_SPEEDTOUCH)  += atm/
-+
-+obj-$(CONFIG_USB_OTG)         += otg/
---- /dev/null
-+++ b/drivers/usb/otg/fsl_otg.c
-@@ -0,0 +1,1306 @@
-+/*
-+ * Copyright (c) Freescale Semiconductor, Inc. 2006-2007
-+ *
-+ * USB OTG ULPI driver
-+ *
-+ * Based on code for MPC from:
-+ *  Leo Li<LeoLi@freescale.com>
-+ *  Jerry Huang<Chang-Ming.Huang@freescale.com>
-+ *
-+ * and M5329 code from
-+ *  Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *  Andrey Butok
-+ *
-+ *  Initialization based on code from Shlomi Gridish.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the  GNU General Public License along
-+ * with this program; if not, write  to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ ***************************************************************************
-+ * Changes:
-+ *   v0.3     08 August 2007          Duck
-+ *   v0.2     20 October 2006         Andrey Butok
-+ *            Issues fixing and some changes.
-+ *   v0.1     September 2006          Yaroslav Vinogradov
-+ *            Initial version.
-+ *
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/ioport.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/smp_lock.h>
-+#include <linux/proc_fs.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/reboot.h>
-+#include <linux/timer.h>
-+#include <linux/list.h>
-+#include <linux/interrupt.h>
-+#include <linux/usb.h>
-+#include <linux/device.h>
-+#include <linux/platform_device.h>
-+#include <linux/usb/ch9.h>
-+#include <linux/usb_gadget.h>
-+#include <linux/workqueue.h>
-+#include <linux/time.h>
-+#include <linux/fsl_devices.h>
-+#include <linux/usb/fsl_usb2.h>
-+
-+#include <linux/io.h>
-+
-+#if defined CONFIG_M54455
-+#include <asm/mcfsim.h>
-+#endif
-+
-+#define USE_WORK_QUEUES
-+#include "fsl_otg.h"
-+
-+#define CONFIG_USB_OTG_DEBUG_FILES
-+#define DRIVER_VERSION "Revision: 1.56"
-+#define DRIVER_AUTHOR "Freescale Semiconductor Inc."
-+#define DRIVER_DESC "Freescale USB OTG ULPI Driver"
-+#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
-+
-+MODULE_DESCRIPTION("Freescale USB OTG Controller Driver");
-+
-+static const char driver_name[] = "fsl-usb2-otg";
-+
-+static spinlock_t usb_dr_regs_lock;
-+
-+/*#define HA_DATA_PULSE 1*/
-+
-+volatile static struct fsl_usb_device_regs *usb_dr_regs;
-+static struct fsl_otg *fsl_otg_dev;
-+static int srp_wait_done;
-+
-+/* Driver specific timers */
-+struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr,
-+      *b_srp_wait_tmr, *a_wait_enum_tmr;
-+
-+static struct list_head active_timers;
-+
-+static struct fsl_otg_config fsl_otg_initdata = {
-+      .otg_port = 1,
-+};
-+
-+#if 0
-+static void dump_state(const char *string, struct otg_fsm *fsm)
-+{
-+      printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string,
-+             state_string(fsl_otg_dev->otg.state));
-+      printk(KERN_DEBUG "\tFSM protocol=%s\n", fsm->protocol ?
-+             (fsm->protocol == PROTO_HOST ? "Host" : "Gadget")
-+             : "None");
-+
-+      /* regs */
-+      printk(KERN_DEBUG "\t  OTGSC 0x%08x\n",
-+             fsl_readl(&usb_dr_regs->otgsc));
-+      printk(KERN_DEBUG "\tPORTSC1 0x%08x\n",
-+             fsl_readl(&usb_dr_regs->portsc1));
-+      printk(KERN_DEBUG "\tUSBMODE 0x%08x\n",
-+             fsl_readl(&usb_dr_regs->usbmode));
-+      printk(KERN_DEBUG "\t USBCMD 0x%08x\n",
-+             fsl_readl(&usb_dr_regs->usbcmd));
-+      printk(KERN_DEBUG "\t USBSTS 0x%08x\n",
-+             fsl_readl(&usb_dr_regs->usbsts));
-+
-+      /* ------ State Machine Variables ----- */
-+      printk(KERN_DEBUG "\ta_bus_req: %d\n", fsm->a_bus_req);
-+      printk(KERN_DEBUG "\tb_bus_req: %d\n", fsm->b_bus_req);
-+      printk(KERN_DEBUG "\ta_bus_resume: %d\n", fsm->a_bus_resume);
-+      printk(KERN_DEBUG "\ta_bus_suspend: %d\n", fsm->a_bus_suspend);
-+      printk(KERN_DEBUG "\ta_conn: %d\n", fsm->a_conn);
-+      printk(KERN_DEBUG "\ta_sess_vld: %d\n", fsm->a_sess_vld);
-+      printk(KERN_DEBUG "\ta_srp_det: %d\n", fsm->a_srp_det);
-+      printk(KERN_DEBUG "\ta_vbus_vld: %d\n", fsm->a_vbus_vld);
-+      printk(KERN_DEBUG "\tb_bus_resume: %d\n", fsm->b_bus_resume);
-+      printk(KERN_DEBUG "\tb_bus_suspend: %d\n", fsm->b_bus_suspend);
-+      printk(KERN_DEBUG "\tb_conn: %d\n", fsm->b_conn);
-+      printk(KERN_DEBUG "\tb_se0_srp: %d\n", fsm->b_se0_srp);
-+      printk(KERN_DEBUG "\tb_sess_end: %d\n", fsm->b_sess_end);
-+      printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld);
-+      printk(KERN_DEBUG "\tid: %d\n", fsm->id);
-+}
-+#endif
-+
-+
-+/* Routines to access transceiver ULPI registers */
-+u8 view_ulpi(u8 addr)
-+{
-+      u32 temp;
-+
-+      temp = 0x40000000 | (addr << 16);
-+      fsl_writel(temp, &usb_dr_regs->ulpiview);
-+
-+      udelay(1000);
-+
-+      /* DDD timeout this loop: */
-+      do {
-+              temp = fsl_readl(&usb_dr_regs->ulpiview);
-+      } while (temp & 0x40000000);
-+
-+      return (temp & 0x0000ff00) >> 8;
-+}
-+
-+int write_ulpi(u8 addr, u8 data)
-+{
-+      u32 temp;
-+
-+      temp = 0x60000000 | (addr << 16) | data;
-+      fsl_writel(temp, &usb_dr_regs->ulpiview);
-+      return 0;
-+}
-+
-+/* prototype declaration */
-+void fsl_otg_add_timer(void *timer);
-+void fsl_otg_del_timer(void *timer);
-+
-+/* -------------------------------------------------------------*/
-+/* Operations that will be called from OTG Finite State Machine */
-+
-+/* Charge vbus for vbus pulsing in SRP */
-+void fsl_otg_chrg_vbus(int on)
-+{
-+      u32 tmp;
-+
-+      VDBG(" %d\n", on);
-+
-+      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
-+
-+      if (on) {
-+              tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE;
-+              tmp |= OTGSC_CTRL_VBUS_CHARGE;
-+      } else {
-+              tmp &= ~OTGSC_CTRL_VBUS_CHARGE;
-+      }
-+      fsl_writel(tmp, &usb_dr_regs->otgsc);
-+}
-+
-+/* Discharge vbus through a resistor to ground */
-+void fsl_otg_dischrg_vbus(int on)
-+{
-+      u32 tmp;
-+
-+      VDBG(" %d\n", on);
-+
-+      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
-+
-+      if (on)
-+              tmp |= OTGSC_CTRL_VBUS_DISCHARGE;
-+      else
-+              tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE;
-+
-+      fsl_writel(tmp, &usb_dr_regs->otgsc);
-+}
-+
-+/* A-device driver vbus, controlled through PP bit in PORTSC */
-+void fsl_otg_drv_vbus(int on)
-+{
-+      u32 tmp;
-+
-+      VDBG(" %d\n", on);
-+
-+      tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS;
-+
-+      if (on)
-+              tmp |= PORTSCX_PORT_POWER;
-+      else
-+              tmp &= ~PORTSCX_PORT_POWER;
-+
-+      fsl_writel(tmp, &usb_dr_regs->portsc1);
-+}
-+
-+/* Pull-up D+, signalling connect by periperal. Also used in
-+ * data-line pulsing in SRP */
-+void fsl_otg_loc_conn(int on)
-+{
-+      u32 tmp;
-+
-+      VDBG(" %d\n", on);
-+
-+      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
-+
-+      if (on)
-+              tmp |= OTGSC_CTRL_DATA_PULSING;
-+      else
-+              tmp &= ~OTGSC_CTRL_DATA_PULSING;
-+
-+      fsl_writel(tmp, &usb_dr_regs->otgsc);
-+}
-+
-+/* Generate SOF by host.  This is controlled through suspend/resume the
-+ * port.  In host mode, controller will automatically send SOF.
-+ * Suspend will block the data on the port.
-+ */
-+void fsl_otg_loc_sof(int on)
-+{
-+      u32 tmp;
-+
-+      VDBG(" %d\n", on);
-+
-+      tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS;
-+
-+      if (on)
-+              tmp |= PORTSCX_PORT_FORCE_RESUME;
-+      else
-+              tmp |= PORTSCX_PORT_SUSPEND;
-+
-+      fsl_writel(tmp, &usb_dr_regs->portsc1);
-+}
-+
-+/* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */
-+void fsl_otg_start_pulse(void)
-+{
-+      u32 __attribute__ ((unused)) tmp;
-+
-+      VDBG("\n");
-+      srp_wait_done = 0;
-+
-+#ifdef HA_DATA_PULSE
-+      tmp = fsl_readl(&usb_dr_regs->otgsc) &= ~OTGSC_INTSTS_MASK;
-+      tmp |= OTGSC_HA_DATA_PULSE;
-+      fsl_writel(tmp, &usb_dr_regs->otgsc);
-+#else
-+      fsl_otg_loc_conn(1);
-+#endif
-+
-+      fsl_otg_add_timer(b_data_pulse_tmr);
-+}
-+
-+void fsl_otg_pulse_vbus(void);
-+
-+void b_data_pulse_end(unsigned long foo)
-+{
-+#ifdef HA_DATA_PULSE
-+#else
-+      fsl_otg_loc_conn(0);
-+#endif
-+
-+      /* Do VBUS pulse after data pulse */
-+      fsl_otg_pulse_vbus();
-+}
-+
-+void fsl_otg_pulse_vbus(void)
-+{
-+      srp_wait_done = 0;
-+      fsl_otg_chrg_vbus(1);
-+      /* start the timer to end vbus charge */
-+      fsl_otg_add_timer(b_vbus_pulse_tmr);
-+}
-+
-+void b_vbus_pulse_end(unsigned long foo)
-+{
-+      fsl_otg_chrg_vbus(0);
-+
-+      /* As USB3300 using the same a_sess_vld and b_sess_vld voltage
-+       * we need to discharge the bus for a while to distinguish
-+       * residual voltage of vbus pulsing and A device pull up */
-+      fsl_otg_dischrg_vbus(1);
-+      fsl_otg_add_timer(b_srp_wait_tmr);
-+}
-+
-+void b_srp_end(unsigned long foo)
-+{
-+      fsl_otg_dischrg_vbus(0);
-+      srp_wait_done = 1;
-+
-+      if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) &&
-+          fsl_otg_dev->fsm.b_sess_vld)
-+              fsl_otg_dev->fsm.b_srp_done = 1;
-+}
-+
-+/* Workaround for a_host suspending too fast.  When a_bus_req=0,
-+ * a_host will start by SRP.  It needs to set b_hnp_enable before
-+ * actually suspending to start HNP
-+ */
-+void a_wait_enum(unsigned long foo)
-+{
-+      VDBG("a_wait_enum timeout\n");
-+      if (!fsl_otg_dev->otg.host->b_hnp_enable)
-+              fsl_otg_add_timer(a_wait_enum_tmr);
-+      else
-+              otg_statemachine(&fsl_otg_dev->fsm);
-+}
-+
-+/* ------------------------------------------------------*/
-+
-+/* The timeout callback function to set time out bit */
-+void set_tmout(unsigned long indicator)
-+{
-+      *(int *)indicator = 1;
-+}
-+
-+/* Initialize timers */
-+void fsl_otg_init_timers(struct otg_fsm *fsm)
-+{
-+      /* FSM used timers */
-+      fsm->a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE,
-+                              (unsigned long)&fsm->a_wait_vrise_tmout);
-+      fsm->a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON,
-+                              (unsigned long)&fsm->a_wait_bcon_tmout);
-+      fsm->a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS,
-+                              (unsigned long)&fsm->a_aidl_bdis_tmout);
-+      fsm->b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST,
-+                              (unsigned long)&fsm->b_ase0_brst_tmout);
-+      fsm->b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP,
-+                              (unsigned long)&fsm->b_se0_srp);
-+      fsm->b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL,
-+                              (unsigned long)&fsm->b_srp_done);
-+      fsm->a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10,
-+                              (unsigned long)&fsm);
-+
-+      /* device driver used timers */
-+      b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0);
-+      b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end,
-+                              TB_DATA_PLS, 0);
-+      b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end,
-+                              TB_VBUS_PLS, 0);
-+
-+}
-+
-+/* Add timer to timer list */
-+void fsl_otg_add_timer(void *gtimer)
-+{
-+      struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer;
-+      struct fsl_otg_timer *tmp_timer;
-+
-+      /* Check if the timer is already in the active list,
-+       * if so update timer count
-+       */
-+      list_for_each_entry(tmp_timer, &active_timers, list)
-+          if (tmp_timer == timer) {
-+              timer->count = timer->expires;
-+              return;
-+      }
-+      timer->count = timer->expires;
-+      list_add_tail(&timer->list, &active_timers);
-+}
-+
-+/* Remove timer from the timer list; clear timeout status */
-+void fsl_otg_del_timer(void *gtimer)
-+{
-+      struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer;
-+      struct fsl_otg_timer *tmp_timer, *del_tmp;
-+
-+      list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list)
-+              if (tmp_timer == timer)
-+                      list_del(&timer->list);
-+}
-+
-+/*
-+ * Reduce timer count by 1, and find timeout conditions.
-+ * Called by fsl_otg 1ms timer interrupt
-+ */
-+int fsl_otg_tick_timer(void)
-+{
-+      struct fsl_otg_timer *tmp_timer, *del_tmp;
-+      int expired = 0;
-+
-+      list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) {
-+              tmp_timer->count--;
-+              /* check if timer expires */
-+              if (!tmp_timer->count) {
-+                      list_del(&tmp_timer->list);
-+                      tmp_timer->function(tmp_timer->data);
-+                      expired = 1;
-+              }
-+      }
-+
-+      return expired;
-+}
-+
-+/* Reset controller, not reset the bus */
-+void otg_reset_controller(void)
-+{
-+      u32 command;
-+      unsigned long flags;
-+      int timeout;
-+
-+      VDBG("\n");
-+
-+      spin_lock_irqsave(&usb_dr_regs_lock, flags);
-+
-+      command = fsl_readl(&usb_dr_regs->usbcmd);
-+      command |= USB_CMD_CTRL_RESET;
-+      fsl_writel(command, &usb_dr_regs->usbcmd);
-+      spin_unlock_irqrestore(&usb_dr_regs_lock, flags);
-+
-+      /* Wait reset completed */
-+      timeout = 500;
-+      while (fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET)
-+              udelay(1);
-+      if (timeout <= 0)
-+              ERR("%s - USBCMD_RST never clear. Timeout is %d \n",
-+                      __FUNCTION__, timeout);
-+}
-+
-+/* Call suspend/resume routines in host driver */
-+int fsl_otg_start_host(struct otg_fsm *fsm, int on)
-+{
-+      struct otg_transceiver *xceiv = fsm->transceiver;
-+      struct device *dev;
-+      struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg);
-+      u32 retval = 0;
-+
-+      if (!xceiv->host)
-+              return -ENODEV;
-+
-+      dev = xceiv->host->controller;
-+
-+      /*
-+       * Update a_vbus_vld state as a_vbus_vld int is disabled
-+       * in device mode
-+       */
-+      fsm->a_vbus_vld =
-+              !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID);
-+      if (on) {
-+              /* start fsl usb host controller */
-+              if (otg_dev->host_working)
-+                      goto end;
-+              else {
-+                      otg_reset_controller();
-+                      VDBG("host on......\n");
-+                      if (dev->driver->resume) {
-+                              retval = dev->driver->resume(dev);
-+                              if (fsm->id) {
-+                                      /* default-b */
-+                                      fsl_otg_drv_vbus(1);
-+                                      /* Workaround: b_host can't driver
-+                                       * vbus, but PP in PORTSC needs to
-+                                       * be 1 for host to work.
-+                                       * So we set drv_vbus bit in
-+                                       * transceiver to 0 thru ULPI. */
-+                                      write_ulpi(0x0c, 0x20);
-+                              }
-+                      }
-+
-+                      otg_dev->host_working = 1;
-+              }
-+      } else {
-+              /* stop fsl usb host controller */
-+              if (!otg_dev->host_working)
-+                      goto end;
-+              else {
-+                      VDBG("host off......\n");
-+                      if (dev && dev->driver) {
-+                              retval = dev->driver->suspend(dev, PMSG_SUSPEND);
-+                              if (fsm->id)
-+                                      /* default-b */
-+                                      fsl_otg_drv_vbus(0);
-+                      }
-+                      otg_dev->host_working = 0;
-+              }
-+      }
-+end:
-+      return retval;
-+}
-+
-+/*
-+ * Call suspend and resume function in udc driver
-+ * to stop and start udc driver.
-+ */
-+int fsl_otg_start_gadget(struct otg_fsm *fsm, int on)
-+{
-+      struct otg_transceiver *xceiv = fsm->transceiver;
-+      struct device *dev;
-+
-+      VDBG("DDD fsm=%p  xceiv=%p\n", fsm, xceiv);
-+      if (!xceiv->gadget || !xceiv->gadget->dev.parent)
-+              return -ENODEV;
-+
-+      VDBG("DDD xceiv=%p  xceiv->gadget=%p  parent=%p\n", xceiv, xceiv->gadget,
-+              xceiv->gadget->dev.parent);
-+
-+      VDBG("gadget %s\n", on ? "on" : "off");
-+      /* DDD  dump_state("starting gadget", fsm); */
-+
-+      dev = xceiv->gadget->dev.parent;
-+
-+      if (on)
-+              dev->driver->resume(dev);
-+      else
-+              dev->driver->suspend(dev, PMSG_SUSPEND);
-+
-+      return 0;
-+}
-+
-+#if 0
-+static void fsl_otg_enable(struct otg_transceiver *otg_p)
-+{
-+      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
-+      struct otg_fsm *fsm = &(otg_dev)->fsm;
-+      u32 otg_sc;
-+
-+      /* DDD VDBG(""); */
-+      /* enable OTG interrupt */
-+      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
-+      otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK;
-+      otg_sc &= ~OTGSC_IE_1ms_TIMER;
-+      otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE;
-+      otg_sc |= OTGSC_IE_USB_ID;
-+      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
-+
-+      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
-+
-+      if (fsm->id) {
-+              otg_p->state = OTG_STATE_UNDEFINED;
-+      } else {
-+              otg_p->state = OTG_STATE_A_IDLE;
-+      }
-+
-+      otg_p->default_a = (fsm->id == 0);
-+      otg_p->host->is_b_host = fsm->id;
-+      otg_p->gadget->is_a_peripheral = !fsm->id;
-+
-+      fsm->a_vbus_vld = 1;
-+
-+      fsm->b_sess_vld = (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0;
-+      fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0;
-+      fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0;
-+}
-+#endif
-+
-+/*
-+ * Called by initialization code of host driver.  Register host controller
-+ * to the OTG.  Suspend host for OTG role detection.
-+ */
-+static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host)
-+{
-+      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
-+
-+      if (!otg_p || otg_dev != fsl_otg_dev)
-+              return -ENODEV;
-+
-+      otg_p->host = host;
-+
-+      otg_dev->fsm.a_bus_drop = 0;
-+      otg_dev->fsm.a_bus_req = 1;
-+
-+      if (host) {
-+              VDBG("host off......\n");
-+
-+              otg_p->host->otg_port = fsl_otg_initdata.otg_port;
-+              otg_p->host->is_b_host = otg_dev->fsm.id;
-+              /* must leave time for khubd to finish its thing
-+               * before yanking the host driver out from under it,
-+               * so suspend the host after a short delay.
-+               */
-+              otg_dev->host_working = 1;
-+              schedule_delayed_work(&otg_dev->otg_event, 100);
-+              return 0;
-+      } else {                /* host driver going away */
-+
-+              if (!(le32_to_cpu(otg_dev->dr_mem_map->otgsc) &
-+                    OTGSC_STS_USB_ID)) {
-+                      /* Mini-A cable connected */
-+                      struct otg_fsm *fsm = &otg_dev->fsm;
-+
-+                      otg_p->state = OTG_STATE_UNDEFINED;
-+                      fsm->protocol = PROTO_UNDEF;
-+              }
-+      }
-+
-+      otg_dev->host_working = 0;
-+
-+      otg_statemachine(&otg_dev->fsm);
-+
-+      return 0;
-+}
-+
-+/* Called by initialization code of udc.  Register udc to OTG.*/
-+static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p,
-+                                struct usb_gadget *gadget)
-+{
-+      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
-+
-+      VDBG("\n");
-+
-+      if (!otg_p || otg_dev != fsl_otg_dev)
-+              return -ENODEV;
-+
-+      if (!gadget) {
-+              if (!otg_dev->otg.default_a)
-+                      otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0);
-+              usb_gadget_vbus_disconnect(otg_dev->otg.gadget);
-+              otg_dev->otg.gadget = 0;
-+              otg_dev->fsm.b_bus_req = 0;
-+              otg_statemachine(&otg_dev->fsm);
-+              return 0;
-+      }
-+
-+      otg_p->gadget = gadget;
-+      otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id;
-+
-+      otg_dev->fsm.b_bus_req = 1;
-+
-+      /* start the gadget right away if the ID pin says Mini-B */
-+      DBG("ID pin=%d\n", otg_dev->fsm.id);
-+      if (otg_dev->fsm.id == 1) {
-+              fsl_otg_start_host(&otg_dev->fsm, 0);
-+              fsl_otg_drv_vbus(0);
-+              fsl_otg_start_gadget(&otg_dev->fsm, 1);
-+      }
-+
-+      return 0;
-+}
-+
-+/* Set OTG port power, only for B-device */
-+static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA)
-+{
-+      if (!fsl_otg_dev)
-+              return -ENODEV;
-+      if (otg_p->state == OTG_STATE_B_PERIPHERAL)
-+              printk(KERN_DEBUG "FSL OTG:Draw %d mA\n", mA);
-+
-+      return 0;
-+}
-+
-+/* Delayed pin detect interrupt processing.
-+ *
-+ * When the Mini-A cable is disconnected from the board,
-+ * the pin-detect interrupt happens before the disconnnect
-+ * interrupts for the connected device(s).  In order to
-+ * process the disconnect interrupt(s) prior to switching
-+ * roles, the pin-detect interrupts are delayed, and handled
-+ * by this routine.
-+ */
-+static void fsl_otg_event(struct work_struct *work)
-+{
-+      struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work);
-+      struct otg_fsm *fsm = &og->fsm;
-+
-+      VDBG("DDD fsm->id=%d\n", fsm->id);
-+      if (fsm->id) {          /* switch to gadget */
-+              fsl_otg_start_host(fsm, 0);
-+              fsl_otg_drv_vbus(0);
-+              fsl_otg_start_gadget(fsm, 1);
-+      }
-+}
-+
-+/* B-device start SRP */
-+static int fsl_otg_start_srp(struct otg_transceiver *otg_p)
-+{
-+      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
-+
-+      if (!otg_p || otg_dev != fsl_otg_dev
-+          || otg_p->state != OTG_STATE_B_IDLE)
-+              return -ENODEV;
-+
-+      otg_dev->fsm.b_bus_req = 1;
-+      otg_statemachine(&otg_dev->fsm);
-+
-+      return 0;
-+}
-+
-+/* A_host suspend will call this function to start hnp */
-+static int fsl_otg_start_hnp(struct otg_transceiver *otg_p)
-+{
-+      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
-+
-+      if (!otg_p || otg_dev != fsl_otg_dev)
-+              return -ENODEV;
-+
-+      VDBG("start_hnp.............\n");
-+      /* clear a_bus_req to enter a_suspend state */
-+      otg_dev->fsm.a_bus_req = 0;
-+      otg_statemachine(&otg_dev->fsm);
-+
-+      return 0;
-+}
-+
-+/*
-+ * Interrupt handler.  OTG/host/peripheral share the same int line.
-+ * OTG driver clears OTGSC interrupts and leaves USB interrupts
-+ * intact.  It needs to have knowledge of some USB interrupts
-+ * such as port change.
-+ */
-+irqreturn_t fsl_otg_isr(int irq, void *dev_id)
-+{
-+      struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
-+      struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg;
-+      u32 otg_int_src, otg_sc;
-+
-+      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
-+      otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
-+
-+      /* Only clear otg interrupts */
-+      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
-+
-+      /*FIXME: ID change not generate when init to 0 */
-+      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
-+      otg->default_a = (fsm->id == 0);
-+
-+      /* process OTG interrupts */
-+      if (otg_int_src) {
-+              VDBG("\nOTG irq 0x%08x\n", otg_int_src);
-+
-+              if (otg_int_src & OTGSC_INTSTS_USB_ID) {
-+                      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
-+                      otg->default_a = (fsm->id == 0);
-+                      /* clear conn information */
-+                      if (fsm->id)
-+                              fsm->b_conn = 0;
-+                      else
-+                              fsm->a_conn = 0;
-+
-+                      if (otg->host)
-+                              otg->host->is_b_host = fsm->id;
-+                      if (otg->gadget)
-+                              otg->gadget->is_a_peripheral = !fsm->id;
-+                      VDBG("ID int (ID is %d)\n", fsm->id);
-+
-+                      if (fsm->id) {  /* switch to gadget */
-+                              schedule_delayed_work(&((struct fsl_otg *)
-+                                                      dev_id)->otg_event, 25);
-+                      } else {        /* switch to host */
-+                              cancel_delayed_work(&
-+                                                  ((struct fsl_otg *)dev_id)->
-+                                                  otg_event);
-+                              fsl_otg_start_gadget(fsm, 0);
-+                              fsl_otg_drv_vbus(1);
-+                              fsl_otg_start_host(fsm, 1);
-+                      }
-+
-+                      return IRQ_HANDLED;
-+              }
-+      }
-+
-+      return IRQ_NONE;
-+}
-+
-+
-+static struct otg_fsm_ops fsl_otg_ops = {
-+      .chrg_vbus = fsl_otg_chrg_vbus,
-+      .drv_vbus = fsl_otg_drv_vbus,
-+      .loc_conn = fsl_otg_loc_conn,
-+      .loc_sof = fsl_otg_loc_sof,
-+      .start_pulse = fsl_otg_start_pulse,
-+
-+      .add_timer = fsl_otg_add_timer,
-+      .del_timer = fsl_otg_del_timer,
-+
-+      .start_host = fsl_otg_start_host,
-+      .start_gadget = fsl_otg_start_gadget,
-+};
-+
-+/* Initialize the global variable fsl_otg_dev and request IRQ for OTG */
-+int fsl_otg_cfg(struct platform_device *pdev)
-+{
-+      int status;
-+      struct fsl_otg *fsl_otg_tc;
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      struct resource *res;
-+
-+      DBG("\n");
-+
-+      if (fsl_otg_dev)
-+              return 0;
-+
-+      /* allocate space to fsl otg device */
-+      fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL);
-+      if (!fsl_otg_tc)
-+              return -ENODEV;
-+
-+      if (pdata->regs) {
-+              fsl_otg_tc->dr_mem_map = pdata->regs;
-+      } else {
-+              res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+              if (!res) {
-+                      dev_err(&pdev->dev, "no register addr.\n");
-+                      return -ENODEV;
-+              }
-+
-+              /*
-+              printk("DDD %s(): rsrc_start=0x%x  rsrc_len=0x%x\n",
-+                   __FUNCTION__, res->start, res->end - res->start + 1);
-+              */
-+
-+              if (!request_mem_region(res->start, res->end - res->start + 1,
-+                                      "OTG")) {
-+                      dev_dbg(&pdev->dev, "request_mem_region failed\n");
-+                      return -EBUSY;
-+              }
-+              fsl_otg_tc->dr_mem_map = ioremap(res->start,
-+                                               res->end - res->start + 1);
-+      }
-+      DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map);
-+
-+      INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event);
-+
-+      INIT_LIST_HEAD(&active_timers);
-+      fsl_otg_init_timers(&fsl_otg_tc->fsm);
-+
-+      /* Set OTG state machine operations */
-+      fsl_otg_tc->fsm.ops = &fsl_otg_ops;
-+
-+      /* record initial state of ID pin */
-+      fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID)
-+          ? 1 : 0;
-+      DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id);
-+
-+      /* initialize the otg structure */
-+      fsl_otg_tc->otg.label = DRIVER_DESC;
-+      fsl_otg_tc->otg.set_host = fsl_otg_set_host;
-+      fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral;
-+      fsl_otg_tc->otg.set_power = fsl_otg_set_power;
-+      fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp;
-+      fsl_otg_tc->otg.start_srp = fsl_otg_start_srp;
-+
-+      fsl_otg_dev = fsl_otg_tc;
-+
-+      /* Store the otg transceiver */
-+      status = otg_set_transceiver(&fsl_otg_tc->otg);
-+      if (status) {
-+              printk(KERN_WARNING ": unable to register OTG transceiver.\n");
-+              return status;
-+      }
-+
-+      return 0;
-+}
-+
-+/* OTG Initialization*/
-+int usb_otg_start(struct platform_device *pdev)
-+{
-+      struct fsl_otg *p_otg;
-+      struct otg_transceiver *otg_trans = otg_get_transceiver();
-+      struct otg_fsm *fsm;
-+      int status;
-+      u32 temp;
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      int timeout;
-+
-+      DBG("\n");
-+
-+      p_otg = container_of(otg_trans, struct fsl_otg, otg);
-+      fsm = &p_otg->fsm;
-+
-+      /* Initialize the state machine structure with default values */
-+      SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED);
-+      fsm->transceiver = &p_otg->otg;
-+
-+      usb_dr_regs = p_otg->dr_mem_map;
-+      DBG("set usb_dr_regs to 0x%p\n", usb_dr_regs);
-+
-+      /* request irq */
-+      p_otg->irq = platform_get_irq(pdev, 0);
-+      status = request_irq(p_otg->irq, fsl_otg_isr,
-+                              IRQF_SHARED, driver_name, p_otg);
-+      if (status) {
-+              dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n",
-+                      p_otg->irq, status);
-+              kfree(p_otg);
-+              return status;
-+      }
-+
-+
-+      /* stop the controller */
-+      temp = fsl_readl(&usb_dr_regs->usbcmd) & ~USB_CMD_RUN_STOP;
-+      fsl_writel(temp, &usb_dr_regs->usbcmd);
-+
-+      /* reset the controller */
-+      temp = fsl_readl(&usb_dr_regs->usbcmd);
-+      temp |= USB_CMD_CTRL_RESET;
-+      fsl_writel(temp, &usb_dr_regs->usbcmd);
-+
-+      /* wait reset completed */
-+      timeout = 500;
-+      while (timeout-- &&
-+              fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET)
-+              udelay(1);
-+      if (timeout <= 0)
-+              ERR("%s - USBCMD_RST never clear. Timeout is %d \n",
-+                      __FUNCTION__, timeout);
-+
-+      /* configure the VBUSHS as IDLE(both host and device) */
-+      temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0);
-+      fsl_writel(temp, &usb_dr_regs->usbmode);
-+
-+      /* configure PHY interface */
-+      temp = fsl_readl(&usb_dr_regs->portsc1);
-+      temp &= ~(PORTSCX_PHY_TYPE_SEL | PORTSCX_PTW_8BIT);
-+
-+      /* DDD wrong xcvr setting stuff follows */
-+      temp |= PORTSCX_PTS_ULPI;
-+      fsl_writel(temp, &usb_dr_regs->portsc1);
-+
-+
-+      /* disable all interrupt and clear all OTGSC status */
-+      temp = fsl_readl(&usb_dr_regs->otgsc);
-+      temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
-+      temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
-+      fsl_writel(temp, &usb_dr_regs->otgsc);
-+
-+      fsl_otg_drv_vbus(0);
-+
-+      /*
-+       * The identification (id) input is FALSE when a Mini-A plug is inserted
-+       * in the devices Mini-AB receptacle. Otherwise, this input is TRUE.
-+       * Also: record initial state of ID pin
-+       */
-+      if (fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_USB_ID) {
-+              p_otg->otg.state = OTG_STATE_UNDEFINED;
-+              p_otg->fsm.id = 1;
-+      } else {
-+              p_otg->otg.state = OTG_STATE_A_IDLE;
-+              p_otg->fsm.id = 0;
-+      }
-+
-+      DBG("initial ID pin=%d\n", p_otg->fsm.id);
-+
-+      /* enable OTG ID pin interrupt */
-+      temp = fsl_readl(&usb_dr_regs->otgsc);
-+      temp |= OTGSC_IE_USB_ID;
-+      temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER);
-+      fsl_writel(temp, &usb_dr_regs->otgsc);
-+
-+      return 0;
-+}
-+
-+/* Initialize board specific registers,PIB board,clock and pin multiplexing */
-+static int board_init(struct platform_device *pdev)
-+{
-+      struct fsl_usb2_platform_data *pdata;
-+      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
-+
-+      /*
-+       * do platform specific init: check the clock, grab/config pins, etc.
-+       */
-+      if (pdata->platform_init(pdev) != 0)
-+              return -EINVAL;
-+
-+      return 0;
-+}
-+
-+/*-------------------------------------------------------------------------
-+              PROC File System Support
-+-------------------------------------------------------------------------*/
-+#ifdef CONFIG_USB_OTG_DEBUG_FILES
-+
-+#include <linux/seq_file.h>
-+
-+static const char proc_filename[] = "driver/fsl_usb2_otg";
-+
-+static int otg_proc_read(char *page, char **start, off_t off, int count,
-+                       int *eof, void *_dev)
-+{
-+      struct otg_fsm *fsm = &fsl_otg_dev->fsm;
-+      char *buf = page;
-+      char *next = buf;
-+      unsigned size = count;
-+      unsigned long flags;
-+      int t;
-+      u32 tmp_reg;
-+
-+      if (off != 0)
-+              return 0;
-+
-+      spin_lock_irqsave(&fsm->lock, flags);
-+
-+      /* ------basic driver infomation ---- */
-+      t = scnprintf(next, size,
-+                    DRIVER_DESC "\n" "fsl_usb2_otg version: %s\n\n",
-+                    DRIVER_VERSION);
-+      size -= t;
-+      next += t;
-+
-+      /* ------ Registers ----- */
-+      /* tmp_reg = le32_to_cpu(usb_dr_regs->otgsc); */
-+      tmp_reg = fsl_readl(&usb_dr_regs->otgsc);
-+      t = scnprintf(next, size, "OTGSC reg: 0x%08x\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      /* tmp_reg = le32_to_cpu(usb_dr_regs->portsc); */
-+      tmp_reg = fsl_readl(&usb_dr_regs->portsc1);
-+      t = scnprintf(next, size, "PORTSC reg: 0x%08x\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbmode); */
-+      tmp_reg = fsl_readl(&usb_dr_regs->usbmode);
-+      t = scnprintf(next, size, "USBMODE reg: 0x%08x\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbcmd); */
-+      tmp_reg = fsl_readl(&usb_dr_regs->usbcmd);
-+      t = scnprintf(next, size, "USBCMD reg: 0x%08x\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbsts); */
-+      tmp_reg = fsl_readl(&usb_dr_regs->usbsts);
-+      t = scnprintf(next, size, "USBSTS reg: 0x%08x\n", tmp_reg);
-+      size -= t;
-+      next += t;
-+
-+      /* ------ State ----- */
-+      t = scnprintf(next, size, "FSM protocol=%d %s\n", fsm->protocol,
-+              fsm->protocol ?
-+              (fsm->protocol == PROTO_HOST ? "Host" : "Gadget")
-+              : "None");
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size,
-+                    "OTG state: %s\n\n",
-+                    state_string(fsl_otg_dev->otg.state));
-+      size -= t;
-+      next += t;
-+
-+      /* ------ State Machine Variables ----- */
-+      t = scnprintf(next, size, "a_bus_req: %d\n", fsm->a_bus_req);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_bus_req: %d\n", fsm->b_bus_req);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_bus_resume: %d\n", fsm->a_bus_resume);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_bus_suspend: %d\n", fsm->a_bus_suspend);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_conn: %d\n", fsm->a_conn);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_sess_vld: %d\n", fsm->a_sess_vld);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_srp_det: %d\n", fsm->a_srp_det);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "a_vbus_vld: %d\n", fsm->a_vbus_vld);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_bus_resume: %d\n", fsm->b_bus_resume);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_bus_suspend: %d\n", fsm->b_bus_suspend);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_conn: %d\n", fsm->b_conn);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_se0_srp: %d\n", fsm->b_se0_srp);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_sess_end: %d\n", fsm->b_sess_end);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "b_sess_vld: %d\n", fsm->b_sess_vld);
-+      size -= t;
-+      next += t;
-+
-+      t = scnprintf(next, size, "id: %d\n", fsm->id);
-+      size -= t;
-+      next += t;
-+
-+      spin_unlock_irqrestore(&fsm->lock, flags);
-+
-+      *eof = 1;
-+      return count - size;
-+}
-+
-+#define create_proc_file()    create_proc_read_entry(proc_filename, \
-+                              0, NULL, otg_proc_read, NULL)
-+
-+#define remove_proc_file()    remove_proc_entry(proc_filename, NULL)
-+
-+#else                         /* !CONFIG_USB_OTG_DEBUG_FILES */
-+
-+#define create_proc_file()    do {} while (0)
-+#define remove_proc_file()    do {} while (0)
-+
-+#endif                                /*CONFIG_USB_OTG_DEBUG_FILES */
-+
-+/*----------------------------------------------------------*/
-+/* Char driver interface to control some OTG input */
-+
-+/*
-+ * This function handle some ioctl command,such as get otg
-+ * status and set host suspend
-+ */
-+static int fsl_otg_ioctl(struct inode *inode, struct file *file,
-+                       unsigned int cmd, unsigned long arg)
-+{
-+      u32 retval = 0;
-+
-+      switch (cmd) {
-+      case GET_OTG_STATUS:
-+              retval = fsl_otg_dev->host_working;
-+              break;
-+
-+      case SET_A_SUSPEND_REQ:
-+              fsl_otg_dev->fsm.a_suspend_req = arg;
-+              break;
-+
-+      case SET_A_BUS_DROP:
-+              fsl_otg_dev->fsm.a_bus_drop = arg;
-+              break;
-+
-+      case SET_A_BUS_REQ:
-+              fsl_otg_dev->fsm.a_bus_req = arg;
-+              break;
-+
-+      case SET_B_BUS_REQ:
-+              fsl_otg_dev->fsm.b_bus_req = arg;
-+              break;
-+
-+      default:
-+              break;
-+      }
-+
-+      otg_statemachine(&fsl_otg_dev->fsm);
-+
-+      return retval;
-+}
-+
-+static int fsl_otg_open(struct inode *inode, struct file *file)
-+{
-+
-+      return 0;
-+}
-+
-+static int fsl_otg_release(struct inode *inode, struct file *file)
-+{
-+
-+      return 0;
-+}
-+
-+static struct file_operations otg_fops = {
-+      .owner = THIS_MODULE,
-+      .llseek = NULL,
-+      .read = NULL,
-+      .write = NULL,
-+      .ioctl = fsl_otg_ioctl,
-+      .open = fsl_otg_open,
-+      .release = fsl_otg_release,
-+};
-+
-+static int __init fsl_otg_probe(struct platform_device *pdev)
-+{
-+      int status;
-+      struct fsl_usb2_platform_data *pdata;
-+
-+      DBG("pdev=0x%p\n", pdev);
-+
-+      if (!pdev)
-+              return -ENODEV;
-+
-+      if (!pdev->dev.platform_data)
-+              return -ENOMEM;
-+
-+      pdata = pdev->dev.platform_data;
-+      /* Initialize the clock, multiplexing pin and PHY interface */
-+      board_init(pdev);
-+
-+      /* configure the OTG */
-+      status = fsl_otg_cfg(pdev);
-+      if (status) {
-+              printk(KERN_INFO "Couldn't init OTG module\n");
-+              return -status;
-+      }
-+
-+      /* start OTG */
-+      status = usb_otg_start(pdev);
-+
-+      if (register_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME, &otg_fops)) {
-+              printk(KERN_WARNING FSL_OTG_NAME
-+                     ": unable to register FSL OTG device\n");
-+              return -EIO;
-+      }
-+
-+      create_proc_file();
-+      return status;
-+}
-+
-+static int fsl_otg_remove(struct platform_device *pdev)
-+{
-+      u32 ie;
-+      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
-+      unsigned long flags;
-+
-+      DBG("pdev=0x%p  pdata=0x%p\n", pdev, pdata);
-+
-+      otg_set_transceiver(NULL);
-+
-+      /* disable and clear OTGSC interrupts */
-+      spin_lock_irqsave(&usb_dr_regs_lock, flags);
-+      ie = fsl_readl(&usb_dr_regs->otgsc);
-+      ie &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
-+      ie |= OTGSC_INTERRUPT_STATUS_BITS_MASK;
-+      fsl_writel(ie, &usb_dr_regs->otgsc);
-+      spin_unlock_irqrestore(&usb_dr_regs_lock, flags);
-+
-+      free_irq(fsl_otg_dev->irq, fsl_otg_dev);
-+
-+      kfree(fsl_otg_dev);
-+
-+      remove_proc_file();
-+
-+      unregister_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME);
-+
-+      if (pdata->platform_uninit)
-+              pdata->platform_uninit(pdev);
-+
-+      fsl_otg_dev = NULL;
-+      return 0;
-+}
-+
-+struct platform_driver fsl_otg_driver = {
-+      .probe = fsl_otg_probe,
-+      .remove = fsl_otg_remove,
-+      .driver = {
-+              .name  = driver_name,
-+              .owner = THIS_MODULE,
-+      },
-+};
-+
-+/*-------------------------------------------------------------------------*/
-+
-+static int __init fsl_usb_otg_init(void)
-+{
-+      printk(KERN_INFO DRIVER_DESC " loaded, %s\n", DRIVER_VERSION);
-+      return platform_driver_register(&fsl_otg_driver);
-+}
-+
-+static void __exit fsl_usb_otg_exit(void)
-+{
-+      platform_driver_unregister(&fsl_otg_driver);
-+}
-+
-+module_init(fsl_usb_otg_init);
-+module_exit(fsl_usb_otg_exit);
-+
-+MODULE_DESCRIPTION(DRIVER_INFO);
-+MODULE_AUTHOR(DRIVER_AUTHOR);
-+MODULE_LICENSE("GPL");
---- /dev/null
-+++ b/drivers/usb/otg/fsl_otg.h
-@@ -0,0 +1,139 @@
-+/*
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#ifndef FSL_OTG_H
-+#define FSL_OTG_H
-+#include <linux/usb/otg.h>
-+#include "otg_fsm.h"
-+#include <linux/ioctl.h>
-+
-+#define ERR(format, arg...) \
-+printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __FUNCTION__ , ## arg)
-+
-+/*
-+ *  A-DEVICE timing  constants
-+ */
-+
-+/* Wait for VBUS Rise  */
-+#define TA_WAIT_VRISE (100)   /* a_wait_vrise 100 ms, section: 6.6.5.1 */
-+
-+/* Wait for B-Connect */
-+#define TA_WAIT_BCON  (10000) /* a_wait_bcon > 1 sec, section: 6.6.5.2
-+                               * This is only used to get out of
-+                               * OTG_STATE_A_WAIT_BCON state if there was
-+                               * no connection for these many milliseconds
-+                               */
-+
-+/* A-Idle to B-Disconnect */
-+/* It is necessary for this timer to be more than 750 ms because of a bug in OPT
-+ * test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated
-+ * in the test description
-+ */
-+#define TA_AIDL_BDIS  (5000)  /* a_suspend minimum 200 ms, section: 6.6.5.3 */
-+
-+/* B-Idle to A-Disconnect */
-+#define TA_BIDL_ADIS  (12)    /* 3 to 200 ms */
-+
-+/* B-device timing constants */
-+
-+/* Data-Line Pulse Time*/
-+#define TB_DATA_PLS   (10)    /* b_srp_init,continue 5~10ms, section:5.3.3 */
-+#define TB_DATA_PLS_MIN       (5)     /* minimum 5 ms */
-+#define TB_DATA_PLS_MAX       (10)    /* maximum 10 ms */
-+
-+/* SRP Initiate Time  */
-+#define TB_SRP_INIT   (100)   /* b_srp_init,maximum 100 ms, section:5.3.8 */
-+
-+/* SRP Fail Time  */
-+#define TB_SRP_FAIL   (7000)  /* b_srp_init,Fail time 5~30s, section:6.8.2.2 */
-+
-+/* SRP result wait time */
-+#define TB_SRP_WAIT   (60)
-+
-+/* VBus time */
-+#define TB_VBUS_PLS   (30)    /* time to keep vbus pulsing asserted */
-+
-+/* Discharge time */
-+/* This time should be less than 10ms. It varies from system to system. */
-+#define TB_VBUS_DSCHRG        (8)
-+
-+/* A-SE0 to B-Reset  */
-+#define TB_ASE0_BRST  (20)    /* b_wait_acon, mini 3.125 ms,section:6.8.2.4 */
-+
-+/* A bus suspend timer before we can switch to b_wait_aconn */
-+#define TB_A_SUSPEND  (7)
-+#define TB_BUS_RESUME (12)
-+
-+/* SE0 Time Before SRP */
-+#define TB_SE0_SRP    (2)     /* b_idle,minimum 2 ms, section:5.3.2 */
-+
-+#define SET_OTG_STATE(otg_ptr, newstate)      ((otg_ptr)->state = newstate)
-+
-+
-+struct fsl_otg_timer {
-+      unsigned long expires;  /* Number of count increase to timeout */
-+      unsigned long count;    /* Tick counter */
-+      void (*function) (unsigned long);       /* Timeout function */
-+      unsigned long data;     /* Data passed to function */
-+      struct list_head list;
-+};
-+
-+struct fsl_otg_timer inline *otg_timer_initializer
-+    (void (*function) (unsigned long), unsigned long expires,
-+     unsigned long data) {
-+      struct fsl_otg_timer *timer;
-+      timer = kmalloc(sizeof(struct fsl_otg_timer), GFP_KERNEL);
-+      if (timer == NULL)
-+              return NULL;
-+      timer->function = function;
-+      timer->expires = expires;
-+      timer->data = data;
-+      return timer;
-+}
-+
-+struct fsl_otg {
-+      struct otg_transceiver otg;
-+      struct otg_fsm fsm;
-+      struct fsl_usb_device_regs *dr_mem_map;
-+      struct delayed_work otg_event;
-+
-+      /*used for usb host */
-+      u8 host_working;
-+      u8 on_off;
-+
-+      int irq;
-+};
-+
-+struct fsl_otg_config {
-+      u8 otg_port;
-+};
-+
-+/*For SRP and HNP handle*/
-+#define FSL_OTG_MAJOR 66
-+#define FSL_OTG_NAME  "fsl-otg"
-+/*Command to OTG driver(ioctl)*/
-+#define OTG_IOCTL_MAGIC               FSL_OTG_MAJOR
-+/*if otg work as host,it should return 1,otherwise it return 0*/
-+#define GET_OTG_STATUS                _IOR(OTG_IOCTL_MAGIC, 1, int)
-+#define SET_A_SUSPEND_REQ     _IOW(OTG_IOCTL_MAGIC, 2, int)
-+#define SET_A_BUS_DROP                _IOW(OTG_IOCTL_MAGIC, 3, int)
-+#define SET_A_BUS_REQ         _IOW(OTG_IOCTL_MAGIC, 4, int)
-+#define SET_B_BUS_REQ         _IOW(OTG_IOCTL_MAGIC, 5, int)
-+#define GET_A_SUSPEND_REQ     _IOR(OTG_IOCTL_MAGIC, 6, int)
-+#define GET_A_BUS_DROP                _IOR(OTG_IOCTL_MAGIC, 7, int)
-+#define GET_A_BUS_REQ         _IOR(OTG_IOCTL_MAGIC, 8, int)
-+#define GET_B_BUS_REQ         _IOR(OTG_IOCTL_MAGIC, 9, int)
-+
-+
-+/********************************************************************/
-+#endif
---- /dev/null
-+++ b/drivers/usb/otg/Makefile
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for USB OTG controller  driver
-+#
-+fsl_usb2_otg-objs             := fsl_otg.o otg_fsm.o
-+obj-y                         += fsl_usb2_otg.o
---- /dev/null
-+++ b/drivers/usb/otg/otg_fsm.c
-@@ -0,0 +1,381 @@
-+/* OTG Finite State Machine from OTG spec
-+ *
-+ * Copyright (C) 2007 Freescale Semiconductor, Inc.
-+ *
-+ * Author:    Li Yang <LeoLi@freescale.com>
-+ *            Jerry Huang <Chang-Ming.Huang@freescale.com>
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the  GNU General Public License along
-+ * with this program; if not, write  to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/usb/otg.h>
-+#include <linux/spinlock.h>
-+#include <linux/delay.h>
-+#include <linux/usb.h>
-+#include <linux/usb_gadget.h>
-+
-+#include "otg_fsm.h"
-+
-+
-+/* Defined by device specific driver, for different timer implementation */
-+extern void *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr,
-+      *b_ase0_brst_tmr, *b_se0_srp_tmr, *b_srp_fail_tmr, *a_wait_enum_tmr;
-+
-+const char *state_string(enum usb_otg_state state)
-+{
-+      switch (state) {
-+      case OTG_STATE_A_IDLE:          return "a_idle";
-+      case OTG_STATE_A_WAIT_VRISE:    return "a_wait_vrise";
-+      case OTG_STATE_A_WAIT_BCON:     return "a_wait_bcon";
-+      case OTG_STATE_A_HOST:          return "a_host";
-+      case OTG_STATE_A_SUSPEND:       return "a_suspend";
-+      case OTG_STATE_A_PERIPHERAL:    return "a_peripheral";
-+      case OTG_STATE_A_WAIT_VFALL:    return "a_wait_vfall";
-+      case OTG_STATE_A_VBUS_ERR:      return "a_vbus_err";
-+      case OTG_STATE_B_IDLE:          return "b_idle";
-+      case OTG_STATE_B_SRP_INIT:      return "b_srp_init";
-+      case OTG_STATE_B_PERIPHERAL:    return "b_peripheral";
-+      case OTG_STATE_B_WAIT_ACON:     return "b_wait_acon";
-+      case OTG_STATE_B_HOST:          return "b_host";
-+      default:                        return "UNDEFINED";
-+      }
-+}
-+EXPORT_SYMBOL(state_string);
-+
-+/* Change USB protocol when there is a protocol change */
-+static int otg_set_protocol(struct otg_fsm *fsm, int protocol)
-+{
-+      int ret = 0;
-+
-+      VDBG("DDD old fsm->protocol= %d; new protocol= %d\n",
-+                   fsm->protocol, protocol);
-+      if (fsm->protocol != protocol) {
-+              VDBG("Changing role fsm->protocol= %d; new protocol= %d\n",
-+                              fsm->protocol, protocol);
-+              /* stop old protocol */
-+              if (fsm->protocol == PROTO_HOST)
-+                      ret = fsm->ops->start_host(fsm, 0);
-+              else if (fsm->protocol == PROTO_GADGET)
-+                      ret = fsm->ops->start_gadget(fsm, 0);
-+              if (ret)
-+                      return ret;
-+
-+              /* start new protocol */
-+              if (protocol == PROTO_HOST)
-+                      ret = fsm->ops->start_host(fsm, 1);
-+              else if (protocol == PROTO_GADGET)
-+                      ret = fsm->ops->start_gadget(fsm, 1);
-+              if (ret)
-+                      return ret;
-+
-+              fsm->protocol = protocol;
-+              return 0;
-+      }
-+
-+      return 0;
-+}
-+
-+static int state_changed;
-+
-+/* Called when leaving a state.  Do state clean up jobs here */
-+static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
-+{
-+      switch (old_state) {
-+      case OTG_STATE_B_IDLE:
-+              otg_del_timer(fsm, fsm->b_se0_srp_tmr);
-+              fsm->b_se0_srp = 0;
-+              break;
-+      case OTG_STATE_B_SRP_INIT:
-+              fsm->b_srp_done = 0;
-+              break;
-+      case OTG_STATE_B_PERIPHERAL:
-+              break;
-+      case OTG_STATE_B_WAIT_ACON:
-+              otg_del_timer(fsm, fsm->b_ase0_brst_tmr);
-+              fsm->b_ase0_brst_tmout = 0;
-+              break;
-+      case OTG_STATE_B_HOST:
-+              break;
-+      case OTG_STATE_A_IDLE:
-+              break;
-+      case OTG_STATE_A_WAIT_VRISE:
-+              otg_del_timer(fsm, fsm->a_wait_vrise_tmr);
-+              fsm->a_wait_vrise_tmout = 0;
-+              break;
-+      case OTG_STATE_A_WAIT_BCON:
-+              otg_del_timer(fsm, fsm->a_wait_bcon_tmr);
-+              fsm->a_wait_bcon_tmout = 0;
-+              break;
-+      case OTG_STATE_A_HOST:
-+              otg_del_timer(fsm, fsm->a_wait_enum_tmr);
-+              break;
-+      case OTG_STATE_A_SUSPEND:
-+              otg_del_timer(fsm, fsm->a_aidl_bdis_tmr);
-+              fsm->a_aidl_bdis_tmout = 0;
-+              fsm->a_suspend_req = 0;
-+              fsm->a_bus_req = 1;     /* FIXME */
-+              break;
-+      case OTG_STATE_A_PERIPHERAL:
-+              break;
-+      case OTG_STATE_A_WAIT_VFALL:
-+              otg_del_timer(fsm, fsm->a_wait_vrise_tmr);
-+              break;
-+      case OTG_STATE_A_VBUS_ERR:
-+              break;
-+      default:
-+              break;
-+      }
-+}
-+
-+/* Called when entering a state */
-+static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
-+{
-+      state_changed = 1;
-+      VDBG("State: old=%s new=%s \n",
-+              state_string(fsm->transceiver->state), state_string(new_state));
-+
-+      if (fsm->transceiver->state == new_state)
-+              return 0;
-+
-+      otg_leave_state(fsm, fsm->transceiver->state);
-+      switch (new_state) {
-+      case OTG_STATE_B_IDLE:
-+              otg_drv_vbus(fsm, 0);
-+              otg_chrg_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_UNDEF);
-+              otg_add_timer(fsm, fsm->b_se0_srp_tmr);
-+              break;
-+      case OTG_STATE_B_SRP_INIT:
-+              otg_start_pulse(fsm);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_UNDEF);
-+              otg_add_timer(fsm, fsm->b_srp_fail_tmr);
-+              break;
-+      case OTG_STATE_B_PERIPHERAL:
-+              otg_chrg_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 1);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_GADGET);
-+              break;
-+      case OTG_STATE_B_WAIT_ACON:
-+              otg_chrg_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              otg_add_timer(fsm, fsm->b_ase0_brst_tmr);
-+              fsm->a_bus_suspend = 0;
-+              break;
-+      case OTG_STATE_B_HOST:
-+              otg_chrg_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 1);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              usb_bus_start_enum(fsm->transceiver->host,
-+                                 fsm->transceiver->host->otg_port);
-+              break;
-+      case OTG_STATE_A_IDLE:
-+              otg_drv_vbus(fsm, 0);
-+              otg_chrg_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              break;
-+      case OTG_STATE_A_WAIT_VRISE:
-+              otg_drv_vbus(fsm, 1);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              otg_add_timer(fsm, fsm->a_wait_vrise_tmr);
-+              break;
-+      case OTG_STATE_A_WAIT_BCON:
-+              otg_drv_vbus(fsm, 1);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              otg_add_timer(fsm, fsm->a_wait_bcon_tmr);
-+              break;
-+      case OTG_STATE_A_HOST:
-+              otg_drv_vbus(fsm, 1);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 1);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              /*
-+               * When HNP is triggered while a_bus_req = 0, a_host will
-+               * suspend too fast to complete a_set_b_hnp_en
-+               */
-+              if (!fsm->a_bus_req || fsm->a_suspend_req)
-+                      otg_add_timer(fsm, fsm->a_wait_enum_tmr);
-+              break;
-+      case OTG_STATE_A_SUSPEND:
-+              otg_drv_vbus(fsm, 1);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              otg_add_timer(fsm, fsm->a_aidl_bdis_tmr);
-+
-+              break;
-+      case OTG_STATE_A_PERIPHERAL:
-+              otg_loc_conn(fsm, 1);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_GADGET);
-+              otg_drv_vbus(fsm, 1);
-+              break;
-+      case OTG_STATE_A_WAIT_VFALL:
-+              otg_drv_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_HOST);
-+              break;
-+      case OTG_STATE_A_VBUS_ERR:
-+              otg_drv_vbus(fsm, 0);
-+              otg_loc_conn(fsm, 0);
-+              otg_loc_sof(fsm, 0);
-+              otg_set_protocol(fsm, PROTO_UNDEF);
-+              break;
-+      default:
-+              break;
-+      }
-+
-+      fsm->transceiver->state = new_state;
-+      return 0;
-+}
-+
-+/* State change judgement */
-+int otg_statemachine(struct otg_fsm *fsm)
-+{
-+      enum usb_otg_state state;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&fsm->lock, flags);
-+
-+      state = fsm->transceiver->state;
-+      state_changed = 0;
-+      /* State machine state change judgement */
-+
-+      VDBG(" State: %s \n", state_string(state));
-+
-+      switch (state) {
-+      case OTG_STATE_UNDEFINED:
-+              if (fsm->id)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              else
-+                      otg_set_state(fsm, OTG_STATE_A_IDLE);
-+              break;
-+      case OTG_STATE_B_IDLE:
-+              if (!fsm->id)
-+                      otg_set_state(fsm, OTG_STATE_A_IDLE);
-+              else if (fsm->b_sess_vld && fsm->transceiver->gadget)
-+                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
-+              else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp)
-+                      otg_set_state(fsm, OTG_STATE_B_SRP_INIT);
-+              break;
-+      case OTG_STATE_B_SRP_INIT:
-+              if (!fsm->id || fsm->b_srp_done)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              break;
-+      case OTG_STATE_B_PERIPHERAL:
-+              if (!fsm->id || !fsm->b_sess_vld)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              else if (fsm->b_bus_req &&
-+                       fsm->transceiver->
-+                       gadget->b_hnp_enable && fsm->a_bus_suspend)
-+                      otg_set_state(fsm, OTG_STATE_B_WAIT_ACON);
-+              break;
-+      case OTG_STATE_B_WAIT_ACON:
-+              if (fsm->a_conn)
-+                      otg_set_state(fsm, OTG_STATE_B_HOST);
-+              else if (!fsm->id || !fsm->b_sess_vld)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) {
-+                      fsm->b_ase0_brst_tmout = 0;
-+                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
-+              }
-+              break;
-+      case OTG_STATE_B_HOST:
-+              if (!fsm->id || !fsm->b_sess_vld)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              else if (!fsm->b_bus_req || !fsm->a_conn)
-+                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
-+              break;
-+      case OTG_STATE_A_IDLE:
-+              if (fsm->id)
-+                      otg_set_state(fsm, OTG_STATE_B_IDLE);
-+              else if (!fsm->a_bus_drop && (fsm->a_bus_req || fsm->a_srp_det))
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE);
-+              break;
-+      case OTG_STATE_A_WAIT_VRISE:
-+              if (fsm->id || fsm->a_bus_drop || fsm->a_vbus_vld ||
-+                  fsm->a_wait_vrise_tmout) {
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
-+              }
-+              break;
-+      case OTG_STATE_A_WAIT_BCON:
-+              if (!fsm->a_vbus_vld)
-+                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
-+              else if (fsm->id | fsm->a_bus_drop | fsm->a_wait_bcon_tmout)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
-+              else if (fsm->b_conn)
-+                      otg_set_state(fsm, OTG_STATE_A_HOST);
-+              break;
-+      case OTG_STATE_A_HOST:
-+              if ((!fsm->a_bus_req || fsm->a_suspend_req) &&
-+                  fsm->transceiver->host->b_hnp_enable)
-+                      otg_set_state(fsm, OTG_STATE_A_SUSPEND);
-+              else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
-+              else if (!fsm->a_vbus_vld)
-+                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
-+              break;
-+      case OTG_STATE_A_SUSPEND:
-+              if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable)
-+                      otg_set_state(fsm, OTG_STATE_A_PERIPHERAL);
-+              else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
-+              else if (fsm->a_bus_req || fsm->b_bus_resume)
-+                      otg_set_state(fsm, OTG_STATE_A_HOST);
-+              else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
-+              else if (!fsm->a_vbus_vld)
-+                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
-+              break;
-+      case OTG_STATE_A_PERIPHERAL:
-+              if (fsm->id || fsm->a_bus_drop)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
-+              else if (fsm->b_bus_suspend)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
-+              else if (!fsm->a_vbus_vld)
-+                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
-+              break;
-+      case OTG_STATE_A_WAIT_VFALL:
-+              if (fsm->id || fsm->a_bus_req || (!fsm->a_sess_vld &&
-+                                                !fsm->b_conn))
-+                      otg_set_state(fsm, OTG_STATE_A_IDLE);
-+              break;
-+      case OTG_STATE_A_VBUS_ERR:
-+              if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err)
-+                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
-+              break;
-+      default:
-+              break;
-+      }
-+      spin_unlock_irqrestore(&fsm->lock, flags);
-+
-+      return state_changed;
-+}
-+EXPORT_SYMBOL(otg_statemachine);
---- /dev/null
-+++ b/drivers/usb/otg/otg_fsm.h
-@@ -0,0 +1,170 @@
-+/* Copyright (C) 2006-2007 Freescale Semiconductor, Inc.
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ *
-+ * You should have received a copy of the  GNU General Public License along
-+ * with this program; if not, write  to the Free Software Foundation, Inc.,
-+ * 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+
-+#ifndef OTG_FSM_H
-+#define OTG_FSM_H
-+
-+#if 0
-+#define DEBUG         1
-+#define VERBOSE       1
-+#endif
-+
-+#ifdef DEBUG
-+#define DBG(fmt, args...)     printk(KERN_DEBUG "[%s]  " fmt , \
-+                              __FUNCTION__, ## args)
-+#else
-+#define DBG(fmt, args...)     do {} while (0)
-+#endif
-+
-+#ifdef VERBOSE
-+#define VDBG          DBG
-+#else
-+#define VDBG(stuff...)        do {} while (0)
-+#endif
-+
-+#ifdef VERBOSE
-+#define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__)
-+#else
-+#define MPC_LOC do {} while (0)
-+#endif
-+
-+#define PROTO_UNDEF   0
-+#define PROTO_HOST    1
-+#define PROTO_GADGET  2
-+
-+
-+
-+
-+
-+/* OTG state machine according to the OTG spec */
-+struct otg_fsm {
-+      /* Input */
-+      int a_bus_resume;
-+      int a_bus_suspend;
-+      int a_conn;
-+      int a_sess_vld;
-+      int a_srp_det;
-+      int a_vbus_vld;
-+      int b_bus_resume;
-+      int b_bus_suspend;
-+      int b_conn;
-+      int b_se0_srp;
-+      int b_sess_end;
-+      int b_sess_vld;
-+      int id;
-+
-+      /* Internal variables */
-+      int a_set_b_hnp_en;
-+      int b_srp_done;
-+      int b_hnp_enable;
-+
-+      /* Timeout indicator for timers */
-+      int a_wait_vrise_tmout;
-+      int a_wait_bcon_tmout;
-+      int a_aidl_bdis_tmout;
-+      int b_ase0_brst_tmout;
-+
-+      /* Informative variables */
-+      int a_bus_drop;
-+      int a_bus_req;
-+      int a_clr_err;
-+      int a_suspend_req;
-+      int b_bus_req;
-+
-+      /* Output */
-+      int drv_vbus;
-+      int loc_conn;
-+      int loc_sof;
-+
-+      struct otg_fsm_ops *ops;
-+      struct otg_transceiver *transceiver;
-+
-+      void *a_wait_vrise_tmr;
-+      void *a_wait_bcon_tmr;
-+      void *a_aidl_bdis_tmr;
-+      void *b_ase0_brst_tmr;
-+      void *b_se0_srp_tmr;
-+      void *b_srp_fail_tmr;
-+      void *a_wait_enum_tmr;
-+
-+      /* Current usb protocol used: 0:undefine; 1:host; 2:client */
-+      int protocol;
-+      spinlock_t lock;                /* fsm lock */
-+};
-+
-+struct otg_fsm_ops {
-+      void    (*chrg_vbus)(int on);
-+      void    (*drv_vbus)(int on);
-+      void    (*loc_conn)(int on);
-+      void    (*loc_sof)(int on);
-+      void    (*start_pulse)(void);
-+      void    (*add_timer)(void *timer);
-+      void    (*del_timer)(void *timer);
-+      int     (*start_host)(struct otg_fsm *fsm, int on);
-+      int     (*start_gadget)(struct otg_fsm *fsm, int on);
-+};
-+
-+
-+static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on)
-+{
-+      fsm->ops->chrg_vbus(on);
-+}
-+
-+static inline void otg_drv_vbus(struct otg_fsm *fsm, int on)
-+{
-+      if (fsm->drv_vbus != on) {
-+              fsm->drv_vbus = on;
-+              fsm->ops->drv_vbus(on);
-+      }
-+}
-+
-+static inline void otg_loc_conn(struct otg_fsm *fsm, int on)
-+{
-+      if (fsm->loc_conn != on) {
-+              fsm->loc_conn = on;
-+              fsm->ops->loc_conn(on);
-+      }
-+}
-+
-+static inline void otg_loc_sof(struct otg_fsm *fsm, int on)
-+{
-+      if (fsm->loc_sof != on) {
-+              fsm->loc_sof = on;
-+              fsm->ops->loc_sof(on);
-+      }
-+}
-+
-+static inline void otg_start_pulse(struct otg_fsm *fsm)
-+{
-+      fsm->ops->start_pulse();
-+}
-+
-+static inline void otg_add_timer(struct otg_fsm *fsm, void *timer)
-+{
-+      fsm->ops->add_timer(timer);
-+}
-+
-+static inline void otg_del_timer(struct otg_fsm *fsm, void *timer)
-+{
-+      fsm->ops->del_timer(timer);
-+}
-+
-+extern int otg_statemachine(struct otg_fsm *fsm);
-+
-+extern const char *state_string(enum usb_otg_state state);
-+
-+#endif
---- a/drivers/video/cfbimgblt.c
-+++ b/drivers/video/cfbimgblt.c
-@@ -44,12 +44,12 @@
- #endif
- static const u32 cfb_tab8[] = {
--#if defined(__BIG_ENDIAN)
-+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
-     0x00000000,0x000000ff,0x0000ff00,0x0000ffff,
-     0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff,
-     0xff000000,0xff0000ff,0xff00ff00,0xff00ffff,
-     0xffff0000,0xffff00ff,0xffffff00,0xffffffff
--#elif defined(__LITTLE_ENDIAN)
-+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
-     0x00000000,0xff000000,0x00ff0000,0xffff0000,
-     0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00,
-     0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff,
-@@ -60,9 +60,9 @@ static const u32 cfb_tab8[] = {
- };
- static const u32 cfb_tab16[] = {
--#if defined(__BIG_ENDIAN)
-+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
-     0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff
--#elif defined(__LITTLE_ENDIAN)
-+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
-     0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff
- #else
- #error FIXME: No endianness??
---- a/drivers/video/console/bitblit.c
-+++ b/drivers/video/console/bitblit.c
-@@ -78,7 +78,11 @@ static inline void bit_putcs_aligned(str
-                                    u32 d_pitch, u32 s_pitch, u32 cellsize,
-                                    struct fb_image *image, u8 *buf, u8 *dst)
- {
-+#ifndef CONFIG_COLDFIRE
-       u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+        u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
-       u32 idx = vc->vc_font.width >> 3;
-       u8 *src;
-@@ -111,7 +115,11 @@ static inline void bit_putcs_unaligned(s
-                                      struct fb_image *image, u8 *buf,
-                                      u8 *dst)
- {
-+#ifndef CONFIG_COLDFIRE
-       u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+        u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
-       u32 shift_low = 0, mod = vc->vc_font.width % 8;
-       u32 shift_high = 8;
-       u32 idx = vc->vc_font.width >> 3;
-@@ -238,7 +246,11 @@ static void bit_cursor(struct vc_data *v
- {
-       struct fb_cursor cursor;
-       struct fbcon_ops *ops = info->fbcon_par;
-+#ifndef CONFIG_COLDFIRE
-       unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+        unsigned long charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
-       int w = (vc->vc_font.width + 7) >> 3, c;
-       int y = real_y(ops->p, vc->vc_y);
-       int attribute, use_sw = (vc->vc_cursor_type & 0x10);
---- a/drivers/video/console/fbcon.c
-+++ b/drivers/video/console/fbcon.c
-@@ -2679,8 +2679,11 @@ static int fbcon_set_palette(struct vc_d
- {
-       struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
-       int i, j, k, depth;
--      u8 val;
--
-+#ifndef CONFIG_COLDFIRE
-+        u8 val;
-+#else
-+        u32 val;
-+#endif
-       if (fbcon_is_inactive(vc, info))
-               return -EINVAL;
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -201,6 +201,16 @@ config FB_TILEBLITTING
- comment "Frame buffer hardware drivers"
-       depends on FB
-+config FB_SMI
-+      tristate "SiliconMotion Lynx support"
-+      depends on FB && PCI
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      ---help---
-+        This enables support for the Silicon Motion Lynx family of graphic
-+        chips. It has been tested on ColdFire.
-+
- config FB_CIRRUS
-       tristate "Cirrus Logic support"
-       depends on FB && (ZORRO || PCI)
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -28,6 +28,7 @@ obj-$(CONFIG_FB_DDC)           += fb_ddc
- obj-$(CONFIG_FB_DEFERRED_IO)   += fb_defio.o
- # Hardware specific drivers go first
-+obj-$(CONFIG_FB_SMI)              += smifb.o
- obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p.o
- obj-$(CONFIG_FB_ARC)              += arcfb.o
- obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o
---- /dev/null
-+++ b/drivers/video/smifb.c
-@@ -0,0 +1,949 @@
-+/***************************************************************************
-+        smifb.c  -  Silicon Motion, Inc. LynxEM+ frame buffer device
-+                             -------------------
-+    begin                : Thu Aug 9 2001
-+    copyright            : (C) 2001 by Szu-Tao Huang
-+    email                : johuang@siliconmotion.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ *                                                                         *
-+ *   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/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/tty.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/fb.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+
-+#include "console/fbcon.h"
-+
-+/*
-+#include <video/fbcon.h>
-+#include <video/fbcon-cfb8.h>
-+#include <video/fbcon-cfb16.h>
-+#include <video/fbcon-cfb24.h>
-+*/
-+
-+#include <linux/fb.h>
-+
-+static char *SMIRegs;         // point to virtual Memory Map IO starting address
-+static char *SMILFB;          // point to virtual video memory starting address
-+static struct par_info hw;    // used to record hardware information
-+
-+#include "smifb.h"
-+
-+struct ModeInit VGAMode[numVGAModes] =
-+{
-+      {
-+              /*  mode#0: 640 x 480  8Bpp  60Hz */
-+              640, 480, 8, 60,
-+              /*  Init_MISC */
-+              0xE3,
-+              {   /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x00, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+              },
-+      },
-+      {
-+              /*  mode#1: 640 x 480  16Bpp  60Hz */
-+              640, 480, 16, 60,
-+              /*  Init_MISC */
-+              0xE3,
-+              {   /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x00, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+              },
-+      },
-+      {
-+              /*  mode#2: 640 x 480  24Bpp  60Hz */
-+              640, 480, 24, 60,
-+              /*  Init_MISC */
-+              0xE3,
-+              {   /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x00, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+              },
-+      },
-+      {/*  mode#3: 800 x 600  8Bpp  60Hz */
-+              800,600,8,60,
-+              0x2B,   /*  Init_MISC */
-+              {       /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x03, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+                      0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+                      0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+                      0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+                      0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0xFF, 0x87, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+                      0x90, 0x01, 0x2C, 0x01, 0xFF, 0x00, 0x24, 0x24,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+              },
-+      },
-+      {/*  mode#4: 800 x 600  16Bpp  60Hz */
-+              800, 600, 16, 60,
-+              /*  Init_MISC */
-+              0x2B,
-+              {   /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x03, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+                      0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+                      0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+                      0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+                      0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+                      0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+              },
-+      },
-+              {/*  mode#5: 800 x 600  24Bpp  60Hz */
-+              800,600,24,60,
-+              0x2B,
-+              {   /*  Init_SR0_SR4 */
-+                      0x03, 0x01, 0x0F, 0x03, 0x0E,
-+              },
-+              {   /*  Init_SR10_SR24 */
-+                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0xC4, 0x30, 0x02, 0x01, 0x01,
-+              },
-+              {   /*  Init_SR30_SR75 */
-+                      0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,
-+                      0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,
-+                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,
-+                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+                      0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,
-+                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+                      0x02, 0x45, 0x30, 0x30, 0x40, 0x20,
-+              },
-+              {   /*  Init_SR80_SR93 */
-+                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,
-+                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,
-+                      0x00, 0x00, 0x00, 0x00,
-+              },
-+              {   /*  Init_SRA0_SRAF */
-+                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+              },
-+              {   /*  Init_GR00_GR08 */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+                      0xFF,
-+              },
-+              {   /*  Init_AR00_AR14 */
-+                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+                      0x41, 0x00, 0x0F, 0x00, 0x00,
-+              },
-+              {   /*  Init_CR00_CR18 */
-+                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+                      0xFF,
-+              },
-+              {   /*  Init_CR30_CR4D */
-+                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+              },
-+              {   /*  Init_CR90_CRA7 */
-+                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+              },
-+      },
-+};
-+
-+static void smi_set_timing(struct smifb_info *sfb,struct par_info *hw)
-+{
-+      int i=0,j=0;
-+        u32 m_nScreenStride;
-+
-+
-+    for (j=0;j < numVGAModes;j++) {
-+              if (VGAMode[j].mmSizeX == hw->width &&
-+                      VGAMode[j].mmSizeY == hw->height &&
-+                      VGAMode[j].bpp == sfb->fb.var.bits_per_pixel &&
-+                      VGAMode[j].hz == hw->hz)
-+              {
-+                      
-+                      smi_mmiowb(0x0,0x3c6);
-+
-+                      smi_seqw(0,0x1);
-+
-+                      smi_mmiowb(VGAMode[j].Init_MISC,0x3c2);
-+
-+                      for (i=0;i<SIZE_SR00_SR04;i++)  // init SEQ register SR00 - SR04
-+                      {
-+                              smi_seqw(i,VGAMode[j].Init_SR00_SR04[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_SR10_SR24;i++)  // init SEQ register SR10 - SR24
-+                      {
-+                              smi_seqw(i+0x10,VGAMode[j].Init_SR10_SR24[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_SR30_SR75;i++)  // init SEQ register SR30 - SR75
-+                      {
-+                              if (((i+0x30) != 0x62) && ((i+0x30) != 0x6a) && ((i+0x30) != 0x6b))
-+                                      smi_seqw(i+0x30,VGAMode[j].Init_SR30_SR75[i]);
-+                      }
-+                      for (i=0;i<SIZE_SR80_SR93;i++)  // init SEQ register SR80 - SR93
-+                      {
-+                              smi_seqw(i+0x80,VGAMode[j].Init_SR80_SR93[i]);
-+                      }
-+                      for (i=0;i<SIZE_SRA0_SRAF;i++)  // init SEQ register SRA0 - SRAF
-+                      {
-+                              smi_seqw(i+0xa0,VGAMode[j].Init_SRA0_SRAF[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_GR00_GR08;i++)  // init Graphic register GR00 - GR08
-+                      {
-+                              smi_grphw(i,VGAMode[j].Init_GR00_GR08[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_AR00_AR14;i++)  // init Attribute register AR00 - AR14
-+                      {
-+
-+                              smi_attrw(i,VGAMode[j].Init_AR00_AR14[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_CR00_CR18;i++)  // init CRTC register CR00 - CR18
-+                      {
-+                              smi_crtcw(i,VGAMode[j].Init_CR00_CR18[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_CR30_CR4D;i++)  // init CRTC register CR30 - CR4D
-+                      {
-+                              smi_crtcw(i+0x30,VGAMode[j].Init_CR30_CR4D[i]);
-+                      }
-+
-+                      for (i=0;i<SIZE_CR90_CRA7;i++)  // init CRTC register CR90 - CRA7
-+                      {
-+                              smi_crtcw(i+0x90,VGAMode[j].Init_CR90_CRA7[i]);
-+                      }
-+              }
-+      }
-+      smi_mmiowb(0x67,0x3c2);
-+      // set VPR registers
-+      writel(0x0,hw->m_pVPR+0x0C);
-+      writel(0x0,hw->m_pVPR+0x40);
-+      // set data width
-+      m_nScreenStride = (hw->width * sfb->fb.var.bits_per_pixel) / 64;
-+      switch (sfb->fb.var.bits_per_pixel)
-+      {
-+              case 8:
-+                      writel(0x0,hw->m_pVPR+0x0);
-+                      break;
-+              case 16:
-+                      writel(0x00020000,hw->m_pVPR+0x0);
-+                      break;
-+              case 24:
-+                      writel(0x00040000,hw->m_pVPR+0x0);
-+                      break;
-+      }
-+      writel((u32)(((m_nScreenStride + 2) << 16) | m_nScreenStride),hw->m_pVPR+0x10);
-+}
-+
-+/*
-+ * Set the color palette
-+ */
-+static int
-+smifb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-+                 u_int trans, struct fb_info *info)
-+{
-+      
-+      struct smifb_info *sfb = (struct smifbinfo *)info;
-+      u32 *pal;
-+
-+      switch (sfb->fb.fix.visual) {
-+      case FB_VISUAL_TRUECOLOR:               /* RGB 5:6:5 True Colour */
-+              pal = sfb->fb.pseudo_palette;   // System has 16 default color
-+              if (regno >= 16)
-+                      return 1;
-+
-+              pal[regno] = (red & 0xf800) |
-+                  ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
-+              break;
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ *  smifb_decode_var():
-+ *    Get the video params out of 'var'. If a value doesn't fit, round it up,
-+ *    if it's too big, return -EINVAL.
-+ *
-+ *    Suggestion: Round up in the following order: bits_per_pixel, xres,
-+ *    yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale,
-+ *    bitfields, horizontal timing, vertical timing.
-+ */
-+static int smifb_decode_var(struct fb_var_screeninfo *var, struct smifb_info *sfb, struct par_info *hw)
-+{
-+    hw->width = var->xres;
-+    hw->height = var->yres;
-+    hw->hz = 60;
-+
-+      return 0;
-+}
-+
-+static int smifb_set_par (struct fb_info *info)
-+{
-+      struct smifb_info *sfb = (struct smifb_info *)info;
-+      int err, chgvar = 0;
-+      struct fb_var_screeninfo *var = &info->var;
-+      struct fb_cmap *cmap;
-+
-+
-+      /*
-+       * Decode var contents into a par structure, adjusting any
-+       * out of range values.
-+       */
-+      err = smifb_decode_var(var, sfb, &hw);
-+      if (err) {
-+              return err;
-+      }
-+
-+      if (hw.width != var->xres)
-+              chgvar = 1;
-+      if (hw.height != var->yres)
-+              chgvar = 1;
-+
-+      var->activate           &= ~FB_ACTIVATE_ALL;
-+
-+      smi_set_timing(sfb, &hw);
-+
-+      sfb->palette_size = var->bits_per_pixel == 8 ? 256 : 16;
-+      cmap = fb_default_cmap(sfb->palette_size);
-+      fb_set_cmap(cmap, &sfb->fb);
-+
-+      return 0;
-+}
-+
-+static int smifb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
-+{
-+      var->bits_per_pixel += 7;
-+      var->bits_per_pixel &= ~7;
-+
-+      var->xres_virtual =
-+          var->xres_virtual < var->xres ? var->xres : var->xres_virtual;
-+      var->yres_virtual =
-+          var->yres_virtual < var->yres ? var->yres : var->yres_virtual;
-+
-+      switch (var->bits_per_pixel) {
-+      case 8:
-+      case 16:                /* RGB 565 */
-+    case 24:
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      switch (var->bits_per_pixel) {
-+      case 16:
-+              var->red.offset = 11;
-+              var->red.length = 5;
-+              var->green.offset       = 5;
-+              var->green.length       = 6;
-+              var->blue.offset        = 0;
-+              var->blue.length        = 5;
-+
-+              info->fix.visual                = FB_VISUAL_TRUECOLOR;
-+              info->fix.line_length= var->xres * 2;
-+
-+              break;
-+      default:
-+              return -EINVAL; /* We don't support anything other than 16bpp for now. --NL */
-+              break;
-+      }
-+      return 0;
-+
-+//    smifb_set_color_bitfields(var);
-+
-+    return 0;
-+}
-+
-+/*
-+ * Formal definition of the VESA spec:
-+ *  On
-+ *    This refers to the state of the display when it is in full operation
-+ *  Stand-By
-+ *    This defines an optional operating state of minimal power reduction with
-+ *    the shortest recovery time
-+ *  Suspend
-+ *    This refers to a level of power management in which substantial power
-+ *    reduction is achieved by the display.  The display can have a longer
-+ *    recovery time from this state than from the Stand-by state
-+ *  Off
-+ *    This indicates that the display is consuming the lowest level of power
-+ *    and is non-operational. Recovery from this state may optionally require
-+ *    the user to manually power on the monitor
-+ *
-+ *  Now, the fbdev driver adds an additional state, (blank), where they
-+ *  turn off the video (maybe by colormap tricks), but don't mess with the
-+ *  video itself: think of it semantically between on and Stand-By.
-+ *
-+ *  So here's what we should do in our fbdev blank routine:
-+ *
-+ *    VESA_NO_BLANKING (mode 0)       Video on,  front/back light on
-+ *    VESA_VSYNC_SUSPEND (mode 1)     Video on,  front/back light off
-+ *    VESA_HSYNC_SUSPEND (mode 2)     Video on,  front/back light off
-+ *    VESA_POWERDOWN (mode 3)         Video off, front/back light off
-+ *
-+ *  This will match the matrox implementation.
-+ */
-+/*
-+ * smifb_blank():
-+ *    Blank the display by setting all palette values to zero.  Note, the
-+ *    12 and 16 bpp modes don't really use the palette, so this will not
-+ *      blank the display in all modes.
-+ */
-+static int smifb_blank(int blank, struct fb_info *info)
-+{
-+//    struct smifb_info *sfb = (struct smifb_info *)info;
-+#if 0
-+      switch (blank) {
-+      case VESA_POWERDOWN:
-+      case VESA_VSYNC_SUSPEND:
-+      case VESA_HSYNC_SUSPEND:
-+      case VESA_NO_BLANKING:
-+      }
-+#endif
-+      return 1;
-+}
-+
-+static struct fb_ops smifb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_check_var   = smifb_check_var,
-+      .fb_set_par     = smifb_set_par,
-+      .fb_setcolreg   = smifb_setcolreg,
-+      .fb_blank       = smifb_blank,
-+      
-+      /* Accelerated functions, using softversions, per se */
-+      .fb_fillrect    = cfb_fillrect,
-+      .fb_copyarea    = cfb_copyarea,
-+      .fb_imageblit   = cfb_imageblit,
-+      .fb_cursor      = soft_cursor,
-+};
-+
-+/*
-+ * Alloc struct smifb_info and assign the default value
-+ */
-+static struct smifb_info * __devinit
-+smi_alloc_fb_info(struct pci_dev *dev, char *name)
-+{
-+    struct smifb_info *sfb;
-+
-+    sfb = kmalloc(sizeof(struct smifb_info) + sizeof(u32) * 16, GFP_KERNEL);
-+
-+    if (!sfb)
-+        return NULL;
-+
-+    memset(sfb, 0, sizeof(struct smifb_info));
-+
-+    sfb->currcon        = -1;
-+    sfb->dev            = dev;
-+
-+    strcpy(sfb->fb.fix.id, name);
-+
-+    sfb->fb.fix.type          = FB_TYPE_PACKED_PIXELS;
-+    sfb->fb.fix.type_aux      = 0;
-+    sfb->fb.fix.xpanstep      = 0;
-+    sfb->fb.fix.ypanstep      = 0;
-+    sfb->fb.fix.ywrapstep     = 0;
-+    sfb->fb.fix.accel         = FB_ACCEL_NONE;
-+
-+    sfb->fb.var.nonstd                = 0;
-+    sfb->fb.var.activate      = FB_ACTIVATE_NOW;
-+    sfb->fb.var.height                = -1;
-+    sfb->fb.var.width         = -1;
-+    sfb->fb.var.accel_flags   = 0;
-+    sfb->fb.var.vmode         = FB_VMODE_NONINTERLACED;
-+
-+    sfb->fb.fbops             = &smifb_ops;
-+    sfb->fb.flags             = FBINFO_FLAG_DEFAULT;
-+    sfb->fb.node              = -1;
-+    sfb->fb.pseudo_palette    = (void *)(&sfb->palette_size + 1);
-+
-+    return sfb;
-+}
-+
-+/*
-+ * Unmap in the memory mapped IO registers
-+ *
-+ */
-+
-+static void __devinit
-+smi_unmap_mmio(struct smifb_info *sfb)
-+{
-+    if (sfb && SMILFB)
-+    {
-+        iounmap(SMILFB);
-+        SMIRegs = NULL;
-+    }
-+}
-+
-+/*
-+ * Map in the screen memory
-+ *
-+ */
-+static int __devinit
-+smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len)
-+{
-+
-+    sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
-+    sfb->fb.fix.smem_len  = smem_len;
-+    printk("%s:smem %x,len %x\n",sfb->fb.fix.smem_start,sfb->fb.fix.smem_len);
-+    sfb->fb.screen_base = SMILFB;
-+
-+    if (!sfb->fb.screen_base)
-+    {
-+        printk("%s: unable to map screen memory\n",sfb->fb.fix.id);
-+        return -ENOMEM;
-+    }
-+
-+    return 0;
-+}
-+
-+
-+/*
-+ * Unmap in the screen memory
-+ *
-+ */
-+static void __devinit
-+smi_unmap_smem(struct smifb_info *sfb)
-+{
-+    if (sfb && sfb->fb.screen_base)
-+    {
-+        iounmap(sfb->fb.screen_base);
-+        sfb->fb.screen_base = NULL;
-+    }
-+}
-+
-+/*
-+ * We need to wake up the LynxEM+, and make sure its in linear memory mode.
-+ */
-+static inline void __devinit
-+smi_init_hw(void)
-+{
-+      /* The delays prevent the ColdFire PCI host from locking up. :/ --NL */
-+      udelay(1000);
-+    outb(0x18, 0x3c4);
-+      udelay(1000);
-+    outb(0x11, 0x3c5);
-+      udelay(1000);
-+      printk("%s: 0x3c4 =%x 0x3c5 %x\n",__FUNCTION__,inw(0x3c4),inw(0x3c5));
-+}
-+
-+static void __devinit
-+smi_free_fb_info(struct smifb_info *sfb)
-+{
-+      if (sfb) {
-+              fb_alloc_cmap(&sfb->fb.cmap, 0, 0);
-+              kfree(sfb);
-+      }
-+}
-+
-+
-+u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720};
-+
-+int __init smifb_init(struct pci_dev *pdev, const struct pci_device_id *ent)
-+{
-+    struct smifb_info *sfb;
-+    u_long smem_size;
-+    char name[16];
-+    int err;
-+      char *m_pLAW;
-+      ulong m_pLAWPhysical;
-+
-+    printk("%s start\n",__FUNCTION__);
-+    sprintf(name, "smifb");
-+
-+    hw.chipID = pdev->device;
-+    
-+    err = -ENOMEM;
-+    sfb = smi_alloc_fb_info(pdev, name);
-+    if (!sfb) {
-+        goto failed;
-+    }
-+
-+    smi_init_hw();
-+
-+      // Map address and memory detection
-+      m_pLAWPhysical = pci_resource_start(pdev,0);
-+      printk("%s:m_pLAWPhysical %x,hw.chipID %x\n",__FUNCTION__,m_pLAWPhysical,hw.chipID);
-+      switch (hw.chipID) {
-+              case 0x710:
-+              case 0x712:
-+                      sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000;
-+                      sfb->fb.fix.mmio_len   = 0x00100000;
-+
-+              hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000);
-+              printk("%s:SMILFB%x\n",__FUNCTION__,SMILFB);
-+              hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000;
-+                      hw.m_pDPR = hw.m_pLFB + 0x00408000;
-+                      hw.m_pVPR = hw.m_pLFB + 0x0040c000;
-+
-+              if (!SMIRegs)
-+              {
-+                      printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id);
-+                      return -ENOMEM;
-+              }
-+
-+                      smi_seqw(0x62,0x7A);
-+              smi_seqw(0x6a,0x0c);
-+              smi_seqw(0x6b,0x02);
-+              smem_size = 0x00400000;
-+
-+              //LynxEM+ memory dection
-+              *(u32 *)(SMILFB + 4) = 0xAA551133;
-+              if (*(u32 *)(SMILFB + 4) != 0xAA551133)
-+              {
-+                      smem_size = 0x00200000;
-+                      // Program the MCLK to 130 MHz
-+                      smi_seqw(0x6a,0x12);
-+                      smi_seqw(0x6b,0x02);
-+                      smi_seqw(0x62,0x3e);
-+              }
-+                      break;
-+              case 0x720:
-+                      sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000;
-+                      sfb->fb.fix.mmio_len   = 0x00040000;
-+
-+                      m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000);
-+                      hw.m_pLFB = SMILFB = m_pLAW + 0x00200000;
-+                      hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000;
-+                      hw.m_pDPR = m_pLAW;
-+                      hw.m_pVPR = m_pLAW + 0x800;
-+
-+                      smi_seqw(0x62,0xff);
-+                      smi_seqw(0x6a,0x0d);
-+                      smi_seqw(0x6b,0x02);
-+                      smem_size = 0x00400000;
-+
-+                      break;
-+      }
-+
-+      sfb->fb.var.xres = 640;
-+      sfb->fb.var.yres = 480;
-+      sfb->fb.var.bits_per_pixel = 16;
-+
-+      sfb->fb.var.xres_virtual = sfb->fb.var.xres;
-+
-+      sfb->fb.var.yres_virtual = sfb->fb.var.yres;
-+      
-+      sfb->fb.flags = FBINFO_FLAG_DEFAULT;
-+
-+      printk("%s:smem_size %x\n",__FUNCTION__,smem_size);
-+    err = smi_map_smem(sfb, pdev, smem_size);
-+      printk("%s:smi_map_smem error %x\n",__FUNCTION__,err);
-+    if (err) {
-+              goto failed;
-+    }
-+
-+
-+
-+      fb_set_var(&sfb->fb, &sfb->fb.var);
-+      smifb_check_var(&sfb->fb.var, &sfb->fb);
-+      smifb_set_par(sfb);
-+      printk("%s:register_framebuffer \n",__FUNCTION__);
-+      err = register_framebuffer(&sfb->fb);
-+      if (err < 0) {
-+              goto failed;
-+    }
-+
-+      printk("Silicon Motion, Inc. LynxEM+ Init complete.\n");
-+
-+      return 0;
-+
-+failed:
-+      smi_unmap_smem(sfb);
-+      smi_unmap_mmio(sfb);
-+      smi_free_fb_info(sfb);
-+      printk("Silicon Motion, Inc. LynxEM+ Init FAILED.n");
-+
-+      return err;
-+}
-+
-+struct pci_device_id smifb_pci_tbl[] = {
-+        { 0x126f, 0x710, PCI_ANY_ID, PCI_ANY_ID },
-+        { 0x126f, 0x712, PCI_ANY_ID, PCI_ANY_ID },
-+        { 0x126f, 0x720, PCI_ANY_ID, PCI_ANY_ID },
-+        { 0 }
-+};
-+
-+MODULE_DEVICE_TABLE(pci, smifb_pci_tbl);
-+
-+struct pci_driver smifb_driver = {
-+        .name =         "smifb",
-+        .id_table =     smifb_pci_tbl,
-+        .probe =        smifb_init,
-+};
-+
-+int __init smi_init(void)
-+{
-+      /*return pci_module_init(&smifb_driver);*/
-+      return pci_register_driver(&smifb_driver);
-+}
-+
-+module_init(smi_init);
-+MODULE_LICENSE("GPL");
-+
-+
-+
---- /dev/null
-+++ b/drivers/video/smifb.h
-@@ -0,0 +1,149 @@
-+/***************************************************************************
-+                      smifb.h  -  SiliconMotion LynxEM+ frame buffer device
-+                             -------------------
-+    begin                : Thu Aug 9 2001
-+    copyright            : (C) 2001 by Szu-Tao Huang
-+    email                : johuang@siliconmotion.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ *                                                                         *
-+ *   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.                                   *
-+ *                                                                         *
-+ ***************************************************************************/
-+
-+#define smi_mmiowb(dat,reg)   writeb(dat, SMIRegs + reg)
-+#define smi_mmioww(dat,reg)   writew(dat, SMIRegs + reg)
-+#define smi_mmiowl(dat,reg)   writel(dat, SMIRegs + reg)
-+
-+#define smi_mmiorb(reg)               readb(SMIRegs + reg)
-+#define smi_mmiorw(reg)               readw(SMIRegs + reg)
-+#define smi_mmiorl(reg)               readl(SMIRegs + reg)
-+
-+#define SIZE_SR00_SR04      (0x04 - 0x00 + 1)
-+#define SIZE_SR10_SR24      (0x24 - 0x10 + 1)
-+#define SIZE_SR30_SR75      (0x75 - 0x30 + 1)
-+#define SIZE_SR80_SR93      (0x93 - 0x80 + 1)
-+#define SIZE_SRA0_SRAF      (0xAF - 0xA0 + 1)
-+#define SIZE_GR00_GR08      (0x08 - 0x00 + 1)
-+#define SIZE_AR00_AR14      (0x14 - 0x00 + 1)
-+#define SIZE_CR00_CR18      (0x18 - 0x00 + 1)
-+#define SIZE_CR30_CR4D      (0x4D - 0x30 + 1)
-+#define SIZE_CR90_CRA7      (0xA7 - 0x90 + 1)
-+#define SIZE_VPR                        (0x6C + 1)
-+#define SIZE_DPR                      (0x44 + 1)
-+
-+#define numVGAModes                   6
-+#define numChipIDs                    3
-+
-+#define NR_PALETTE    256
-+#define NR_RGB          2
-+
-+/*
-+ * Minimum X and Y resolutions
-+ */
-+#define MIN_XRES      640
-+#define MIN_YRES      480
-+
-+static inline void smi_crtcw(int reg, int val)
-+{
-+        smi_mmiowb(reg, 0x3d4);
-+        smi_mmiowb(val, 0x3d5);
-+}
-+
-+static inline unsigned int smi_crtcr(int reg)
-+{
-+        smi_mmiowb(reg, 0x3d4);
-+        return smi_mmiorb(0x3d5);
-+}
-+
-+static inline void smi_grphw(int reg, int val)
-+{
-+        smi_mmiowb(reg, 0x3ce);
-+        smi_mmiowb(val, 0x3cf);
-+}
-+
-+static inline unsigned int smi_grphr(int reg)
-+{
-+        smi_mmiowb(reg, 0x3ce);
-+        return smi_mmiorb(0x3cf);
-+}
-+
-+static inline void smi_attrw(int reg, int val)
-+{
-+        smi_mmiorb(0x3da);
-+        smi_mmiowb(reg, 0x3c0);
-+        smi_mmiorb(0x3c1);
-+        smi_mmiowb(val, 0x3c0);
-+}
-+
-+static inline void smi_seqw(int reg, int val)
-+{
-+        smi_mmiowb(reg, 0x3c4);
-+        smi_mmiowb(val, 0x3c5);
-+}
-+
-+static inline unsigned int smi_seqr(int reg)
-+{
-+        smi_mmiowb(reg, 0x3c4);
-+        return smi_mmiorb(0x3c5);
-+}
-+/*
-+* Private structure
-+*/
-+struct smifb_info {
-+        /*
-+        * The following is a pointer to be passed into the
-+        * functions below.  The modules outside the main
-+        * smifb.c driver have no knowledge as to what
-+        * is within this structure.
-+        */
-+        struct fb_info          fb;
-+        struct display_switch   *dispsw;
-+        struct pci_dev                *dev;
-+        signed int              currcon;
-+
-+        struct {
-+                u8 red, green, blue;
-+        } palette[NR_RGB];
-+
-+        u_int                   palette_size;
-+};
-+
-+struct par_info {
-+      /*
-+       * Hardware
-+       */
-+      u16             chipID;
-+      char    *m_pLFB;
-+      char    *m_pMMIO;
-+      char    *m_pDPR;
-+      char    *m_pVPR;
-+
-+      u_int   width;
-+      u_int   height;
-+      u_int   hz;
-+};
-+
-+// The next structure holds all information relevant for a specific video mode.
-+struct ModeInit
-+{
-+      int                       mmSizeX;
-+      int                       mmSizeY;
-+      int                       bpp;
-+      int                       hz;
-+      unsigned char Init_MISC;
-+      unsigned char Init_SR00_SR04[SIZE_SR00_SR04];
-+      unsigned char Init_SR10_SR24[SIZE_SR10_SR24];
-+      unsigned char Init_SR30_SR75[SIZE_SR30_SR75];
-+      unsigned char Init_SR80_SR93[SIZE_SR80_SR93];
-+      unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF];
-+      unsigned char Init_GR00_GR08[SIZE_GR00_GR08];
-+      unsigned char Init_AR00_AR14[SIZE_AR00_AR14];
-+      unsigned char Init_CR00_CR18[SIZE_CR00_CR18];
-+      unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D];
-+      unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7];
-+};
---- a/drivers/watchdog/Kconfig
-+++ b/drivers/watchdog/Kconfig
-@@ -672,6 +672,15 @@ config TXX9_WDT
- # PARISC Architecture
-+# ColdFire Architecture
-+
-+config COLDFIRE_WATCHDOG
-+      tristate "ColdFire watchdog support"
-+      depends on WATCHDOG
-+      help
-+        To compile this driver as a module, choose M here: the
-+        module will be called softdog.
-+
- # POWERPC Architecture
- config MPC5200_WDT
---- a/drivers/watchdog/Makefile
-+++ b/drivers/watchdog/Makefile
-@@ -86,6 +86,7 @@ obj-$(CONFIG_SBC_EPX_C3_WATCHDOG) += sbc
- # M32R Architecture
- # M68K Architecture
-+obj-$(CONFIG_COLDFIRE_WATCHDOG) += mcf_wdt.o
- # M68KNOMMU Architecture
---- /dev/null
-+++ b/drivers/watchdog/mcf_wdt.c
-@@ -0,0 +1,220 @@
-+/*
-+ * drivers/watchdog/mcf_wdt.c
-+ *
-+ * Watchdog driver for ColdFire processors
-+ *
-+ * Adapted from the IXP4xx watchdog driver.
-+ * The original version carries these notices:
-+ *
-+ * Author: Deepak Saxena <dsaxena@plexity.net>
-+ *
-+ * Copyright 2004 (c) MontaVista, Software, Inc.
-+ * Based on sa1100 driver, Copyright (C) 2000 Oleg Drokin <green@crimea.edu>
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/miscdevice.h>
-+#include <linux/watchdog.h>
-+#include <linux/init.h>
-+#include <linux/bitops.h>
-+
-+#include <asm-m68k/uaccess.h>
-+#include <asm-m68k/coldfire.h>
-+#include <asm-m68k/m5485gpt.h>
-+
-+static int nowayout;
-+static unsigned int heartbeat = 30;   /* (secs) Default is 0.5 minute */
-+static unsigned long wdt_status;
-+
-+#define       WDT_IN_USE              0
-+#define       WDT_OK_TO_CLOSE         1
-+
-+static unsigned long wdt_tick_rate;
-+
-+static void
-+wdt_enable(void)
-+{
-+      MCF_GPT_GMS0 = 0;
-+      MCF_GPT_GCIR0 =  MCF_GPT_GCIR_PRE(heartbeat*wdt_tick_rate) |
-+                              MCF_GPT_GCIR_CNT(0xffff);
-+      MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS_WDEN |
-+                              MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS_GPIO;
-+}
-+
-+static void
-+wdt_disable(void)
-+{
-+      MCF_GPT_GMS0 = 0;
-+}
-+
-+static void
-+wdt_keepalive(void)
-+{
-+      MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS0;
-+}
-+
-+static int
-+mcf_wdt_open(struct inode *inode, struct file *file)
-+{
-+      if (test_and_set_bit(WDT_IN_USE, &wdt_status))
-+              return -EBUSY;
-+
-+      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+      wdt_enable();
-+
-+      return nonseekable_open(inode, file);
-+}
-+
-+static ssize_t
-+mcf_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos)
-+{
-+      if (len) {
-+              if (!nowayout) {
-+                      size_t i;
-+
-+                      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+                      for (i = 0; i != len; i++) {
-+                              char c;
-+
-+                              if (get_user(c, data + i))
-+                                      return -EFAULT;
-+                              if (c == 'V')
-+                                      set_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+                      }
-+              }
-+              wdt_keepalive();
-+      }
-+
-+      return len;
-+}
-+
-+
-+static struct watchdog_info ident = {
-+      .options        = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT |
-+                              WDIOF_KEEPALIVEPING,
-+      .identity       = "Coldfire Watchdog",
-+};
-+
-+static int
-+mcf_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
-+                      unsigned long arg)
-+{
-+      int ret = -ENOIOCTLCMD;
-+      int time;
-+
-+      switch (cmd) {
-+      case WDIOC_GETSUPPORT:
-+              ret = copy_to_user((struct watchdog_info *)arg, &ident,
-+                                 sizeof(ident)) ? -EFAULT : 0;
-+              break;
-+
-+      case WDIOC_GETSTATUS:
-+              ret = put_user(0, (int *)arg);
-+              break;
-+
-+      case WDIOC_GETBOOTSTATUS:
-+              ret = put_user(0, (int *)arg);
-+              break;
-+
-+      case WDIOC_SETTIMEOUT:
-+              ret = get_user(time, (int *)arg);
-+              if (ret)
-+                      break;
-+
-+              if (time <= 0 || time > 30) {
-+                      ret = -EINVAL;
-+                      break;
-+              }
-+
-+              heartbeat = time;
-+              wdt_enable();
-+              /* Fall through */
-+
-+      case WDIOC_GETTIMEOUT:
-+              ret = put_user(heartbeat, (int *)arg);
-+              break;
-+
-+      case WDIOC_KEEPALIVE:
-+              wdt_keepalive();
-+              ret = 0;
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+static int
-+mcf_wdt_release(struct inode *inode, struct file *file)
-+{
-+      if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) {
-+              wdt_disable();
-+      } else {
-+              printk(KERN_CRIT "WATCHDOG: Device closed unexpectdly - "
-+                                      "timer will not stop\n");
-+      }
-+
-+      clear_bit(WDT_IN_USE, &wdt_status);
-+      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
-+
-+      return 0;
-+}
-+
-+
-+static struct file_operations mcf_wdt_fops = {
-+      .owner          = THIS_MODULE,
-+      .llseek         = no_llseek,
-+      .write          = mcf_wdt_write,
-+      .ioctl          = mcf_wdt_ioctl,
-+      .open           = mcf_wdt_open,
-+      .release        = mcf_wdt_release,
-+};
-+
-+static struct miscdevice mcf_wdt_miscdev = {
-+      .minor          = WATCHDOG_MINOR,
-+      .name           = "watchdog",
-+      .fops           = &mcf_wdt_fops,
-+};
-+
-+static int __init mcf_wdt_init(void)
-+{
-+      wdt_tick_rate = MCF_BUSCLK/0xffff;
-+#ifdef CONFIG_WATCHDOG_NOWAYOUT
-+      nowayout = 1;
-+#else
-+      nowayout = 0;
-+#endif
-+      printk("ColdFire watchdog driver is loaded.\n");
-+
-+      return misc_register(&mcf_wdt_miscdev);
-+}
-+
-+static void __exit mcf_wdt_exit(void)
-+{
-+      misc_deregister(&mcf_wdt_miscdev);
-+}
-+
-+module_init(mcf_wdt_init);
-+module_exit(mcf_wdt_exit);
-+
-+MODULE_AUTHOR("Deepak Saxena");
-+MODULE_DESCRIPTION("ColdFire Watchdog");
-+
-+module_param(heartbeat, int, 0);
-+MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds (default 60s)");
-+
-+module_param(nowayout, int, 0);
-+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
-+
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
-+
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -1364,7 +1364,11 @@ int copy_mount_options(const void __user
-       /* copy_from_user cannot cross TASK_SIZE ! */
-       size = TASK_SIZE - (unsigned long)data;
-       if (size > PAGE_SIZE)
-+#ifndef CONFIG_COLDFIRE
-               size = PAGE_SIZE;
-+#else
-+              size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK);
-+#endif
-       i = size - exact_copy_from_user((void *)page, data, size);
-       if (!i) {
---- /dev/null
-+++ b/include/asm-m68k/5445x_pci.h
-@@ -0,0 +1,94 @@
-+/*
-+ * asm-m68k/pci.h - m68k specific PCI declarations.
-+ *
-+ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
-+ *    Kurt Mahan <kmahan@freescale.com>
-+ */
-+#ifndef _ASM_M68K_5445X_PCI_H
-+#define _ASM_M68K_5445x_PCI_H
-+
-+#ifndef CONFIG_PCI
-+/*
-+ * The PCI address space does equal the physical memory
-+ * address space.  The networking and block device layers use
-+ * this boolean for bounce buffer decisions.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS           (1)
-+#else
-+#include <asm-generic/pci-dma-compat.h>
-+
-+/*
-+ * The PCI address space does equal the physical memory
-+ * address space.  The networking and block device layers use
-+ * this boolean for bounce buffer decisions.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS           (1)
-+
-+#define PCIBIOS_MIN_IO                        0x00004000
-+#define PCIBIOS_MIN_MEM                       0x02000000
-+
-+#define pcibios_assign_all_busses()   0
-+#define pcibios_scan_all_fns(a, b)    0
-+
-+static inline void
-+pcibios_set_master(struct pci_dev *dev)
-+{
-+      /* no special bus mastering setup handling */
-+}
-+
-+static inline void
-+pcibios_penalize_isa_irq(int irq, int active)
-+{
-+      /* no dynamic PCI IRQ allocation */
-+}
-+
-+#if 0
-+static inline void
-+pcibios_add_platform_entries(struct pci_dev *dev)
-+{
-+      /* no special handling */
-+}
-+#endif
-+
-+static inline void
-+pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
-+                       struct resource *res)
-+{
-+#ifdef CONFIG_M54455
-+      if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
-+              /* HACK!  FIX! kludge to fix bridge mapping */
-+              region->start = res->start & 0x0fffffff;
-+              region->end = res->end & 0x0fffffff;
-+      } else {
-+              region->start = res->start;
-+              region->end = res->end;
-+      }
-+#else
-+      region->start = res->start;
-+      region->end = res->end;
-+#endif
-+}
-+
-+static inline void
-+pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
-+                      struct pci_bus_region *region)
-+{
-+      res->start = region->start;
-+      res->end = region->end;
-+}
-+
-+static inline struct resource *
-+pcibios_select_root(struct pci_dev *pdev, struct resource *res)
-+{
-+      struct resource *root = NULL;
-+
-+      if (res->flags & IORESOURCE_IO)
-+              root = &ioport_resource;
-+      if (res->flags & IORESOURCE_MEM)
-+              root = &iomem_resource;
-+
-+      return root;
-+}
-+
-+#endif /* CONFIG_PCI */
-+#endif /* _ASM_M68K_5445X_PCI_H */
---- /dev/null
-+++ b/include/asm-m68k/548x_pci.h
-@@ -0,0 +1,99 @@
-+#ifndef _ASM_M68K_548X_PCI_H
-+#define _ASM_M68K_548X_PCI_H
-+
-+/*
-+ * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
-+ *
-+ * Written by Wout Klaren.
-+ */
-+#include <linux/mm.h>
-+#include <asm/scatterlist.h>
-+
-+#include <asm-generic/pci.h>
-+
-+struct pci_ops;
-+
-+/*
-+ * Structure with hardware dependent information and functions of the
-+ * PCI bus.
-+ */
-+
-+struct pci_bus_info
-+{
-+      /*
-+       * Resources of the PCI bus.
-+       */
-+
-+      struct resource mem_space;
-+      struct resource io_space;
-+
-+      /*
-+       * System dependent functions.
-+       */
-+
-+      struct pci_ops *m68k_pci_ops;
-+
-+      void (*fixup)(int pci_modify);
-+      void (*conf_device)(struct pci_dev *dev);
-+};
-+
-+#define pcibios_assign_all_busses()   0
-+#define pcibios_scan_all_fns(a, b)    0
-+
-+static inline void pcibios_set_master(struct pci_dev *dev)
-+{
-+      /* No special bus mastering setup handling */
-+}
-+
-+static inline void pcibios_penalize_isa_irq(int irq)
-+{
-+      /* We don't do dynamic PCI IRQ allocation */
-+}
-+
-+#ifndef CONFIG_COLDFIRE
-+/* The PCI address space does equal the physical memory
-+ * address space.  The networking and block device layers use
-+ * this boolean for bounce buffer decisions.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS   (1)
-+
-+#define PCIBIOS_MIN_IO                0x00004000
-+#define PCIBIOS_MIN_MEM       0x04000000
-+
-+#else /* !CONFIG_COLDFIRE */
-+#include <asm-generic/pci-dma-compat.h>
-+#define PCI_DMA_BASE          /*0x40000000*/0 /* PCI-DMA window base          */
-+
-+extern struct pci_bus_info *__init init_coldfire_pci(void);
-+extern void * pci_alloc_son(struct pci_dev *, size_t,
-+                            dma_addr_t *, int);
-+/*
-+ * The PCI address space equal the virtual memory
-+ * address space on m547X/m548X.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS   (1)
-+
-+#define PCIBIOS_MIN_IO                0x00000100
-+#define PCIBIOS_MIN_MEM       0x02000000
-+
-+struct scatterlist;
-+
-+
-+/* This is always fine. */
-+#define pci_dac_dma_supported(pci_dev, mask)  (1)
-+
-+
-+/* These macros should be used after a pci_map_sg call has been done
-+ * to get bus addresses of each of the SG entries and their lengths.
-+ * You should only work with the number of sg entries pci_map_sg
-+ * returns.
-+ */
-+#define sg_dma_address(sg)    ((sg)->dma_address)
-+#define sg_dma_len(sg)                ((sg)->length)
-+
-+static inline void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align)
-+{
-+}
-+
-+#endif /* !CONFIG_COLDFIRE*/
-+#endif /* _ASM_M68K_548X_PCI_H */
---- a/include/asm-m68k/atomic.h
-+++ b/include/asm-m68k/atomic.h
-@@ -2,7 +2,7 @@
- #define __ARCH_M68K_ATOMIC__
--#include <asm/system.h>
-+#include <asm/system.h>       /* local_irq_XXX() */
- /*
-  * Atomic operations that C can't guarantee us.  Useful for
-@@ -21,12 +21,20 @@ typedef struct { int counter; } atomic_t
- static inline void atomic_add(int i, atomic_t *v)
- {
-+#ifndef CONFIG_COLDFIRE
-       __asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i));
-+#else
-+      __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
-+#endif
- }
- static inline void atomic_sub(int i, atomic_t *v)
- {
-+#ifndef CONFIG_COLDFIRE
-       __asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i));
-+#else
-+      __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
-+#endif
- }
- static inline void atomic_inc(atomic_t *v)
-@@ -46,6 +54,14 @@ static inline int atomic_dec_and_test(at
-       return c != 0;
- }
-+static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v)
-+{
-+      char c;
-+      __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v)
-+                           : "m" (*v));
-+      return c != 0 ;
-+}
-+
- static inline int atomic_inc_and_test(atomic_t *v)
- {
-       char c;
-@@ -156,7 +172,12 @@ static inline int atomic_sub_and_test(in
- static inline int atomic_add_negative(int i, atomic_t *v)
- {
-       char c;
-+#ifndef CONFIG_COLDFIRE
-       __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i));
-+#else
-+       __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v)
-+                            : "d" (i) , "m" (*v));
-+#endif
-       return c != 0;
- }
---- a/include/asm-m68k/auxvec.h
-+++ b/include/asm-m68k/auxvec.h
-@@ -1,4 +1,13 @@
- #ifndef __ASMm68k_AUXVEC_H
- #define __ASMm68k_AUXVEC_H
-+/*
-+ * Architecture-neutral AT_ values in 0-17, leave some room
-+ * for more of them.
-+ */
-+
-+#ifdef CONFIG_VSYSCALL
-+/* Entry point to the vsyscall page */
-+#define       AT_SYSINFO_EHDR         33
-+#endif
- #endif
---- a/include/asm-m68k/bitops.h
-+++ b/include/asm-m68k/bitops.h
-@@ -19,6 +19,7 @@
-  *
-  * They use the standard big-endian m680x0 bit ordering.
-  */
-+#ifndef CONFIG_COLDFIRE
- #define test_and_set_bit(nr,vaddr) \
-   (__builtin_constant_p(nr) ? \
-@@ -457,4 +458,503 @@ static inline int ext2_find_next_bit(con
- #endif /* __KERNEL__ */
-+#else /* CONFIG_COLDFIRE */
-+
-+#define test_and_set_bit(nr,vaddr)                    \
-+  (__builtin_constant_p(nr) ?                         \
-+   __constant_coldfire_test_and_set_bit(nr, vaddr) :  \
-+   __generic_coldfire_test_and_set_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ int __constant_coldfire_test_and_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+
-+      __asm__ __volatile__ ("bset %2,%1; sne %0"
-+           : "=d" (retval), "+QUd" (*p)
-+           : "di" (nr & 7));
-+      return retval;
-+}
-+#else
-+static __inline__ int __constant_coldfire_test_and_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bset %2,(%4); sne %0"
-+           : "=d" (retval), "=m" (*p)
-+           : "di" (nr & 7), "m" (*p), "a" (p));
-+      return retval;
-+}
-+#endif
-+
-+static __inline__ int __generic_coldfire_test_and_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+
-+      __asm__ __volatile__ ("bset %2,%1; sne %0"
-+           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "d" (nr)
-+           : "memory");
-+      return retval;
-+}
-+#define __test_and_set_bit(nr, vaddr) test_and_set_bit(nr, vaddr)
-+
-+#define set_bit(nr,vaddr)                     \
-+  (__builtin_constant_p(nr) ?                 \
-+   __constant_coldfire_set_bit(nr, vaddr) :   \
-+   __generic_coldfire_set_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ void __constant_coldfire_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bset %1,%0"
-+           : "+QUd" (*p) : "di" (nr & 7));
-+}
-+#else
-+static __inline__ void __constant_coldfire_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bset %1,(%3)"
-+           : "=m" (*p) : "di" (nr & 7), "m" (*p), "a" (p));
-+}
-+#endif
-+
-+static __inline__ void __generic_coldfire_set_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      __asm__ __volatile__ ("bset %1,%0"
-+           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "d" (nr)
-+           : "memory");
-+}
-+#define __set_bit(nr, vaddr) set_bit(nr, vaddr)
-+
-+#define test_and_clear_bit(nr, vaddr)                 \
-+  (__builtin_constant_p(nr) ?                         \
-+   __constant_coldfire_test_and_clear_bit(nr, vaddr) :        \
-+   __generic_coldfire_test_and_clear_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ int __constant_coldfire_test_and_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+
-+      __asm__ __volatile__ ("bclr %2,%1; sne %0"
-+           : "=d" (retval), "+QUd" (*p)
-+           : "id" (nr & 7));
-+
-+      return retval;
-+}
-+#else
-+static __inline__ int __constant_coldfire_test_and_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+
-+      __asm__ __volatile__ ("bclr %2,(%4); sne %0"
-+           : "=d" (retval), "=m" (*p)
-+           : "id" (nr & 7), "m" (*p), "a" (p));
-+
-+      return retval;
-+}
-+#endif
-+
-+static __inline__ int __generic_coldfire_test_and_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+
-+      __asm__ __volatile__ ("bclr %2,%1; sne %0"
-+           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "d" (nr & 7)
-+           : "memory");
-+
-+      return retval;
-+}
-+#define __test_and_clear_bit(nr, vaddr) test_and_clear_bit(nr, vaddr)
-+
-+/*
-+ * clear_bit() doesn't provide any barrier for the compiler.
-+ */
-+#define smp_mb__before_clear_bit()    barrier()
-+#define smp_mb__after_clear_bit()     barrier()
-+
-+#define clear_bit(nr,vaddr)                   \
-+  (__builtin_constant_p(nr) ?                 \
-+   __constant_coldfire_clear_bit(nr, vaddr) : \
-+   __generic_coldfire_clear_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ void __constant_coldfire_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bclr %1,%0"
-+           : "+QUd" (*p) : "id" (nr & 7));
-+}
-+#else
-+static __inline__ void __constant_coldfire_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bclr %1,(%3)"
-+           : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p));
-+}
-+#endif
-+
-+static __inline__ void __generic_coldfire_clear_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      __asm__ __volatile__ ("bclr %1,%0"
-+           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "d" (nr)
-+           : "memory");
-+}
-+#define __clear_bit(nr, vaddr) clear_bit(nr, vaddr)
-+
-+#define test_and_change_bit(nr, vaddr)                        \
-+  (__builtin_constant_p(nr) ?                         \
-+   __constant_coldfire_test_and_change_bit(nr, vaddr) :       \
-+   __generic_coldfire_test_and_change_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ int __constant_coldfire_test_and_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+
-+      __asm__ __volatile__ ("bchg %2,%1; sne %0"
-+           : "=d" (retval), "+QUd" (*p)
-+           : "id" (nr & 7));
-+
-+      return retval;
-+}
-+#else
-+static __inline__ int __constant_coldfire_test_and_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+
-+      __asm__ __volatile__ ("bchg %2,(%4); sne %0"
-+           : "=d" (retval), "=m" (*p)
-+           : "id" (nr & 7), "m" (*p), "a" (p));
-+
-+      return retval;
-+}
-+#endif
-+
-+static __inline__ int __generic_coldfire_test_and_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      char retval;
-+
-+      __asm__ __volatile__ ("bchg %2,%1; sne %0"
-+           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "id" (nr)
-+           : "memory");
-+
-+      return retval;
-+}
-+#define __test_and_change_bit(nr, vaddr) test_and_change_bit(nr, vaddr)
-+#define __change_bit(nr, vaddr) change_bit(nr, vaddr)
-+
-+#define change_bit(nr,vaddr)                  \
-+  (__builtin_constant_p(nr) ?                 \
-+   __constant_coldfire_change_bit(nr, vaddr) :        \
-+   __generic_coldfire_change_bit(nr, vaddr))
-+
-+#if 0
-+static __inline__ void __constant_coldfire_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bchg %1,%0"
-+           : "+QUd" (*p) : "id" (nr & 7));
-+}
-+#else
-+static __inline__ void __constant_coldfire_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
-+      __asm__ __volatile__ ("bchg %1,(%3)"
-+           : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p));
-+}
-+#endif
-+
-+static __inline__ void __generic_coldfire_change_bit(int nr,
-+      volatile void *vaddr)
-+{
-+      __asm__ __volatile__ ("bchg %1,%0"
-+           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
-+           : "d" (nr)
-+           : "memory");
-+}
-+
-+static inline int test_bit(int nr, const unsigned long *vaddr)
-+{
-+      return (vaddr[nr >> 5] & (1UL << (nr & 31))) != 0;
-+}
-+
-+static __inline__ unsigned long ffz(unsigned long word)
-+{
-+      unsigned long result = 0;
-+
-+      while (word & 1) {
-+              result++;
-+              word >>= 1;
-+      }
-+      return result;
-+}
-+
-+/* find_next_zero_bit() finds the first zero bit in a bit string of length
-+ * 'size' bits, starting the search at bit 'offset'.  This is largely based
-+ * on Linus's ALPHA routines.
-+ */
-+static __inline__ unsigned long find_next_zero_bit(void *addr,
-+      unsigned long size, unsigned long offset)
-+{
-+      unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
-+      unsigned long result = offset & ~31UL;
-+      unsigned long tmp;
-+
-+      if (offset >= size)
-+              return size;
-+      size -= result;
-+      offset &= 31UL;
-+      if (offset) {
-+              tmp = *(p++);
-+              tmp |= ~0UL >> (32-offset);
-+              if (size < 32)
-+                      goto found_first;
-+              if (~tmp)
-+                      goto found_middle;
-+              size -= 32;
-+              result += 32;
-+      }
-+      while (size & ~31UL) {
-+              tmp = *(p++);
-+              if (~tmp)
-+                      goto found_middle;
-+              result += 32;
-+              size -= 32;
-+      }
-+      if (!size)
-+              return result;
-+      tmp = *p;
-+
-+found_first:
-+      tmp |= ~0UL >> size;
-+found_middle:
-+      return result + ffz(tmp);
-+}
-+
-+#define find_first_zero_bit(addr, size) find_next_zero_bit(((void *)addr), \
-+              (size), 0)
-+
-+/* Ported from included/linux/bitops.h  */
-+static __inline__ int ffs(int x)
-+{
-+      int r = 1;
-+
-+      if (!x)
-+              return 0;
-+      if (!(x & 0xffff)) {
-+              x >>= 16;
-+              r += 16;
-+      }
-+      if (!(x & 0xff)) {
-+              x >>= 8;
-+              r += 8;
-+      }
-+      if (!(x & 0xf)) {
-+              x >>= 4;
-+              r += 4;
-+      }
-+      if (!(x & 3)) {
-+              x >>= 2;
-+              r += 2;
-+      }
-+      if (!(x & 1)) {
-+              x >>= 1;
-+              r += 1;
-+      }
-+      return r;
-+}
-+#define __ffs(x) (ffs(x) - 1)
-+
-+/* find_next_bit - find the next set bit in a memory region
-+ * (from asm-ppc/bitops.h)
-+ */
-+static __inline__ unsigned long find_next_bit(const unsigned long *addr,
-+      unsigned long size, unsigned long offset)
-+{
-+      unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
-+      unsigned int result = offset & ~31UL;
-+      unsigned int tmp;
-+
-+      if (offset >= size)
-+              return size;
-+      size -= result;
-+      offset &= 31UL;
-+      if (offset) {
-+              tmp = *p++;
-+              tmp &= ~0UL << offset;
-+              if (size < 32)
-+                      goto found_first;
-+              if (tmp)
-+                      goto found_middle;
-+              size -= 32;
-+              result += 32;
-+      }
-+      while (size >= 32) {
-+              tmp = *p++;
-+              if (tmp != 0)
-+                      goto found_middle;
-+              result += 32;
-+              size -= 32;
-+      }
-+      if (!size)
-+              return result;
-+      tmp = *p;
-+
-+found_first:
-+      tmp &= ~0UL >> (32 - size);
-+      if (tmp == 0UL)        /* Are any bits set? */
-+              return result + size; /* Nope. */
-+found_middle:
-+      return result + __ffs(tmp);
-+}
-+
-+#define find_first_bit(addr, size) find_next_bit((addr), (size), 0)
-+
-+#ifdef __KERNEL__
-+
-+/* Ported from include/linux/bitops.h */
-+static  __inline__ int fls(int x)
-+{
-+      int r = 32;
-+
-+      if (!x)
-+              return 0;
-+      if (!(x & 0xffff0000u)) {
-+              x <<= 16;
-+              r -= 16;
-+      }
-+      if (!(x & 0xff000000u)) {
-+              x <<= 8;
-+              r -= 8;
-+      }
-+      if (!(x & 0xf0000000u)) {
-+              x <<= 4;
-+              r -= 4;
-+      }
-+      if (!(x & 0xc0000000u)) {
-+              x <<= 2;
-+              r -= 2;
-+      }
-+      if (!(x & 0x80000000u)) {
-+              x <<= 1;
-+              r -= 1;
-+      }
-+      return r;
-+}
-+
-+#include <asm-generic/bitops/fls64.h>
-+#include <asm-generic/bitops/sched.h>
-+#include <asm-generic/bitops/hweight.h>
-+#include <asm-generic/bitops/lock.h>
-+
-+#define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \
-+                                                      (size), 0)
-+#define minix_test_and_set_bit(nr, addr)      test_and_set_bit((nr), \
-+                                                      (unsigned long *)(addr))
-+#define minix_set_bit(nr, addr)                       set_bit((nr), \
-+                                                      (unsigned long *)(addr))
-+#define minix_test_and_clear_bit(nr, addr)    test_and_clear_bit((nr), \
-+                                                      (unsigned long *)(addr))
-+
-+static inline int minix_test_bit(int nr, const volatile unsigned long *vaddr)
-+{
-+      int     *a = (int *)vaddr;
-+      int     mask;
-+
-+      a += nr >> 5;
-+      mask = 1 << (nr & 0x1f);
-+      return ((mask & *a) != 0);
-+}
-+
-+#define ext2_set_bit(nr, addr)                        test_and_set_bit((nr) ^ 24, \
-+                                                      (unsigned long *)(addr))
-+#define ext2_set_bit_atomic(lock, nr, addr)   test_and_set_bit((nr) ^ 24, \
-+                                                      (unsigned long *)(addr))
-+#define ext2_clear_bit(nr, addr)              test_and_clear_bit((nr) ^ 24, \
-+                                                      (unsigned long *)(addr))
-+#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, \
-+                                                      (unsigned long *)(addr))
-+
-+static inline int ext2_test_bit(int nr, const void *vaddr)
-+{
-+      const unsigned char *p = vaddr;
-+      return (p[nr >> 3] & (1U << (nr & 7))) != 0;
-+}
-+
-+static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)
-+{
-+      const unsigned long *p = vaddr, *addr = vaddr;
-+      int res;
-+
-+      if (!size)
-+              return 0;
-+
-+      size = (size >> 5) + ((size & 31) > 0);
-+      while (*p++ == ~0UL) {
-+              if (--size == 0)
-+                      return (p - addr) << 5;
-+      }
-+
-+      --p;
-+      for (res = 0; res < 32; res++)
-+              if (!ext2_test_bit (res, p))
-+                      break;
-+      return (p - addr) * 32 + res;
-+}
-+
-+static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size,
-+                                        unsigned offset)
-+{
-+      const unsigned long *addr = vaddr;
-+      const unsigned long *p = addr + (offset >> 5);
-+      int bit = offset & 31UL, res;
-+
-+      if (offset >= size)
-+              return size;
-+
-+      if (bit) {
-+              /* Look for zero in first longword */
-+              for (res = bit; res < 32; res++)
-+                      if (!ext2_test_bit (res, p))
-+                              return (p - addr) * 32 + res;
-+              p++;
-+      }
-+      /* No zero yet, search remaining full bytes for a zero */
-+      res = ext2_find_first_zero_bit(p, size - 32 * (p - addr));
-+      return (p - addr) * 32 + res;
-+}
-+
-+#endif /* KERNEL */
-+
-+#endif /* CONFIG_COLDFIRE */
-+
- #endif /* _M68K_BITOPS_H */
---- a/include/asm-m68k/bootinfo.h
-+++ b/include/asm-m68k/bootinfo.h
-@@ -19,11 +19,59 @@
- **   Redesign of the boot information structure; renamed to bootinfo.h again
- ** 27/11/96 Geert Uytterhoeven:
- **   Backwards compatibility with bootinfo interface version 1.0
-+** 12/03/08 Kurt Mahan
-+**   Copy the bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
-+**   into this file.  The original author is Wolfgang Denk, 
-+**   DENX Software Engineering, wd@denx.de.
- */
- #ifndef _M68K_BOOTINFO_H
- #define _M68K_BOOTINFO_H
-+#ifndef __ASSEMBLY__
-+/*
-+ * UBoot Support
-+ *
-+ * bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
-+ */
-+struct bd_info {
-+      unsigned long bi_memstart;      /* start of DRAM memory */
-+      unsigned long bi_memsize;       /* size  of DRAM memory in bytes */
-+      unsigned long bi_flashstart;    /* start of FLASH memory */
-+      unsigned long bi_flashsize;     /* size  of FLASH memory */
-+      unsigned long bi_flashoffset;   /* reserved area for startup monitor */
-+      unsigned long bi_sramstart;     /* start of SRAM memory */
-+      unsigned long bi_sramsize;      /* size  of SRAM memory */
-+      unsigned long bi_mbar_base;     /* base of internal registers */
-+      unsigned long bi_bootflags;     /* boot / reboot flag (for LynxOS) */
-+      unsigned long bi_boot_params;   /* where this board expects params */
-+      unsigned long bi_ip_addr;       /* IP Address */
-+      unsigned char bi_enet0addr[6];  /* Ethernet 0 mac address */
-+      unsigned short bi_ethspeed;     /* Ethernet speed in Mbps */
-+      unsigned long bi_intfreq;       /* Internal Freq, in MHz */
-+      unsigned long bi_busfreq;       /* Bus Freq, in MHz */
-+#ifdef UBOOT_PCI
-+      unsigned long bi_pcifreq;       /* pci Freq in MHz */
-+#endif
-+#ifdef UBOOT_EXTRA_CLOCK
-+      unsigned long bi_inpfreq;       /* input Freq in MHz */
-+      unsigned long bi_vcofreq;       /* vco Freq in MHz */
-+      unsigned long bi_flbfreq;       /* Flexbus Freq in MHz */
-+#endif
-+      unsigned long bi_baudrate;      /* Console Baudrate */
-+      unsigned char bi_enet1addr[6];  /* eth1 mac address */
-+      unsigned char bi_enet2addr[6];  /* eth2 mac address */
-+      unsigned char bi_enet3addr[6];  /* eth3 mac address */
-+};
-+
-+struct uboot_record {
-+      struct bd_info *bdi;
-+      unsigned long initrd_start;
-+      unsigned long initrd_end;
-+      unsigned long cmd_line_start;
-+      unsigned long cmd_line_stop;
-+};
-+#endif /* __ASSEMBLY__ */
-     /*
-      *  Bootinfo definitions
-@@ -49,6 +97,8 @@ struct bi_record {
- #endif /* __ASSEMBLY__ */
-+
-+
-     /*
-      *  Tag Definitions
-      *
---- a/include/asm-m68k/byteorder.h
-+++ b/include/asm-m68k/byteorder.h
-@@ -4,8 +4,15 @@
- #include <asm/types.h>
- #include <linux/compiler.h>
--#ifdef __GNUC__
--
-+#if defined(__GNUC__)
-+#if defined(__mcfisaaplus__) || defined(__mcfisac__)
-+static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
-+{
-+      __asm__ ("byterev %0" : "=d" (val) : "0" (val));
-+      return val;
-+}
-+#define __arch__swab32(x) ___arch__swab32(x)
-+#elif !defined(__mcoldfire__)
- static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
- {
-       __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
-@@ -14,6 +21,7 @@ static __inline__ __attribute_const__ __
- #define __arch__swab32(x) ___arch__swab32(x)
- #endif
-+#endif
- #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
- #  define __BYTEORDER_HAS_U64__
---- a/include/asm-m68k/cacheflush.h
-+++ b/include/asm-m68k/cacheflush.h
-@@ -6,6 +6,9 @@
- /* cache code */
- #define FLUSH_I_AND_D (0x00000808)
- #define FLUSH_I               (0x00000008)
-+#ifdef CONFIG_COLDFIRE
-+#include <asm/cf_cacheflush.h>
-+#else /* !CONFIG_COLDFIRE */
- /*
-  * Cache handling functions
-@@ -153,4 +156,5 @@ static inline void copy_from_user_page(s
-       memcpy(dst, src, len);
- }
-+#endif /* !CONFIG_COLDFIRE */
- #endif /* _M68K_CACHEFLUSH_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_5445x_cacheflush.h
-@@ -0,0 +1,447 @@
-+/*
-+ * include/asm-m68k/cf_5445x_cacheflush.h - Coldfire 5445x Cache
-+ *
-+ * Based on include/asm-m68k/cacheflush.h
-+ *
-+ * Coldfire pieces by:
-+ *   Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007, 2008
-+ *
-+ * 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.
-+ */
-+#ifndef M68K_CF_5445x_CACHEFLUSH_H
-+#define M68K_CF_5445x_CACHEFLUSH_H
-+
-+#include <asm/cfcache.h>
-+
-+/*
-+ * Coldfire Cache Model
-+ *
-+ * The Coldfire processors use a Harvard architecture cache configured
-+ * as four-way set associative.  The cache does not implement bus snooping
-+ * so cache coherency with other masters must be maintained in software.
-+ *
-+ * The cache is managed via the CPUSHL instruction in conjunction with
-+ * bits set in the CACR (cache control register).  Currently the code
-+ * uses the CPUSHL enhancement which adds the ability to
-+ * invalidate/clear/push a cacheline by physical address.  This feature
-+ * is designated in the Hardware Configuration Register [D1-CPES].
-+ *
-+ * CACR Bits:
-+ *    DPI[28]         cpushl invalidate disable for d-cache
-+ *    IDPI[12]        cpushl invalidate disable for i-cache
-+ *    SPA[14]         cpushl search by physical address
-+ *    IVO[20]         cpushl invalidate only
-+ *
-+ * Random Terminology:
-+ *  * invalidate = reset the cache line's valid bit
-+ *  * push = generate a line-sized store of the data if its contents are marked
-+ *         as modifed (the modified flag is cleared after the store)
-+ *  * clear = push + invalidate
-+ */
-+
-+/**
-+ * flush_icache - Flush all of the instruction cache
-+ */
-+static inline void flush_icache(void)
-+{
-+      asm volatile("nop\n"
-+                   "moveq%.l  #0,%%d0\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "1:\n"
-+                   "cpushl    %%ic,(%%a0)\n"
-+                   "add%.l    #0x0010,%%a0\n"
-+                   "addq%.l   #1,%%d1\n"
-+                   "cmpi%.l   %0,%%d1\n"
-+                   "bne       1b\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "addq%.l   #1,%%d0\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "cmpi%.l   #4,%%d0\n"
-+                   "bne       1b\n"
-+                   : : "i" (CACHE_SETS)
-+                   : "a0", "d0", "d1");
-+}
-+
-+/**
-+ * flush_dcache - Flush all of the data cache
-+ */
-+static inline void flush_dcache(void)
-+{
-+      asm volatile("nop\n"
-+                   "moveq%.l  #0,%%d0\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "1:\n"
-+                   "cpushl    %%dc,(%%a0)\n"
-+                   "add%.l    #0x0010,%%a0\n"
-+                   "addq%.l   #1,%%d1\n"
-+                   "cmpi%.l   %0,%%d1\n"
-+                   "bne       1b\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "addq%.l   #1,%%d0\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "cmpi%.l   #4,%%d0\n"
-+                   "bne       1b\n"
-+                   : : "i" (CACHE_SETS)
-+                   : "a0", "d0", "d1");
-+}
-+
-+/**
-+ * flush_bcache - Flush all of both caches
-+ */
-+static inline void flush_bcache(void)
-+{
-+      asm volatile("nop\n"
-+                   "moveq%.l  #0,%%d0\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "add%.l    #0x0010,%%a0\n"
-+                   "addq%.l   #1,%%d1\n"
-+                   "cmpi%.l   %0,%%d1\n"
-+                   "bne       1b\n"
-+                   "moveq%.l  #0,%%d1\n"
-+                   "addq%.l   #1,%%d0\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "cmpi%.l   #4,%%d0\n"
-+                   "bne       1b\n"
-+                   : : "i" (CACHE_SETS)
-+                   : "a0", "d0", "d1");
-+}
-+
-+/**
-+ * cf_cache_clear - invalidate cache
-+ * @paddr: starting physical address
-+ * @len: number of bytes
-+ *
-+ * Invalidate cache lines starting at paddr for len bytes.
-+ * Those lines are not pushed.
-+ */
-+static inline void cf_cache_clear(unsigned long paddr, int len)
-+{
-+      /* number of lines */
-+      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
-+      if (len == 0)
-+              return;
-+
-+      /* align on set boundary */
-+      paddr &= 0xfffffff0;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%d0\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "subq%.l   #1,%%d0\n"
-+                   "bne%.b    1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : : "a" (paddr), "r" (len),
-+                       "r" (shadow_cacr),
-+                       "i" (CF_CACR_SPA+CF_CACR_IVO)
-+                   : "a0", "d0");
-+}
-+
-+/**
-+ * cf_cache_push - Push dirty cache out with no invalidate
-+ * @paddr: starting physical address
-+ * @len: number of bytes
-+ *
-+ * Push the any dirty lines starting at paddr for len bytes.
-+ * Those lines are not invalidated.
-+ */
-+static inline void cf_cache_push(unsigned long paddr, int len)
-+{
-+      /* number of lines */
-+      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
-+      if (len == 0)
-+              return;
-+
-+      /* align on set boundary */
-+      paddr &= 0xfffffff0;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%d0\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "subq%.l   #1,%%d0\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : : "a" (paddr), "r" (len),
-+                       "r" (shadow_cacr),
-+                       "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI)
-+                   : "a0", "d0");
-+}
-+
-+/**
-+ * cf_cache_flush - Push dirty cache out and invalidate
-+ * @paddr: starting physical address
-+ * @len: number of bytes
-+ *
-+ * Push the any dirty lines starting at paddr for len bytes and
-+ * invalidate those lines.
-+ */
-+static inline void cf_cache_flush(unsigned long paddr, int len)
-+{
-+      /* number of lines */
-+      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
-+      if (len == 0)
-+              return;
-+
-+      /* align on set boundary */
-+      paddr &= 0xfffffff0;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%d0\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "subq%.l   #1,%%d0\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : : "a" (paddr), "r" (len),
-+                       "r" (shadow_cacr),
-+                       "i" (CF_CACR_SPA)
-+                   : "a0", "d0");
-+}
-+
-+/**
-+ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate
-+ * @vstart - starting virtual address
-+ * @vend: ending virtual address
-+ *
-+ * Push the any dirty data/instr lines starting at paddr for len bytes and
-+ * invalidate those lines.
-+ */
-+static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend)
-+{
-+      int len;
-+
-+      /* align on set boundary */
-+      vstart &= 0xfffffff0;
-+      vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
-+      len = vend - vstart;
-+      if (len == 0)
-+              return;
-+      vstart = __pa(vstart);
-+      vend = vstart + len;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%a1\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "cmpa%.l   %%a0,%%a1\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : /* no return */
-+                   : "a" (vstart), "a" (vend),
-+                     "r" (shadow_cacr),
-+                     "i" (CF_CACR_SPA)
-+                   : "a0", "a1", "d0");
-+}
-+
-+/**
-+ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate
-+ * @vstart - starting virtual address
-+ * @vend: ending virtual address
-+ *
-+ * Push the any dirty data lines starting at paddr for len bytes and
-+ * invalidate those lines.
-+ */
-+static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend)
-+{
-+      /* align on set boundary */
-+      vstart &= 0xfffffff0;
-+      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%a1\n"
-+                   "1:\n"
-+                   "cpushl    %%dc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "cmpa%.l   %%a0,%%a1\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : /* no return */
-+                   : "a" (__pa(vstart)), "a" (__pa(vend)),
-+                     "r" (shadow_cacr),
-+                     "i" (CF_CACR_SPA)
-+                   : "a0", "a1", "d0");
-+}
-+
-+/**
-+ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate
-+ * @vstart - starting virtual address
-+ * @vend: ending virtual address
-+ *
-+ * Push the any dirty instr lines starting at paddr for len bytes and
-+ * invalidate those lines.  This should just be an invalidate since you
-+ * shouldn't be able to have dirty instruction cache.
-+ */
-+static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend)
-+{
-+      /* align on set boundary */
-+      vstart &= 0xfffffff0;
-+      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
-+
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%a0\n"
-+                   "move%.l   %1,%%a1\n"
-+                   "1:\n"
-+                   "cpushl    %%ic,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "cmpa%.l   %%a0,%%a1\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : /* no return */
-+                   : "a" (__pa(vstart)), "a" (__pa(vend)),
-+                     "r" (shadow_cacr),
-+                     "i" (CF_CACR_SPA)
-+                   : "a0", "a1", "d0");
-+}
-+
-+/**
-+ * flush_cache_mm - Flush an mm_struct
-+ * @mm: mm_struct to flush
-+ */
-+static inline void flush_cache_mm(struct mm_struct *mm)
-+{
-+      if (mm == current->mm)
-+              flush_bcache();
-+}
-+
-+#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
-+
-+/**
-+ * flush_cache_range - Flush a cache range
-+ * @vma: vma struct
-+ * @start: Starting address
-+ * @end: Ending address
-+ *
-+ * flush_cache_range must be a macro to avoid a dependency on
-+ * linux/mm.h which includes this file.
-+ */
-+static inline void flush_cache_range(struct vm_area_struct *vma,
-+      unsigned long start, unsigned long end)
-+{
-+      if (vma->vm_mm == current->mm)
-+              cf_cache_flush_range(start, end);
-+}
-+
-+/**
-+ * flush_cache_page - Flush a page of the cache
-+ * @vma: vma struct
-+ * @vmaddr:
-+ * @pfn: page numer
-+ *
-+ * flush_cache_page must be a macro to avoid a dependency on
-+ * linux/mm.h which includes this file.
-+ */
-+static inline void flush_cache_page(struct vm_area_struct *vma,
-+      unsigned long vmaddr, unsigned long pfn)
-+{
-+      if (vma->vm_mm == current->mm)
-+              cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
-+}
-+
-+/**
-+ * __flush_page_to_ram - Push a page out of the cache
-+ * @vaddr: Virtual address at start of page
-+ *
-+ * Push the page at kernel virtual address *vaddr* and clear
-+ * the icache.
-+ */
-+static inline void __flush_page_to_ram(void *vaddr)
-+{
-+      asm volatile("nop\n"
-+                   "move%.l   %2,%%d0\n"
-+                   "or%.l     %3,%%d0\n"
-+                   "movec     %%d0,%%cacr\n"
-+                   "move%.l   %0,%%d0\n"
-+                   "and%.l    #0xfffffff0,%%d0\n"
-+                   "move%.l   %%d0,%%a0\n"
-+                   "move%.l   %1,%%d0\n"
-+                   "1:\n"
-+                   "cpushl    %%bc,(%%a0)\n"
-+                   "lea       0x10(%%a0),%%a0\n"
-+                   "subq%.l   #1,%%d0\n"
-+                   "bne.b     1b\n"
-+                   "movec     %2,%%cacr\n"
-+                   : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE),
-+                       "r" (shadow_cacr), "i" (CF_CACR_SPA)
-+                   : "a0", "d0");
-+}
-+
-+/*
-+ * Various defines for the kernel.
-+ */
-+
-+extern void cache_clear(unsigned long paddr, int len);
-+extern void cache_push(unsigned long paddr, int len);
-+extern void flush_icache_range(unsigned long address, unsigned long endaddr);
-+
-+#define flush_cache_all()                     flush_bcache()
-+#define flush_cache_vmap(start, end)          flush_bcache()
-+#define flush_cache_vunmap(start, end)                flush_bcache()
-+
-+#define flush_dcache_range(vstart, vend)      cf_dcache_flush_range(vstart, vend)
-+#define flush_dcache_page(page)                       __flush_page_to_ram(page_address(page))
-+#define flush_dcache_mmap_lock(mapping)               do { } while (0)
-+#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
-+
-+#define flush_icache_page(vma, page)          __flush_page_to_ram(page_address(page))
-+
-+/**
-+ * copy_to_user_page - Copy memory to user page
-+ */
-+static inline void copy_to_user_page(struct vm_area_struct *vma,
-+                                   struct page *page, unsigned long vaddr,
-+                                   void *dst, void *src, int len)
-+{
-+      memcpy(dst, src, len);
-+      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
-+}
-+
-+/**
-+ * copy_from_user_page - Copy memory from user page
-+ */
-+static inline void copy_from_user_page(struct vm_area_struct *vma,
-+                                     struct page *page, unsigned long vaddr,
-+                                     void *dst, void *src, int len)
-+{
-+      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
-+      memcpy(dst, src, len);
-+}
-+
-+#endif /* M68K_CF_5445x_CACHEFLUSH_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_548x_cacheflush.h
-@@ -0,0 +1,259 @@
-+/*
-+ * include/asm-m68k/cf_548x_cacheflush.h - Coldfire 547x/548x Cache
-+ *
-+ * Based on include/asm-m68k/cacheflush.h
-+ *
-+ * Coldfire pieces by:
-+ *   Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007, 2008
-+ *
-+ * 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.
-+ */
-+#ifndef M68K_CF_548x_CACHEFLUSH_H
-+#define M68K_CF_548x_CACHEFLUSH_H
-+
-+#include <asm/cfcache.h>
-+/*
-+ * Cache handling functions
-+ */
-+
-+#define flush_icache()                                                \
-+({                                                            \
-+  unsigned long set;                                          \
-+  unsigned long start_set;                                    \
-+  unsigned long end_set;                                      \
-+                                                              \
-+  start_set = 0;                                              \
-+  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
-+                                                              \
-+  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
-+    asm volatile("cpushl %%ic,(%0)\n"                         \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%ic,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%ic,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));              \
-+  }                                                           \
-+})
-+
-+#define flush_dcache()                                                \
-+({                                                            \
-+  unsigned long set;                                          \
-+  unsigned long start_set;                                    \
-+  unsigned long end_set;                                      \
-+                                                              \
-+  start_set = 0;                                              \
-+  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
-+                                                              \
-+  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
-+    asm volatile("cpushl %%dc,(%0)\n"                         \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%dc,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%dc,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set));              \
-+  }                                                           \
-+})
-+
-+#define flush_bcache()                                                \
-+({                                                            \
-+  unsigned long set;                                          \
-+  unsigned long start_set;                                    \
-+  unsigned long end_set;                                      \
-+                                                              \
-+  start_set = 0;                                              \
-+  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
-+                                                              \
-+  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
-+    asm volatile("cpushl %%bc,(%0)\n"                         \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%bc,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%bc,(%0)\n"                               \
-+                 "\taddq%.l #1,%0\n"                          \
-+                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));              \
-+  }                                                           \
-+})
-+
-+/*
-+ * invalidate the cache for the specified memory range.
-+ * It starts at the physical address specified for
-+ * the given number of bytes.
-+ */
-+extern void cache_clear(unsigned long paddr, int len);
-+/*
-+ * push any dirty cache in the specified memory range.
-+ * It starts at the physical address specified for
-+ * the given number of bytes.
-+ */
-+extern void cache_push(unsigned long paddr, int len);
-+
-+/*
-+ * push and invalidate pages in the specified user virtual
-+ * memory range.
-+ */
-+extern void cache_push_v(unsigned long vaddr, int len);
-+
-+/* This is needed whenever the virtual mapping of the current
-+   process changes.  */
-+
-+/**
-+ * flush_cache_mm - Flush an mm_struct
-+ * @mm: mm_struct to flush
-+ */
-+static inline void flush_cache_mm(struct mm_struct *mm)
-+{
-+      if (mm == current->mm)
-+              flush_bcache();
-+}
-+
-+#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
-+
-+#define flush_cache_all()             flush_bcache()
-+
-+/**
-+ * flush_cache_range - Flush a cache range
-+ * @vma: vma struct
-+ * @start: Starting address
-+ * @end: Ending address
-+ *
-+ * flush_cache_range must be a macro to avoid a dependency on
-+ * linux/mm.h which includes this file.
-+ */
-+static inline void flush_cache_range(struct vm_area_struct *vma,
-+      unsigned long start, unsigned long end)
-+{
-+      if (vma->vm_mm == current->mm)
-+              flush_bcache();
-+//            cf_cache_flush_range(start, end);
-+}
-+
-+/**
-+ * flush_cache_page - Flush a page of the cache
-+ * @vma: vma struct
-+ * @vmaddr:
-+ * @pfn: page numer
-+ *
-+ * flush_cache_page must be a macro to avoid a dependency on
-+ * linux/mm.h which includes this file.
-+ */
-+static inline void flush_cache_page(struct vm_area_struct *vma,
-+      unsigned long vmaddr, unsigned long pfn)
-+{
-+      if (vma->vm_mm == current->mm)
-+              flush_bcache();
-+//            cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
-+}
-+
-+/* Push the page at kernel virtual address and clear the icache */
-+/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
-+#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
-+extern inline void __flush_page_to_ram(void *address)
-+{
-+  unsigned long set;
-+  unsigned long start_set;
-+  unsigned long end_set;
-+  unsigned long addr = (unsigned long) address;
-+
-+  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
-+
-+  start_set = addr & _ICACHE_SET_MASK;
-+  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
-+
-+  if (start_set > end_set) {
-+    /* from the begining to the lowest address */
-+    for (set = 0; set <= end_set; set += (0x10 - 3)) {
-+      asm volatile("cpushl %%bc,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%bc,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%bc,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
-+    }
-+    /* next loop will finish the cache ie pass the hole */
-+    end_set = LAST_ICACHE_ADDR;    
-+  }
-+  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
-+    asm volatile("cpushl %%bc,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%bc,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%bc,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
-+  }
-+}
-+
-+/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */
-+#define flush_dcache_page(page)                       \
-+      __flush_page_to_ram((void *) page_address(page))
-+#define flush_icache_page(vma,pg)             \
-+      __flush_page_to_ram((void *) page_address(pg))
-+#define flush_icache_user_range(adr,len)      do { } while (0)
-+/* NL */
-+#define flush_icache_user_page(vma,page,addr,len)     do { } while (0)
-+
-+/* Push n pages at kernel virtual address and clear the icache */
-+/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
-+extern inline void flush_icache_range (unsigned long address,
-+                                     unsigned long endaddr)
-+{
-+  unsigned long set;
-+  unsigned long start_set;
-+  unsigned long end_set;
-+
-+  start_set = address & _ICACHE_SET_MASK;
-+  end_set = endaddr & _ICACHE_SET_MASK;
-+
-+  if (start_set > end_set) {
-+    /* from the begining to the lowest address */
-+    for (set = 0; set <= end_set; set += (0x10 - 3)) {
-+      asm volatile("cpushl %%ic,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%ic,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%ic,(%0)\n"
-+                   "\taddq%.l #1,%0\n"
-+                   "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
-+    }
-+    /* next loop will finish the cache ie pass the hole */
-+    end_set = LAST_ICACHE_ADDR;    
-+  }
-+  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
-+    asm volatile("cpushl %%ic,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%ic,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%ic,(%0)\n"
-+                 "\taddq%.l #1,%0\n"
-+                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
-+  }
-+}
-+
-+static inline void copy_to_user_page(struct vm_area_struct *vma,
-+                                   struct page *page, unsigned long vaddr,
-+                                   void *dst, void *src, int len)
-+{
-+      memcpy(dst, src, len);
-+      flush_icache_user_page(vma, page, vaddr, len);
-+}
-+static inline void copy_from_user_page(struct vm_area_struct *vma,
-+                                     struct page *page, unsigned long vaddr,
-+                                     void *dst, void *src, int len)
-+{
-+      memcpy(dst, src, len);
-+}
-+
-+#define flush_cache_vmap(start, end)          flush_cache_all()
-+#define flush_cache_vunmap(start, end)                flush_cache_all()
-+#define flush_dcache_mmap_lock(mapping)               do { } while (0)
-+#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
-+
-+#endif /* M68K_CF_548x_CACHEFLUSH_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_cacheflush.h
-@@ -0,0 +1,10 @@
-+#ifndef M68K_CF_CACHEFLUSH_H
-+#define M68K_CF_CACHEFLUSH_H
-+
-+#ifdef CONFIG_M5445X
-+#include "cf_5445x_cacheflush.h"
-+#else
-+#include "cf_548x_cacheflush.h"
-+#endif
-+
-+#endif /* M68K_CF_CACHEFLUSH_H */
---- /dev/null
-+++ b/include/asm-m68k/cfcache.h
-@@ -0,0 +1,114 @@
-+/*
-+ * include/asm-m68k/cfcache.h - Coldfire Cache Controller
-+ *
-+ * Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+#ifndef CF_CFCACHE_H
-+#define CF_CFCACHE_H
-+
-+/*
-+ * CACR Cache Control Register
-+ */
-+#define CF_CACR_DEC         (0x80000000) /* Data Cache Enable                */
-+#define CF_CACR_DW          (0x40000000) /* Data default Write-protect       */
-+#define CF_CACR_DESB        (0x20000000) /* Data Enable Store Buffer         */
-+#define CF_CACR_DPI         (0x10000000) /* Data Disable CPUSHL Invalidate   */
-+#define CF_CACR_DHLCK       (0x08000000) /* 1/2 Data Cache Lock Mode         */
-+#define CF_CACR_DDCM_00     (0x00000000) /* Cacheable writethrough imprecise */
-+#define CF_CACR_DDCM_01     (0x02000000) /* Cacheable copyback               */
-+#define CF_CACR_DDCM_10     (0x04000000) /* Noncacheable precise             */
-+#define CF_CACR_DDCM_11     (0x06000000) /* Noncacheable imprecise           */
-+#define CF_CACR_DCINVA      (0x01000000) /* Data Cache Invalidate All        */
-+#define CF_CACR_DDSP        (0x00800000) /* Data default supervisor-protect  */
-+#define CF_CACR_IVO         (0x00100000) /* Invalidate only                  */
-+#define CF_CACR_BEC         (0x00080000) /* Branch Cache Enable              */
-+#define CF_CACR_BCINVA      (0x00040000) /* Branch Cache Invalidate All      */
-+#define CF_CACR_IEC         (0x00008000) /* Instruction Cache Enable         */
-+#define CF_CACR_SPA         (0x00004000) /* Search by Physical Address       */
-+#define CF_CACR_DNFB        (0x00002000) /* Default cache-inhibited fill buf */
-+#define CF_CACR_IDPI        (0x00001000) /* Instr Disable CPUSHL Invalidate  */
-+#define CF_CACR_IHLCK       (0x00000800) /* 1/2 Instruction Cache Lock Mode  */
-+#define CF_CACR_IDCM        (0x00000400) /* Noncacheable Instr default mode  */
-+#define CF_CACR_ICINVA      (0x00000100) /* Instr Cache Invalidate All       */
-+#define CF_CACR_IDSP      (0x00000080) /* Ins default supervisor-protect   */
-+#define CF_CACR_EUSP        (0x00000020) /* Switch stacks in user mode       */
-+
-+#ifdef CONFIG_M5445X
-+/*
-+ * M5445x Cache Configuration
-+ *    - cache line size is 16 bytes
-+ *    - cache is 4-way set associative
-+ *    - each cache has 256 sets (64k / 16bytes / 4way)
-+ *    - I-Cache size is 16KB
-+ *    - D-Cache size is 16KB
-+ */
-+#define ICACHE_SIZE 0x4000            /* instruction - 16k */
-+#define DCACHE_SIZE 0x4000            /* data - 16k */
-+
-+#define CACHE_LINE_SIZE 0x0010                /* 16 bytes */
-+#define CACHE_SETS 0x0100             /* 256 sets */
-+#define CACHE_WAYS 0x0004             /* 4 way */
-+
-+#define CACHE_DISABLE_MODE    (CF_CACR_DCINVA+        \
-+                               CF_CACR_BCINVA+        \
-+                               CF_CACR_ICINVA)
-+
-+#ifndef CONFIG_M5445X_DISABLE_CACHE
-+#define CACHE_INITIAL_MODE    (CF_CACR_DEC+           \
-+                               CF_CACR_BEC+           \
-+                               CF_CACR_IEC+           \
-+                               CF_CACR_DESB+          \
-+                               CF_CACR_EUSP)
-+#else
-+/* cache disabled for testing */
-+#define CACHE_INITIAL_MODE    (CF_CACR_EUSP)
-+#endif /* CONFIG_M5445X_DISABLE_CACHE */
-+
-+#elif defined(CONFIG_M547X_8X)
-+/*
-+ * M547x/M548x Cache Configuration
-+ *    - cache line size is 16 bytes
-+ *    - cache is 4-way set associative
-+ *    - each cache has 512 sets (128k / 16bytes / 4way)
-+ *    - I-Cache size is 32KB
-+ *    - D-Cache size is 32KB
-+ */
-+#define ICACHE_SIZE 0x8000            /* instruction - 32k */
-+#define DCACHE_SIZE 0x8000            /* data - 32k */
-+
-+#define CACHE_LINE_SIZE 0x0010                /* 16 bytes */
-+#define CACHE_SETS 0x0200             /* 512 sets */
-+#define CACHE_WAYS 0x0004             /* 4 way */
-+
-+/* in for the old cpushl caching code */
-+#define _DCACHE_SET_MASK ((DCACHE_SIZE/64-1)<<CACHE_WAYS)
-+#define _ICACHE_SET_MASK ((ICACHE_SIZE/64-1)<<CACHE_WAYS)
-+#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
-+#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
-+
-+#define CACHE_DISABLE_MODE    (CF_CACR_DCINVA+        \
-+                               CF_CACR_BCINVA+        \
-+                               CF_CACR_ICINVA)
-+
-+#define CACHE_INITIAL_MODE    (CF_CACR_DEC+           \
-+                               CF_CACR_BEC+           \
-+                               CF_CACR_IEC+           \
-+                               CF_CACR_DESB+          \
-+                               CF_CACR_EUSP)
-+#endif /* CONFIG_M547X_8X */
-+
-+#ifndef __ASSEMBLY__
-+
-+extern unsigned long shadow_cacr;
-+extern void cacr_set(unsigned long x);
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#endif /* CF_CACHE_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_entry.h
-@@ -0,0 +1,146 @@
-+#ifndef __CF_M68K_ENTRY_H
-+#define __CF_M68K_ENTRY_H
-+
-+#include <asm/setup.h>
-+#include <asm/page.h>
-+#include <asm/coldfire.h>
-+#include <asm/cfmmu.h>
-+#include <asm/asm-offsets.h>
-+
-+/*
-+ * Stack layout in 'ret_from_exception':
-+ *
-+ *    This allows access to the syscall arguments in registers d1-d5
-+ *
-+ *     0(sp) - d1
-+ *     4(sp) - d2
-+ *     8(sp) - d3
-+ *     C(sp) - d4
-+ *    10(sp) - d5
-+ *    14(sp) - a0
-+ *    18(sp) - a1
-+ *    1C(sp) - a2
-+ *    20(sp) - d0
-+ *    24(sp) - orig_d0
-+ *    28(sp) - stack adjustment
-+ *    2C(sp) - sr
-+ *    2E(sp) - pc
-+ *    32(sp) - format & vector
-+ *    36(sp) - MMUSR
-+ *    3A(sp) - MMUAR
-+ */
-+
-+/*
-+ * 97/05/14 Andreas: Register %a2 is now set to the current task throughout
-+ *                 the whole kernel.
-+ */
-+
-+/* the following macro is used when enabling interrupts */
-+/* portable version */
-+#define ALLOWINT      (~0x700)
-+#define       MAX_NOINT_IPL   0
-+
-+#ifdef __ASSEMBLY__
-+
-+#define curptr a2
-+
-+LFLUSH_I_AND_D = 0x00000808
-+LSIGTRAP = 5
-+
-+/* process bits for task_struct.ptrace */
-+PT_TRACESYS_OFF = 3
-+PT_TRACESYS_BIT = 1
-+PT_PTRACED_OFF = 3
-+PT_PTRACED_BIT = 0
-+PT_DTRACE_OFF = 3
-+PT_DTRACE_BIT = 2
-+
-+#define SAVE_ALL_INT save_all_int
-+#define SAVE_ALL_SYS save_all_sys
-+#define RESTORE_ALL restore_all
-+/*
-+ * This defines the normal kernel pt-regs layout.
-+ *
-+ * regs a3-a6 and d6-d7 are preserved by C code
-+ * the kernel doesn't mess with usp unless it needs to
-+ */
-+
-+/*
-+ * a -1 in the orig_d0 field signifies
-+ * that the stack frame is NOT for syscall
-+ */
-+.macro        save_all_int
-+      movel   MMUSR,%sp@-
-+      movel   MMUAR,%sp@-
-+      clrl    %sp@-           | stk_adj
-+      pea     -1:w            | orig d0
-+      movel   %d0,%sp@-       | d0
-+      subal   #(8*4), %sp
-+      moveml  %d1-%d5/%a0-%a1/%curptr,%sp@
-+.endm
-+
-+.macro        save_all_sys
-+      movel   MMUSR,%sp@-
-+      movel   MMUAR,%sp@-
-+      clrl    %sp@-           | stk_adj
-+      movel   %d0,%sp@-       | orig d0
-+      movel   %d0,%sp@-       | d0
-+      subal   #(8*4), %sp
-+      moveml  %d1-%d5/%a0-%a1/%curptr,%sp@
-+.endm
-+
-+.macro        restore_all
-+      moveml  %sp@,%a0-%a1/%curptr/%d1-%d5
-+      addal   #(8*4), %sp
-+      movel   %sp@+,%d0       | d0
-+      addql   #4,%sp          | orig d0
-+      addl    %sp@+,%sp       | stk_adj
-+      addql   #8,%sp          | MMUAR & MMUSR
-+      rte
-+.endm
-+
-+#define SWITCH_STACK_SIZE (6*4+4)     /* includes return address */
-+
-+#define SAVE_SWITCH_STACK save_switch_stack
-+#define RESTORE_SWITCH_STACK restore_switch_stack
-+#define GET_CURRENT(tmp) get_current tmp
-+
-+.macro        save_switch_stack
-+      subal   #(6*4), %sp
-+      moveml  %a3-%a6/%d6-%d7,%sp@
-+.endm
-+
-+.macro        restore_switch_stack
-+      moveml  %sp@,%a3-%a6/%d6-%d7
-+      addal   #(6*4), %sp
-+.endm
-+
-+.macro        get_current reg=%d0
-+      movel   %sp,\reg
-+      andl    #-THREAD_SIZE,\reg
-+      movel   \reg,%curptr
-+      movel   %curptr@,%curptr
-+.endm
-+
-+#else /* C source */
-+
-+#define STR(X) STR1(X)
-+#define STR1(X) #X
-+
-+#define PT_OFF_ORIG_D0         0x24
-+#define PT_OFF_FORMATVEC 0x32
-+#define PT_OFF_SR      0x2C
-+#define SAVE_ALL_INT                          \
-+      "clrl   %%sp@-;"    /* stk_adj */       \
-+      "pea    -1:w;"      /* orig d0 = -1 */  \
-+      "movel  %%d0,%%sp@-;" /* d0 */          \
-+      "subal  #(8*4),%sp"                     \
-+      "moveml %%d1-%%d5/%%a0-%%a2,%%sp@"
-+#define GET_CURRENT(tmp) \
-+      "movel  %%sp,"#tmp"\n\t" \
-+      "andw   #-"STR(THREAD_SIZE)","#tmp"\n\t" \
-+      "movel  "#tmp",%%a2\n\t"
-+
-+#endif
-+
-+#endif /* __CF_M68K_ENTRY_H */
---- /dev/null
-+++ b/include/asm-m68k/cfmmu.h
-@@ -0,0 +1,104 @@
-+/*
-+ * Definitions for Coldfire V4e MMU
-+ */
-+#include <asm/movs.h>
-+
-+#ifndef __CF_MMU_H__
-+#define __CF_MMU_H__
-+
-+
-+#define MMU_BASE 0xE1000000
-+
-+
-+#define MMUCR (MMU_BASE+0x00)
-+#define MMUCR_ASMN  1
-+#define MMUCR_ASM   (1<<MMUCR_ASMN)
-+#define MMUCR_ENN   0
-+#define MMUCR_EN    (1<<MMUCR_ENN)
-+
-+#define MMUOR REG16(MMU_BASE+0x04+0x02)
-+#define MMUOR_AAN   16
-+#define MMUOR_AA    (0xffff<<MMUOR_AAN)
-+#define MMUOR_STLBN 8
-+#define MMUOR_STLB  (1<<MMUOR_STLBN)
-+#define MMUOR_CAN   7
-+#define MMUOR_CA    (1<<MMUOR_CAN)
-+#define MMUOR_CNLN  6
-+#define MMUOR_CNL   (1<<MMUOR_CNLN)
-+#define MMUOR_CASN  5
-+#define MMUOR_CAS   (1<<MMUOR_CASN)
-+#define MMUOR_ITLBN 4
-+#define MMUOR_ITLB  (1<<MMUOR_ITLBN)
-+#define MMUOR_ADRN  3
-+#define MMUOR_ADR   (1<<MMUOR_ADRN)
-+#define MMUOR_RWN   2
-+#define MMUOR_RW    (1<<MMUOR_RWN)
-+#define MMUOR_ACCN  1
-+#define MMUOR_ACC   (1<<MMUOR_ACCN)
-+#define MMUOR_UAAN  0
-+#define MMUOR_UAA   (1<<MMUOR_UAAN)
-+
-+#define MMUSR REG32(MMU_BASE+0x08)
-+#define MMUSR_SPFN  5
-+#define MMUSR_SPF   (1<<MMUSR_SPFN)
-+#define MMUSR_RFN   4
-+#define MMUSR_RF    (1<<MMUSR_RFN)
-+#define MMUSR_WFN   3
-+#define MMUSR_WF    (1<<MMUSR_WFN)
-+#define MMUSR_HITN  1
-+#define MMUSR_HIT   (1<<MMUSR_HITN)
-+
-+#define MMUAR REG32(MMU_BASE+0x10)
-+#define MMUAR_VPN   1
-+#define MMUAR_VP    (0xfffffffe)
-+#define MMUAR_SN    0
-+#define MMUAR_S     (1<<MMUAR_SN)
-+
-+#define MMUTR REG32(MMU_BASE+0x14)
-+#define MMUTR_VAN   10
-+#define MMUTR_VA    (0xfffffc00)
-+#define MMUTR_IDN   2
-+#define MMUTR_ID    (0xff<<MMUTR_IDN)
-+#define MMUTR_SGN   1
-+#define MMUTR_SG    (1<<MMUTR_SGN)
-+#define MMUTR_VN    0
-+#define MMUTR_V     (1<<MMUTR_VN)
-+
-+#define MMUDR REG32(MMU_BASE+0x18)
-+#define MMUDR_PAN   10
-+#define MMUDR_PA    (0xfffffc00)
-+#define MMUDR_SZN   8
-+#define MMUDR_SZ_MASK (0x2<<MMUDR_SZN)
-+#define MMUDR_SZ1M  (0<<MMUDR_SZN)
-+#define MMUDR_SZ4K  (1<<MMUDR_SZN)
-+#define MMUDR_SZ8K  (2<<MMUDR_SZN)
-+#define MMUDR_SZ16M (3<<MMUDR_SZN)
-+#define MMUDR_CMN   6
-+#define MMUDR_INC   (2<<MMUDR_CMN)
-+#define MMUDR_IC    (0<<MMUDR_CMN)
-+#define MMUDR_DWT   (0<<MMUDR_CMN)
-+#define MMUDR_DCB   (1<<MMUDR_CMN)
-+#define MMUDR_DNCP  (2<<MMUDR_CMN)
-+#define MMUDR_DNCIP (3<<MMUDR_CMN)
-+#define MMUDR_SPN   5
-+#define MMUDR_SP    (1<<MMUDR_SPN)
-+#define MMUDR_RN    4
-+#define MMUDR_R     (1<<MMUDR_RN)
-+#define MMUDR_WN    3
-+#define MMUDR_W     (1<<MMUDR_WN)
-+#define MMUDR_XN    2
-+#define MMUDR_X     (1<<MMUDR_XN)
-+#define MMUDR_LKN   1
-+#define MMUDR_LK    (1<<MMUDR_LKN)
-+
-+
-+#ifndef __ASSEMBLY__
-+#define CF_PMEGS_NUM          256
-+#define CF_INVALID_CONTEXT    255
-+#define CF_PAGE_PGNUM_MASK    (PAGE_MASK)
-+
-+extern int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb,
-+                     int extension_word);
-+#endif /* __ASSEMBLY__*/
-+
-+#endif        /* !__CF_MMU_H__ */
---- /dev/null
-+++ b/include/asm-m68k/cf_pgalloc.h
-@@ -0,0 +1,103 @@
-+#ifndef M68K_CF_PGALLOC_H
-+#define M68K_CF_PGALLOC_H
-+
-+#include <asm/coldfire.h>
-+#include <asm/page.h>
-+#include <asm/cf_tlbflush.h>
-+#include <asm/cf_cacheflush.h>
-+
-+extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
-+{
-+      free_page((unsigned long) pte);
-+}
-+
-+extern const char bad_pmd_string[];
-+
-+extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
-+      unsigned long address)
-+{
-+      unsigned long page = __get_free_page(GFP_DMA|__GFP_REPEAT);
-+
-+      if (!page)
-+              return NULL;
-+
-+      memset((void *)page, 0, PAGE_SIZE);
-+      return (pte_t *) (page);
-+}
-+
-+extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
-+{
-+      return (pmd_t *) pgd;
-+}
-+
-+#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
-+#define pmd_alloc_one(mm, address)      ({ BUG(); ((pmd_t *)2); })
-+
-+#define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr)
-+
-+#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
-+      (unsigned long)(page_address(page)))
-+
-+#define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
-+
-+#define pmd_pgtable(pmd) pmd_page(pmd)
-+
-+static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page)
-+{
-+      __free_page(page);
-+}
-+
-+#define __pmd_free_tlb(tlb, pmd) do { } while (0)
-+
-+static inline struct page *pte_alloc_one(struct mm_struct *mm,
-+      unsigned long address)
-+{
-+      struct page *page = alloc_pages(GFP_DMA|__GFP_REPEAT, 0);
-+      pte_t *pte;
-+
-+      if (!page)
-+              return NULL;
-+
-+      pte = kmap(page);
-+      if (pte) {
-+              clear_page(pte);
-+              __flush_page_to_ram(pte);
-+              flush_tlb_kernel_page(pte);
-+              nocache_page(pte);
-+      }
-+      kunmap(pte);
-+
-+      return page;
-+}
-+
-+extern inline void pte_free(struct mm_struct *mm, struct page *page)
-+{
-+      __free_page(page);
-+}
-+
-+/*
-+ * In our implementation, each pgd entry contains 1 pmd that is never allocated
-+ * or freed.  pgd_present is always 1, so this should never be called. -NL
-+ */
-+#define pmd_free(mm, pmd) BUG()
-+
-+extern inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
-+{
-+      free_page((unsigned long) pgd);
-+}
-+
-+extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
-+{
-+     pgd_t *new_pgd;
-+
-+     new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN);
-+     if (!new_pgd)
-+           return NULL;
-+     memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE);
-+     memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT);
-+     return new_pgd;
-+}
-+
-+#define pgd_populate(mm, pmd, pte) BUG()
-+
-+#endif /* M68K_CF_PGALLOC_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_pgtable.h
-@@ -0,0 +1,357 @@
-+#ifndef _CF_PGTABLE_H
-+#define _CF_PGTABLE_H
-+
-+#include <asm/cfmmu.h>
-+#include <asm/page.h>
-+
-+#ifndef __ASSEMBLY__
-+#include <asm/virtconvert.h>
-+#include <linux/linkage.h>
-+
-+/* For virtual address to physical address conversion */
-+#define VTOP(addr)    __pa(addr)
-+#define PTOV(addr)    __va(addr)
-+
-+
-+#endif        /* !__ASSEMBLY__ */
-+
-+/* Page protection values within PTE. */
-+
-+/* MMUDR bits, in proper place. */
-+#define CF_PAGE_LOCKED      (0x00000002)
-+#define CF_PAGE_EXEC        (0x00000004)
-+#define CF_PAGE_WRITABLE    (0x00000008)
-+#define CF_PAGE_READABLE    (0x00000010)
-+#define CF_PAGE_SYSTEM      (0x00000020)
-+#define CF_PAGE_COPYBACK    (0x00000040)
-+#define CF_PAGE_NOCACHE     (0x00000080)
-+
-+#define CF_CACHEMASK       (~0x00000040)
-+#define CF_PAGE_MMUDR_MASK  (0x000000fe)
-+
-+#define _PAGE_NOCACHE030  (CF_PAGE_NOCACHE)
-+
-+/* MMUTR bits, need shifting down.  */
-+#define CF_PAGE_VALID       (0x00000400)
-+#define CF_PAGE_SHARED      (0x00000800)
-+
-+#define CF_PAGE_MMUTR_MASK  (0x00000c00)
-+#define CF_PAGE_MMUTR_SHIFT (10)
-+#define CF_ASID_MMU_SHIFT   (2)
-+
-+/* Fake bits, not implemented in CF, will get masked out before
-+   hitting hardware, and might go away altogether once this port is
-+   complete.  */
-+#if PAGE_SHIFT < 13
-+#error COLDFIRE Error: Pages must be at least 8k in size
-+#endif
-+#define CF_PAGE_ACCESSED    (0x00001000)
-+#define CF_PAGE_FILE        (0x00000200)
-+#define CF_PAGE_DIRTY       (0x00000001)
-+
-+#define _PAGE_CACHE040        0x020   /* 68040 cache mode, cachable, copyback */
-+#define _PAGE_NOCACHE_S 0x040   /* 68040 no-cache mode, serialized */
-+#define _PAGE_NOCACHE   0x060   /* 68040 cache mode, non-serialized */
-+#define _PAGE_CACHE040W 0x000   /* 68040 cache mode, cachable, write-through */
-+#define _DESCTYPE_MASK  0x003
-+#define _CACHEMASK040   (~0x060)
-+#define _PAGE_GLOBAL040 0x400   /* 68040 global bit, used for kva descs */
-+
-+
-+/* Externally used page protection values. */
-+#define _PAGE_PRESENT (CF_PAGE_VALID)
-+#define _PAGE_ACCESSED        (CF_PAGE_ACCESSED)
-+#define _PAGE_DIRTY   (CF_PAGE_DIRTY)
-+#define _PAGE_READWRITE (CF_PAGE_WRITABLE \
-+                      | CF_PAGE_READABLE \
-+                      | CF_PAGE_SYSTEM \
-+                      | CF_PAGE_SHARED)
-+
-+/* Compound page protection values. */
-+#define PAGE_NONE     __pgprot(CF_PAGE_VALID \
-+                               | CF_PAGE_ACCESSED)
-+
-+#define PAGE_SHARED     __pgprot(CF_PAGE_VALID \
-+                               | CF_PAGE_ACCESSED \
-+                               | CF_PAGE_SHARED)
-+
-+#define PAGE_INIT     __pgprot(CF_PAGE_VALID \
-+                               | CF_PAGE_WRITABLE \
-+                               | CF_PAGE_READABLE \
-+                               | CF_PAGE_EXEC \
-+                               | CF_PAGE_SYSTEM \
-+                               | CF_PAGE_SHARED)
-+
-+#define PAGE_KERNEL   __pgprot(CF_PAGE_VALID \
-+                               | CF_PAGE_WRITABLE \
-+                               | CF_PAGE_READABLE \
-+                               | CF_PAGE_EXEC \
-+                               | CF_PAGE_SYSTEM \
-+                               | CF_PAGE_SHARED \
-+                               | CF_PAGE_ACCESSED)
-+
-+#define PAGE_COPY     __pgprot(CF_PAGE_VALID \
-+                               | CF_PAGE_ACCESSED \
-+                               | CF_PAGE_READABLE \
-+                               | CF_PAGE_DIRTY)
-+/*
-+ * Page protections for initialising protection_map.  See mm/mmap.c
-+ * for use.  In general, the bit positions are xwr, and P-items are
-+ * private, the S-items are shared.
-+ */
-+
-+#define __P000        PAGE_NONE
-+#define __P100        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_EXEC)
-+#define __P010        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_WRITABLE \
-+                       | CF_PAGE_ACCESSED)
-+#define __P110        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_WRITABLE \
-+                       | CF_PAGE_EXEC)
-+#define __P001        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_READABLE)
-+#define __P101        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_READABLE \
-+                       | CF_PAGE_EXEC)
-+#define __P011        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_READABLE \
-+                       | CF_PAGE_WRITABLE \
-+                       | CF_PAGE_ACCESSED)
-+#define __P111        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_WRITABLE \
-+                       | CF_PAGE_READABLE \
-+                       | CF_PAGE_EXEC)
-+
-+#define __S000        PAGE_NONE
-+#define __S100        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_EXEC)
-+#define __S010        PAGE_SHARED
-+#define __S110        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_EXEC)
-+#define __S001        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_READABLE)
-+#define __S101        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_READABLE \
-+                       | CF_PAGE_EXEC)
-+#define __S011        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_READABLE)
-+#define __S111        __pgprot(CF_PAGE_VALID \
-+                       | CF_PAGE_ACCESSED \
-+                       | CF_PAGE_SHARED \
-+                       | CF_PAGE_READABLE \
-+                       | CF_PAGE_EXEC)
-+
-+#define PTE_MASK      PAGE_MASK
-+#define CF_PAGE_CHG_MASK      (PTE_MASK | CF_PAGE_ACCESSED | CF_PAGE_DIRTY)
-+
-+#ifndef __ASSEMBLY__
-+
-+/*
-+ * Conversion functions: convert a page and protection to a page entry,
-+ * and a page entry and page directory to the page they refer to.
-+ */
-+#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
-+
-+extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-+{
-+      pte_val(pte) = (pte_val(pte) & CF_PAGE_CHG_MASK) | pgprot_val(newprot);
-+      return pte;
-+}
-+
-+#define pmd_set(pmdp, ptep) do {} while (0)
-+
-+extern inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
-+{
-+      pgd_val(*pgdp) = virt_to_phys(pmdp);
-+}
-+
-+#define __pte_page(pte) \
-+      ((unsigned long) ((pte_val(pte) & CF_PAGE_PGNUM_MASK) + PAGE_OFFSET))
-+#define __pmd_page(pmd) ((unsigned long) (pmd_val(pmd)))
-+
-+extern inline int pte_none(pte_t pte)
-+{
-+      return !pte_val(pte);
-+}
-+extern inline int pte_present(pte_t pte)
-+{
-+      return pte_val(pte) & CF_PAGE_VALID;
-+}
-+extern inline void pte_clear(struct mm_struct *mm, unsigned long addr,
-+      pte_t *ptep)
-+{
-+      pte_val(*ptep) = 0;
-+}
-+
-+#define pte_pagenr(pte)               ((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT)
-+#define pte_page(pte)         virt_to_page(__pte_page(pte))
-+
-+extern inline int pmd_none2(pmd_t *pmd) { return !pmd_val(*pmd); }
-+#define pmd_none(pmd) pmd_none2(&(pmd))
-+extern inline int pmd_bad2(pmd_t *pmd) { return 0; }
-+#define pmd_bad(pmd) pmd_bad2(&(pmd))
-+#define pmd_present(pmd) (!pmd_none2(&(pmd)))
-+extern inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = 0; }
-+
-+extern inline int pgd_none(pgd_t pgd) { return 0; }
-+extern inline int pgd_bad(pgd_t pgd) { return 0; }
-+extern inline int pgd_present(pgd_t pgd) { return 1; }
-+extern inline void pgd_clear(pgd_t *pgdp) {}
-+
-+
-+#define pte_ERROR(e) \
-+      printk(KERN_ERR "%s:%d: bad pte %08lx.\n",      \
-+      __FILE__, __LINE__, pte_val(e))
-+#define pmd_ERROR(e) \
-+      printk(KERN_ERR "%s:%d: bad pmd %08lx.\n",      \
-+      __FILE__, __LINE__, pmd_val(e))
-+#define pgd_ERROR(e) \
-+      printk(KERN_ERR "%s:%d: bad pgd %08lx.\n",      \
-+      __FILE__, __LINE__, pgd_val(e))
-+
-+
-+/*
-+ * The following only work if pte_present() is true.
-+ * Undefined behaviour if not...
-+ * [we have the full set here even if they don't change from m68k]
-+ */
-+extern inline int pte_read(pte_t pte) \
-+      { return pte_val(pte) & CF_PAGE_READABLE; }
-+extern inline int pte_write(pte_t pte)        \
-+      { return pte_val(pte) & CF_PAGE_WRITABLE; }
-+extern inline int pte_exec(pte_t pte) \
-+      { return pte_val(pte) & CF_PAGE_EXEC; }
-+extern inline int pte_dirty(pte_t pte)        \
-+      { return pte_val(pte) & CF_PAGE_DIRTY; }
-+extern inline int pte_young(pte_t pte)        \
-+      { return pte_val(pte) & CF_PAGE_ACCESSED; }
-+extern inline int pte_file(pte_t pte) \
-+      { return pte_val(pte) & CF_PAGE_FILE; }
-+
-+extern inline pte_t pte_wrprotect(pte_t pte)  \
-+      { pte_val(pte) &= ~CF_PAGE_WRITABLE; return pte; }
-+extern inline pte_t pte_rdprotect(pte_t pte)  \
-+      { pte_val(pte) &= ~CF_PAGE_READABLE; return pte; }
-+extern inline pte_t pte_exprotect(pte_t pte)  \
-+      { pte_val(pte) &= ~CF_PAGE_EXEC; return pte; }
-+extern inline pte_t pte_mkclean(pte_t pte)    \
-+      { pte_val(pte) &= ~CF_PAGE_DIRTY; return pte; }
-+extern inline pte_t pte_mkold(pte_t pte)      \
-+      { pte_val(pte) &= ~CF_PAGE_ACCESSED; return pte; }
-+extern inline pte_t pte_mkwrite(pte_t pte)    \
-+      { pte_val(pte) |= CF_PAGE_WRITABLE; return pte; }
-+extern inline pte_t pte_mkread(pte_t pte)     \
-+      { pte_val(pte) |= CF_PAGE_READABLE; return pte; }
-+extern inline pte_t pte_mkexec(pte_t pte)     \
-+      { pte_val(pte) |= CF_PAGE_EXEC; return pte; }
-+extern inline pte_t pte_mkdirty(pte_t pte)    \
-+      { pte_val(pte) |= CF_PAGE_DIRTY; return pte; }
-+extern inline pte_t pte_mkyoung(pte_t pte)    \
-+      { pte_val(pte) |= CF_PAGE_ACCESSED; return pte; }
-+extern inline pte_t pte_mknocache(pte_t pte)  \
-+      { pte_val(pte) |= 0x80 | (pte_val(pte) & ~0x40); return pte; }
-+extern inline pte_t pte_mkcache(pte_t pte)    \
-+      { pte_val(pte) &= ~CF_PAGE_NOCACHE; return pte; }
-+
-+#define swapper_pg_dir kernel_pg_dir
-+extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
-+
-+/* Find an entry in a pagetable directory. */
-+#define pgd_index(address)     ((address) >> PGDIR_SHIFT)
-+
-+#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
-+
-+/* Find an entry in a kernel pagetable directory. */
-+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-+
-+/* Find an entry in the second-level pagetable. */
-+extern inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address)
-+{
-+      return (pmd_t *) pgd;
-+}
-+
-+/* Find an entry in the third-level pagetable. */
-+#define __pte_offset(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-+#define pte_offset_kernel(dir, address) ((pte_t *) __pmd_page(*(dir)) + \
-+                                        __pte_offset(address))
-+
-+/* Disable caching for page at given kernel virtual address. */
-+static inline void nocache_page(void *vaddr)
-+{
-+      pgd_t *dir;
-+      pmd_t *pmdp;
-+      pte_t *ptep;
-+      unsigned long addr = (unsigned long)vaddr;
-+
-+      dir = pgd_offset_k(addr);
-+      pmdp = pmd_offset(dir, addr);
-+      ptep = pte_offset_kernel(pmdp, addr);
-+      *ptep = pte_mknocache(*ptep);
-+}
-+
-+/* Enable caching for page at given kernel virtual address. */
-+static inline void cache_page(void *vaddr)
-+{
-+      pgd_t *dir;
-+      pmd_t *pmdp;
-+      pte_t *ptep;
-+      unsigned long addr = (unsigned long)vaddr;
-+
-+      dir = pgd_offset_k(addr);
-+      pmdp = pmd_offset(dir, addr);
-+      ptep = pte_offset_kernel(pmdp, addr);
-+      *ptep = pte_mkcache(*ptep);
-+}
-+
-+#define PTE_FILE_MAX_BITS     21
-+#define PTE_FILE_SHIFT                11
-+
-+static inline unsigned long pte_to_pgoff(pte_t pte)
-+{
-+      return pte_val(pte) >> PTE_FILE_SHIFT;
-+}
-+
-+static inline pte_t pgoff_to_pte(unsigned pgoff)
-+{
-+      pte_t pte = __pte((pgoff << PTE_FILE_SHIFT) + CF_PAGE_FILE);
-+      return pte;
-+}
-+
-+/* Encode and de-code a swap entry (must be !pte_none(e) && !pte_present(e)) */
-+#define __swp_entry(type, offset) ((swp_entry_t) { (type) |   \
-+                                 (offset << PTE_FILE_SHIFT) })
-+#define __swp_type(x)         ((x).val & 0xFF)
-+#define __swp_offset(x)               ((x).val >> PTE_FILE_SHIFT)
-+#define __pte_to_swp_entry(pte)       ((swp_entry_t) { pte_val(pte) })
-+#define __swp_entry_to_pte(x) (__pte((x).val))
-+
-+#define pmd_page(pmd)         (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-+
-+#define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) +   \
-+                                     __pte_offset(address))
-+#define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address)
-+#define pte_unmap(pte) kunmap(pte)
-+#define pte_unmap_nested(pte) kunmap(pte)
-+
-+#define pfn_pte(pfn, prot)    __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-+#define pte_pfn(pte)          (pte_val(pte) >> PAGE_SHIFT)
-+
-+
-+#endif        /* !__ASSEMBLY__ */
-+#endif        /* !_CF_PGTABLE_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_tlbflush.h
-@@ -0,0 +1,59 @@
-+#ifndef M68K_CF_TLBFLUSH_H
-+#define M68K_CF_TLBFLUSH_H
-+
-+#include <asm/coldfire.h>
-+
-+/* Flush all userspace mappings.  */
-+static inline void flush_tlb_all(void)
-+{
-+      preempt_disable();
-+      *MMUOR = MMUOR_CNL;
-+      preempt_enable();
-+}
-+
-+/* Clear user TLB entries within the context named in mm */
-+static inline void flush_tlb_mm(struct mm_struct *mm)
-+{
-+      preempt_disable();
-+      *MMUOR = MMUOR_CNL;
-+      preempt_enable();
-+}
-+
-+/* Flush a single TLB page.  */
-+static inline void flush_tlb_page(struct vm_area_struct *vma,
-+                                 unsigned long addr)
-+{
-+      preempt_disable();
-+      *MMUOR = MMUOR_CNL;
-+      preempt_enable();
-+}
-+/* Flush a range of pages from TLB. */
-+
-+static inline void flush_tlb_range(struct mm_struct *mm,
-+                    unsigned long start, unsigned long end)
-+{
-+      preempt_disable();
-+      *MMUOR = MMUOR_CNL;
-+      preempt_enable();
-+}
-+
-+/* Flush kernel page from TLB. */
-+static inline void flush_tlb_kernel_page(void *addr)
-+{
-+      preempt_disable();
-+      *MMUOR = MMUOR_CNL;
-+      preempt_enable();
-+}
-+
-+static inline void flush_tlb_kernel_range(unsigned long start,
-+      unsigned long end)
-+{
-+      flush_tlb_all();
-+}
-+
-+extern inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+}
-+
-+#endif /* M68K_CF_TLBFLUSH_H */
---- /dev/null
-+++ b/include/asm-m68k/cf_uaccess.h
-@@ -0,0 +1,376 @@
-+#ifndef __M68K_CF_UACCESS_H
-+#define __M68K_CF_UACCESS_H
-+
-+/*
-+ * User space memory access functions
-+ */
-+
-+/* The "moves" command is not available in the CF instruction set. */
-+#include <linux/compiler.h>
-+#include <linux/errno.h>
-+#include <linux/types.h>
-+#include <linux/sched.h>
-+#include <asm/segment.h>
-+
-+#define VERIFY_READ   0
-+#define VERIFY_WRITE  1
-+
-+/* We let the MMU do all checking */
-+#define access_ok(type, addr, size) 1
-+
-+/*
-+ * The exception table consists of pairs of addresses: the first is the
-+ * address of an instruction that is allowed to fault, and the second is
-+ * the address at which the program should continue.  No registers are
-+ * modified, so it is entirely up to the continuation code to figure out
-+ * what to do.
-+ *
-+ * All the routines below use bits of fixup code that are out of line
-+ * with the main instruction path.  This means when everything is well,
-+ * we don't even have to jump over them.  Further, they do not intrude
-+ * on our cache or tlb entries.
-+ */
-+
-+struct exception_table_entry
-+{
-+      unsigned long insn, fixup;
-+};
-+
-+extern int __put_user_bad(void);
-+extern int __get_user_bad(void);
-+
-+#define __put_user_asm(res, x, ptr, bwl, reg, err)    \
-+asm volatile ("\n"                                    \
-+      "1:     move."#bwl"     %2,%1\n"                \
-+      "2:\n"                                          \
-+      "       .section .fixup,\"ax\"\n"               \
-+      "       .even\n"                                \
-+      "10:    moveq.l %3,%0\n"                        \
-+      "       jra 2b\n"                               \
-+      "       .previous\n"                            \
-+      "\n"                                            \
-+      "       .section __ex_table,\"a\"\n"            \
-+      "       .align  4\n"                            \
-+      "       .long   1b,10b\n"                       \
-+      "       .long   2b,10b\n"                       \
-+      "       .previous"                              \
-+      : "+d" (res), "=m" (*(ptr))                     \
-+      : #reg (x), "i" (err))
-+
-+/*
-+ * These are the main single-value transfer routines.  They automatically
-+ * use the right size if we just have the right pointer type.
-+ */
-+
-+#define __put_user(x, ptr)                                            \
-+({                                                                    \
-+      typeof(*(ptr)) __pu_val = (x);                                  \
-+      int __pu_err = 0;                                               \
-+      __chk_user_ptr(ptr);                                            \
-+      switch (sizeof (*(ptr))) {                                      \
-+      case 1:                                                         \
-+              __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
-+              break;                                                  \
-+      case 2:                                                         \
-+              __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \
-+              break;                                                  \
-+      case 4:                                                         \
-+              __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
-+              break;                                                  \
-+      case 8:                                                         \
-+              {                                                       \
-+              const void __user *__pu_ptr = (ptr);                    \
-+              asm volatile ("\n"                                      \
-+                      "1:     move.l  %2,(%1)+\n"                     \
-+                      "2:     move.l  %R2,(%1)\n"                     \
-+                      "3:\n"                                          \
-+                      "       .section .fixup,\"ax\"\n"               \
-+                      "       .even\n"                                \
-+                      "10:    movel %3,%0\n"                          \
-+                      "       jra 3b\n"                               \
-+                      "       .previous\n"                            \
-+                      "\n"                                            \
-+                      "       .section __ex_table,\"a\"\n"            \
-+                      "       .align 4\n"                             \
-+                      "       .long 1b,10b\n"                         \
-+                      "       .long 2b,10b\n"                         \
-+                      "       .long 3b,10b\n"                         \
-+                      "       .previous"                              \
-+                      : "+d" (__pu_err), "+a" (__pu_ptr)              \
-+                      : "r" (__pu_val), "i" (-EFAULT)                 \
-+                      : "memory");                                    \
-+              break;                                                  \
-+          }                                                           \
-+      default:                                                        \
-+              __pu_err = __put_user_bad();                            \
-+              break;                                                  \
-+      }                                                               \
-+      __pu_err;                                                       \
-+})
-+#define put_user(x, ptr)      __put_user(x, ptr)
-+
-+
-+#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({   \
-+      type __gu_val;                                          \
-+      asm volatile ("\n"                                      \
-+              "1:     move."#bwl"     %2,%1\n"                \
-+              "2:\n"                                          \
-+              "       .section .fixup,\"ax\"\n"               \
-+              "       .even\n"                                \
-+              "10:    move.l  %3,%0\n"                        \
-+              "       subl    %1,%1\n"                        \
-+              "       jra     2b\n"                           \
-+              "       .previous\n"                            \
-+              "\n"                                            \
-+              "       .section __ex_table,\"a\"\n"            \
-+              "       .align  4\n"                            \
-+              "       .long   1b,10b\n"                       \
-+              "       .previous"                              \
-+              : "+d" (res), "=&" #reg (__gu_val)              \
-+              : "m" (*(ptr)), "i" (err));                     \
-+      (x) = (typeof(*(ptr)))(unsigned long)__gu_val;          \
-+})
-+
-+#define __get_user(x, ptr)                                            \
-+({                                                                    \
-+      int __gu_err = 0;                                               \
-+      __chk_user_ptr(ptr);                                            \
-+      switch (sizeof(*(ptr))) {                                       \
-+      case 1:                                                         \
-+              __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT);    \
-+              break;                                                  \
-+      case 2:                                                         \
-+              __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT);   \
-+              break;                                                  \
-+      case 4:                                                         \
-+              __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT);   \
-+              break;                                                  \
-+/*    case 8: disabled because gcc-4.1 has a broken typeof            \
-+              {                                                       \
-+              const void *__gu_ptr = (ptr);                           \
-+              u64 __gu_val;                                           \
-+              asm volatile ("\n"                                      \
-+                      "1:     move.l  (%2)+,%1\n"                     \
-+                      "2:     move.l  (%2),%R1\n"                     \
-+                      "3:\n"                                          \
-+                      "       .section .fixup,\"ax\"\n"               \
-+                      "       .even\n"                                \
-+                      "10:    move.l  %3,%0\n"                        \
-+                      "       subl    %1,%1\n"                        \
-+                      "       subl    %R1,%R1\n"                      \
-+                      "       jra     3b\n"                           \
-+                      "       .previous\n"                            \
-+                      "\n"                                            \
-+                      "       .section __ex_table,\"a\"\n"            \
-+                      "       .align  4\n"                            \
-+                      "       .long   1b,10b\n"                       \
-+                      "       .long   2b,10b\n"                       \
-+                      "       .previous"                              \
-+                      : "+d" (__gu_err), "=&r" (__gu_val),            \
-+                        "+a" (__gu_ptr)                               \
-+                      : "i" (-EFAULT)                                 \
-+                      : "memory");                                    \
-+              (x) = (typeof(*(ptr)))__gu_val;                         \
-+              break;                                                  \
-+          }   */                                                      \
-+      default:                                                        \
-+              __gu_err = __get_user_bad();                            \
-+              break;                                                  \
-+      }                                                               \
-+      __gu_err;                                                       \
-+})
-+#define get_user(x, ptr) __get_user(x, ptr)
-+
-+unsigned long __generic_copy_from_user(void *to, const void __user *from,
-+      unsigned long n);
-+unsigned long __generic_copy_to_user(void __user *to, const void *from,
-+      unsigned long n);
-+
-+#define __constant_copy_from_user_asm(res, to, from, tmp, n, s1, s2, s3)\
-+      asm volatile ("\n"                                              \
-+              "1:     move."#s1"      (%2)+,%3\n"                     \
-+              "       move."#s1"      %3,(%1)+\n"                     \
-+              "2:     move."#s2"      (%2)+,%3\n"                     \
-+              "       move."#s2"      %3,(%1)+\n"                     \
-+              "       .ifnc   \""#s3"\",\"\"\n"                       \
-+              "3:     move."#s3"      (%2)+,%3\n"                     \
-+              "       move."#s3"      %3,(%1)+\n"                     \
-+              "       .endif\n"                                       \
-+              "4:\n"                                                  \
-+              "       .section __ex_table,\"a\"\n"                    \
-+              "       .align  4\n"                                    \
-+              "       .long   1b,10f\n"                               \
-+              "       .long   2b,20f\n"                               \
-+              "       .ifnc   \""#s3"\",\"\"\n"                       \
-+              "       .long   3b,30f\n"                               \
-+              "       .endif\n"                                       \
-+              "       .previous\n"                                    \
-+              "\n"                                                    \
-+              "       .section .fixup,\"ax\"\n"                       \
-+              "       .even\n"                                        \
-+              "10:    clr."#s1"       (%1)+\n"                        \
-+              "20:    clr."#s2"       (%1)+\n"                        \
-+              "       .ifnc   \""#s3"\",\"\"\n"                       \
-+              "30:    clr."#s3"       (%1)+\n"                        \
-+              "       .endif\n"                                       \
-+              "       moveq.l #"#n",%0\n"                             \
-+              "       jra     4b\n"                                   \
-+              "       .previous\n"                                    \
-+              : "+d" (res), "+&a" (to), "+a" (from), "=&d" (tmp)      \
-+              : : "memory")
-+
-+static __always_inline unsigned long
-+__constant_copy_from_user(void *to, const void __user *from, unsigned long n)
-+{
-+      unsigned long res = 0, tmp;
-+
-+      switch (n) {
-+      case 1:
-+              __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
-+              break;
-+      case 2:
-+              __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w,
-+                      d, 2);
-+              break;
-+      case 3:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
-+              break;
-+      case 4:
-+              __get_user_asm(res, *(u32 *)to, (u32 __user *)from, u32, l,
-+                      r, 4);
-+              break;
-+      case 5:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 5, l, b,);
-+              break;
-+      case 6:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 6, l, w,);
-+              break;
-+      case 7:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 7, l, w, b);
-+              break;
-+      case 8:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 8, l, l,);
-+              break;
-+      case 9:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 9, l, l, b);
-+              break;
-+      case 10:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 10, l, l, w);
-+              break;
-+      case 12:
-+              __constant_copy_from_user_asm(res, to, from, tmp, 12, l, l, l);
-+              break;
-+      default:
-+              /* we limit the inlined version to 3 moves */
-+              return __generic_copy_from_user(to, from, n);
-+      }
-+
-+      return res;
-+}
-+
-+#define __constant_copy_to_user_asm(res, to, from, tmp, n, s1, s2, s3)        \
-+      asm volatile ("\n"                                              \
-+              "       move."#s1"      (%2)+,%3\n"                     \
-+              "11:    move."#s1"      %3,(%1)+\n"                     \
-+              "12:    move."#s2"      (%2)+,%3\n"                     \
-+              "21:    move."#s2"      %3,(%1)+\n"                     \
-+              "22:\n"                                                 \
-+              "       .ifnc   \""#s3"\",\"\"\n"                       \
-+              "       move."#s3"      (%2)+,%3\n"                     \
-+              "31:    move."#s3"      %3,(%1)+\n"                     \
-+              "32:\n"                                                 \
-+              "       .endif\n"                                       \
-+              "4:\n"                                                  \
-+              "\n"                                                    \
-+              "       .section __ex_table,\"a\"\n"                    \
-+              "       .align  4\n"                                    \
-+              "       .long   11b,5f\n"                               \
-+              "       .long   12b,5f\n"                               \
-+              "       .long   21b,5f\n"                               \
-+              "       .long   22b,5f\n"                               \
-+              "       .ifnc   \""#s3"\",\"\"\n"                       \
-+              "       .long   31b,5f\n"                               \
-+              "       .long   32b,5f\n"                               \
-+              "       .endif\n"                                       \
-+              "       .previous\n"                                    \
-+              "\n"                                                    \
-+              "       .section .fixup,\"ax\"\n"                       \
-+              "       .even\n"                                        \
-+              "5:     moveq.l #"#n",%0\n"                             \
-+              "       jra     4b\n"                                   \
-+              "       .previous\n"                                    \
-+              : "+d" (res), "+a" (to), "+a" (from), "=&d" (tmp)       \
-+              : : "memory")
-+
-+static __always_inline unsigned long
-+__constant_copy_to_user(void __user *to, const void *from, unsigned long n)
-+{
-+      unsigned long res = 0, tmp;
-+
-+      switch (n) {
-+      case 1:
-+              __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
-+              break;
-+      case 2:
-+              __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2);
-+              break;
-+      case 3:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
-+              break;
-+      case 4:
-+              __put_user_asm(res, *(u32 *)from, (u32 __user *)to, l, r, 4);
-+              break;
-+      case 5:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,);
-+              break;
-+      case 6:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 6, l, w,);
-+              break;
-+      case 7:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 7, l, w, b);
-+              break;
-+      case 8:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 8, l, l,);
-+              break;
-+      case 9:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 9, l, l, b);
-+              break;
-+      case 10:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 10, l, l, w);
-+              break;
-+      case 12:
-+              __constant_copy_to_user_asm(res, to, from, tmp, 12, l, l, l);
-+              break;
-+      default:
-+              /* limit the inlined version to 3 moves */
-+              return __generic_copy_to_user(to, from, n);
-+      }
-+
-+      return res;
-+}
-+
-+#define __copy_from_user(to, from, n)         \
-+(__builtin_constant_p(n) ?                    \
-+ __constant_copy_from_user(to, from, n) :     \
-+ __generic_copy_from_user(to, from, n))
-+
-+#define __copy_to_user(to, from, n)           \
-+(__builtin_constant_p(n) ?                    \
-+ __constant_copy_to_user(to, from, n) :               \
-+ __generic_copy_to_user(to, from, n))
-+
-+#define __copy_to_user_inatomic               __copy_to_user
-+#define __copy_from_user_inatomic     __copy_from_user
-+
-+#define copy_from_user(to, from, n)   __copy_from_user(to, from, n)
-+#define copy_to_user(to, from, n)     __copy_to_user(to, from, n)
-+
-+long strncpy_from_user(char *dst, const char __user *src, long count);
-+long strnlen_user(const char __user *src, long n);
-+unsigned long __clear_user(void __user *to, unsigned long n);
-+
-+#define clear_user __clear_user
-+
-+#define strlen_user(str) strnlen_user(str, 32767)
-+
-+#endif /* _M68K_CF_UACCESS_H */
---- a/include/asm-m68k/checksum.h
-+++ b/include/asm-m68k/checksum.h
-@@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck(
-                                             void *dst, int len,
-                                             __wsum sum);
-+#ifndef CONFIG_COLDFIRE  /* CF has own copy in arch/m68k/lib/checksum.c */
- /*
-  *    This is a version of ip_compute_csum() optimized for IP headers,
-  *    which always checksum on 4 octet boundaries.
-@@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const
-                : "memory");
-       return (__force __sum16)~sum;
- }
-+#else
-+extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
-+#endif
- /*
-  *    Fold a partial checksum
-@@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const
- static inline __sum16 csum_fold(__wsum sum)
- {
-       unsigned int tmp = (__force u32)sum;
-+#ifdef CONFIG_COLDFIRE
-+      tmp = (tmp & 0xffff) + (tmp >> 16);
-+      tmp = (tmp & 0xffff) + (tmp >> 16);
-+      return (__force __sum16) ~tmp;
-+#else
-       __asm__("swap %1\n\t"
-               "addw %1, %0\n\t"
-               "clrw %1\n\t"
-@@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s
-               : "=&d" (sum), "=&d" (tmp)
-               : "0" (sum), "1" (tmp));
-       return (__force __sum16)~sum;
-+#endif
- }
---- /dev/null
-+++ b/include/asm-m68k/coldfire_edma.h
-@@ -0,0 +1,125 @@
-+/*
-+ * coldfire_edma.h - eDMA driver for Coldfire MCF5445x
-+ *
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef _LINUX_COLDFIRE_DMA_H
-+#define _LINUX_COLDFIRE_DMA_H
-+
-+#include <linux/interrupt.h>
-+#include <asm/mcf5445x_edma.h>
-+
-+#define EDMA_DRIVER_NAME "ColdFire-eDMA"
-+#define DMA_DEV_MINOR 1
-+
-+#ifdef CONFIG_M5445X
-+#define EDMA_INT_CHANNEL_BASE                 8
-+#define EDMA_INT_CONTROLLER_BASE      64
-+#define EDMA_INT_BASE                 (EDMA_INT_CHANNEL_BASE + \
-+                                       EDMA_INT_CONTROLLER_BASE)
-+#define EDMA_CHANNELS                 16
-+#define EDMA_INT_ERR                  16      /* edma error interrupt */
-+#endif /* CONFIG_M5445X */
-+ 
-+typedef irqreturn_t (*edma_irq_handler)(int, void *);
-+typedef void (*edma_error_handler)(int, void *);
-+ 
-+/* Setup transfer control descriptor (TCD)
-+ *   channel - descriptor number
-+ *   source  - source address
-+ *   dest    - destination address
-+ *   attr    - attributes
-+ *   soff    - source offset
-+ *   nbytes  - number of bytes to be transfered in minor loop
-+ *   slast   - last source address adjustment
-+ *   citer   - major loop count
-+ *   biter   - begining minor loop count
-+ *   doff    - destination offset
-+ *   dlast_sga - last destination address adjustment
-+ *   major_int - generate interrupt after each major loop
-+ *   disable_req - disable DMA request after major loop
-+ */
-+void set_edma_params(int channel, u32 source, u32 dest,
-+              u32 attr, u32 soff, u32 nbytes, u32 slast,
-+              u32 citer, u32 biter, u32 doff, u32 dlast_sga,
-+              int major_int, int disable_req);
-+
-+/* Starts eDMA transfer on specified channel
-+ *   channel - eDMA TCD number
-+ */
-+static inline void  start_edma_transfer(int channel)
-+{
-+      MCF_EDMA_SERQ = channel;
-+      MCF_EDMA_SSRT = channel;
-+}
-+
-+/* Stops eDMA transfer
-+ *   channel - eDMA TCD number
-+ */
-+static inline void stop_edma_transfer(int channel)
-+{
-+      MCF_EDMA_CINT = channel;
-+      MCF_EDMA_CERQ = channel;
-+}
-+
-+
-+/* Confirm that interrupt has been handled
-+ *   channel - eDMA TCD number
-+ */
-+static inline void confirm_edma_interrupt_handled(int channel)
-+{
-+      MCF_EDMA_CINT = channel;
-+}
-+ 
-+/* Initialize eDMA controller */
-+void init_edma(void);
-+ 
-+/* Request eDMA channel:
-+ *   channel - eDMA TCD number
-+ *   handler - channel IRQ callback
-+ *   error_handler - error interrupt handler callback for channel
-+ *   dev - device
-+ *   lock - spinlock to be locked (can be NULL)
-+ *   device_id - device driver name for proc file system output
-+ */
-+int request_edma_channel(int channel,
-+              edma_irq_handler handler,
-+              edma_error_handler error_handler,
-+              void *dev,
-+              spinlock_t *lock,
-+              const char *device_id);
-+
-+/**
-+ * set_edma_callback - Update the channel callback/arg
-+ * @channel: channel number
-+ * @handler: dma handler
-+ * @error_handler: dma error handler
-+ * @arg: argument to pass back
-+ *
-+ * Returns 0 if success or a negative value if failure
-+ */
-+int set_edma_callback(int channel,
-+              edma_irq_handler handler,
-+              edma_error_handler error_handler,
-+              void *arg);
-+  
-+/* Free eDMA channel
-+ *  channel - eDMA TCD number
-+ *  dev - device
-+ */
-+int free_edma_channel(int channel, void *dev);
-+
-+/*
-+ * DMA Modes
-+ */
-+#define       DMA_MODE_READ           0
-+#define DMA_MODE_WRITE                1
-+#endif
---- /dev/null
-+++ b/include/asm-m68k/coldfire.h
-@@ -0,0 +1,51 @@
-+#ifndef _COLDFIRE_H_
-+#define _COLDFIRE_H_
-+
-+#if defined(CONFIG_M5445X)
-+#define MCF_MBAR      0x0
-+/*
-+ * Even though RAMBAR1 should be in the 0x8xxxxxxx range there
-+ * is a problem that needs to be resolved.  Currently head.S
-+ * disables SRAM/RAMBAR1.
-+ */
-+#define MCF_RAMBAR1   0x40000000
-+#define MCF_SRAM      0x40000000
-+#elif defined(CONFIG_M547X_8X)
-+#define MCF_MBAR      0xF0000000
-+#define MCF_MMUBAR    0xF1000000
-+#define MCF_RAMBAR0   0xF3000000
-+#define MCF_RAMBAR1   0xF3001000
-+#endif
-+
-+#define MCF_CLK       CONFIG_MCFCLK
-+#define MCF_BUSCLK    (CONFIG_MCFCLK/2)
-+
-+#ifdef __ASSEMBLY__
-+#define REG32
-+#define REG16
-+#define REG08
-+#else  /* __ASSEMBLY__ */
-+#define REG32(x) ((volatile unsigned long  *)(x))
-+#define REG16(x) ((volatile unsigned short *)(x))
-+#define REG08(x) ((volatile unsigned char  *)(x))
-+
-+#define MCF_REG32(x) *(volatile unsigned long  *)(MCF_MBAR+(x))
-+#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x))
-+#define MCF_REG08(x) *(volatile unsigned char  *)(MCF_MBAR+(x))
-+
-+void cacr_set(unsigned long);
-+unsigned long cacr_get(void);
-+
-+#define coldfire_enable_irq0(irq)     MCF_INTC0_CIMR = (irq);
-+
-+#define coldfire_enable_irq1(irq)     MCF_INTC1_CIMR = (irq);
-+
-+#define coldfire_disable_irq0(irq)    MCF_INTC0_SIMR = (irq);
-+
-+#define coldfire_disable_irq1(irq)    MCF_INTC1_SIMR = (irq);
-+
-+#define getiprh()                     MCF_INTC0_IPRH
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif  /* _COLDFIRE_H_  */
---- a/include/asm-m68k/delay.h
-+++ b/include/asm-m68k/delay.h
-@@ -11,8 +11,25 @@
- static inline void __delay(unsigned long loops)
- {
-+#if defined(CONFIG_COLDFIRE)
-+      /* The coldfire runs this loop at significantly different speeds
-+       * depending upon long word alignment or not.  We'll pad it to
-+       * long word alignment which is the faster version.
-+       * The 0x4a8e is of course a 'tstl %fp' instruction.  This is better
-+       * than using a NOP (0x4e71) instruction because it executes in one
-+       * cycle not three and doesn't allow for an arbitary delay waiting
-+       * for bus cycles to finish.  Also fp/a6 isn't likely to cause a
-+       * stall waiting for the register to become valid if such is added
-+       * to the coldfire at some stage.
-+       */
-+      __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t"
-+                            "1: subql #1, %0\n\t"
-+                            "jcc 1b"
-+                            : "=d" (loops) : "0" (loops));
-+#else
-       __asm__ __volatile__ ("1: subql #1,%0; jcc 1b"
-               : "=d" (loops) : "0" (loops));
-+#endif
- }
- extern void __bad_udelay(void);
-@@ -26,12 +43,17 @@ extern void __bad_udelay(void);
-  */
- static inline void __const_udelay(unsigned long xloops)
- {
-+#if defined(CONFIG_COLDFIRE)
-+
-+      __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ);
-+#else
-       unsigned long tmp;
-       __asm__ ("mulul %2,%0:%1"
-               : "=d" (xloops), "=d" (tmp)
-               : "d" (xloops), "1" (loops_per_jiffy));
-       __delay(xloops * HZ);
-+#endif
- }
- static inline void __udelay(unsigned long usecs)
-@@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon
- static inline unsigned long muldiv(unsigned long a, unsigned long b,
-                                  unsigned long c)
- {
-+#if defined(CONFIG_COLDFIRE)
-+      return (long)(((unsigned long long)a * b)/c);
-+#else
-       unsigned long tmp;
-       __asm__ ("mulul %2,%0:%1; divul %3,%0:%1"
-               : "=d" (tmp), "=d" (a)
-               : "d" (b), "d" (c), "1" (a));
-       return a;
-+#endif
- }
- #endif /* defined(_M68K_DELAY_H) */
---- a/include/asm-m68k/div64.h
-+++ b/include/asm-m68k/div64.h
-@@ -5,6 +5,7 @@
- /* n = n / base; return rem; */
-+#ifndef CONFIG_COLDFIRE
- #define do_div(n, base) ({                                    \
-       union {                                                 \
-               unsigned long n32[2];                           \
-@@ -24,6 +25,9 @@
-       (n) = __n.n64;                                          \
-       __rem;                                                  \
- })
-+#else
-+#  include <asm-generic/div64.h>
-+#endif
- extern uint64_t div64_64(uint64_t dividend, uint64_t divisor);
- #endif /* _M68K_DIV64_H */
---- a/include/asm-m68k/dma.h
-+++ b/include/asm-m68k/dma.h
-@@ -1,16 +1,120 @@
- #ifndef _M68K_DMA_H
- #define _M68K_DMA_H 1
--
- /* it's useless on the m68k, but unfortunately needed by the new
-    bootmem allocator (but this should do it for this) */
- #define MAX_DMA_ADDRESS PAGE_OFFSET
-+#ifndef CONFIG_COLDFIRE
- #define MAX_DMA_CHANNELS 8
- extern int request_dma(unsigned int dmanr, const char * device_id);   /* reserve a DMA channel */
- extern void free_dma(unsigned int dmanr);     /* release it again */
-+#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
-+
-+/************************************************
-+ *    Multichannel DMA definitions            *
-+ ************************************************/
-+#ifdef CONFIG_MCD_DMA
-+#include <asm/MCD_dma.h>
-+#include <asm/m5485dma.h>
-+
-+struct scatterlist;
-+
-+#define MAX_DMA_CHANNELS NCHANNELS
-+/*
-+ *  identifiers for each initiator/requestor
-+ */
-+#define DMA_ALWAYS      (0)
-+#define DMA_DSPI_RX     (1)
-+#define DMA_DSPI_TX     (2)
-+#define DMA_DREQ0       (3)
-+#define DMA_PSC0_RX     (4)
-+#define DMA_PSC0_TX     (5)
-+#define DMA_USBEP0      (6)
-+#define DMA_USBEP1      (7)
-+#define DMA_USBEP2      (8)
-+#define DMA_USBEP3      (9)
-+#define DMA_PCI_TX      (10)
-+#define DMA_PCI_RX      (11)
-+#define DMA_PSC1_RX     (12)
-+#define DMA_PSC1_TX     (13)
-+#define DMA_I2C_RX      (14)
-+#define DMA_I2C_TX      (15)
-+#define DMA_FEC0_RX     (16)
-+#define DMA_FEC0_TX     (17)
-+#define DMA_FEC1_RX     (18)
-+#define DMA_FEC1_TX     (19)
-+#define DMA_DREQ1       (20)
-+#define DMA_CTM0        (21)
-+#define DMA_CTM1        (22)
-+#define DMA_CTM2        (23)
-+#define DMA_CTM3        (24)
-+#define DMA_CTM4        (25)
-+#define DMA_CTM5        (26)
-+#define DMA_CTM6        (27)
-+#define DMA_CTM7        (28)
-+#define DMA_USBEP4      (29)
-+#define DMA_USBEP5      (30)
-+#define DMA_USBEP6      (31)
-+#define DMA_PSC2_RX     (32)
-+#define DMA_PSC2_TX     (33)
-+#define DMA_PSC3_RX     (34)
-+#define DMA_PSC3_TX     (35)
-+#define DMA_FEC_RX(x)   ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX)
-+#define DMA_FEC_TX(x)   ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX)
-+
-+int  dma_set_initiator(int);
-+unsigned int dma_get_initiator(int);
-+void dma_remove_initiator(int);
-+int dma_set_channel(int);
-+int dma_get_channel(int);
-+void dma_remove_channel(int);
-+int dma_set_channel_fec(int requestor);
-+int dma_connect(int channel, int address);
-+int dma_disconnect(int channel);
-+void dma_remove_channel_by_number(int channel);
-+int dma_init(void);
-+
-+#endif /* CONFIG_MCD_DMA */
-+
-+extern spinlock_t dma_spin_lock;
-+
-+static __inline__ unsigned long claim_dma_lock(void)
-+{
-+      unsigned long flags;
-+      spin_lock_irqsave(&dma_spin_lock, flags);
-+      return flags;
-+}
-+
-+static __inline__ void release_dma_lock(unsigned long flags)
-+{
-+      spin_unlock_irqrestore(&dma_spin_lock, flags);
-+}
-+
-+
-+/*
-+ *  Linux standard DMA stuff
-+ */
-+#if 0
-+int  request_dma(unsigned int channel, const char * device_id);
-+void free_dma(unsigned int channel);
-+void enable_dma(unsigned int channel);
-+void disable_dma(unsigned int channel);
-+int  dma_channel_active(unsigned int channel);
-+void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg);
-+void set_dma_page(unsigned int channel, char pagenr);
-+void set_dma_addr(unsigned int channel, unsigned long physaddr);
-+void set_dma_count(unsigned int channel, unsigned long count);
-+void set_dma_mode(unsigned int channel, unsigned int mode);
-+void set_dma_speed(unsigned int channel, int cycle_ns);
-+int  get_dma_residue(unsigned int channel);
-+#endif
-+#define clear_dma_ff(channel)
-+
-+#endif /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
-+
- #ifdef CONFIG_PCI
- extern int isa_dma_bridge_buggy;
- #else
---- a/include/asm-m68k/elf.h
-+++ b/include/asm-m68k/elf.h
-@@ -34,6 +34,26 @@
- #define R_68K_GLOB_DAT        20
- #define R_68K_JMP_SLOT        21
- #define R_68K_RELATIVE        22
-+/* TLS static relocations */
-+#define       R_68K_TLS_GD32          25
-+#define       R_68K_TLS_GD16          26
-+#define       R_68K_TLS_GD8           27
-+#define       R_68K_TLS_LDM32         28
-+#define       R_68K_TLS_LDM16         29
-+#define       R_68K_TLS_LDM8          30
-+#define       R_68K_TLS_LDO32         31
-+#define       R_68K_TLS_LDO16         32
-+#define       R_68K_TLS_LDO8          33
-+#define       R_68K_TLS_IE32          34
-+#define       R_68K_TLS_IE16          35
-+#define       R_68K_TLS_IE8           36
-+#define       R_68K_TLS_LE32          37
-+#define       R_68K_TLS_LE16          38
-+#define       R_68K_TLS_LE8           39
-+/* TLS dynamic relocations */
-+#define       R_68K_TLS_DTPMOD32      40
-+#define       R_68K_TLS_DTPREL32      41
-+#define       R_68K_TLS_TPREL32       42
- typedef unsigned long elf_greg_t;
-@@ -60,7 +80,7 @@ typedef struct user_m68kfp_struct elf_fp
- #define ELF_PLAT_INIT(_r, load_addr)  _r->a1 = 0
- #define USE_ELF_CORE_DUMP
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- #define ELF_EXEC_PAGESIZE     4096
- #else
- #define ELF_EXEC_PAGESIZE     8192
-@@ -116,4 +136,35 @@ typedef struct user_m68kfp_struct elf_fp
- #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
-+/*
-+ * VDSO
-+ */
-+#ifdef CONFIG_VSYSCALL
-+extern unsigned int vdso_enabled;
-+
-+#define       VDSO_BASE               ((unsigned long)current->mm->context.vdso)
-+#define       VDSO_SYM(x)             (VDSO_BASE + (unsigned long)(x))
-+
-+#define       VSYSCALL_AUX_ENT                                        \
-+      if (vdso_enabled)                                       \
-+              NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);
-+
-+/* additional pages */
-+#define ARCH_HAS_SETUP_ADDITIONAL_PAGES       1
-+
-+struct linux_binprm;
-+extern int arch_setup_additional_pages(struct linux_binprm *bprm,
-+                                     int executable_stack);
-+
-+#else
-+/* no VSYSCALL_AUX_ENT */
-+#define       VSYSCALL_AUX_ENT
-+#endif
-+
-+#define ARCH_DLINFO                                           \
-+do {                                                          \
-+      /* vsyscall entry */                                    \
-+      VSYSCALL_AUX_ENT;                                       \
-+} while (0);
-+
- #endif
---- a/include/asm-m68k/fpu.h
-+++ b/include/asm-m68k/fpu.h
-@@ -12,6 +12,8 @@
- #define FPSTATESIZE (96/sizeof(unsigned char))
- #elif defined(CONFIG_M68KFPU_EMU)
- #define FPSTATESIZE (28/sizeof(unsigned char))
-+#elif defined(CONFIG_CFV4E)
-+#define FPSTATESIZE (16/sizeof(unsigned char))
- #elif defined(CONFIG_M68060)
- #define FPSTATESIZE (12/sizeof(unsigned char))
- #else
---- a/include/asm-m68k/io.h
-+++ b/include/asm-m68k/io.h
-@@ -204,6 +204,12 @@ static inline u16 __iomem *isa_mtw(unsig
- #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
- #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
-+#ifndef CONFIG_COLDFIRE
-+#define isa_readb(p)       in_8(isa_mtb(p))
-+#define isa_readw(p)       (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p)))
-+#define isa_writeb(val,p)  out_8(isa_mtb(p),(val))
-+#define isa_writew(val,p)  (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val)))
-+#else
- #define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
- #define isa_readw(p)       \
-       (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
-@@ -212,7 +218,7 @@ static inline u16 __iomem *isa_mtw(unsig
- #define isa_writew(val,p)  \
-       (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
-                : out_le16(isa_mtw((unsigned long)(p)),(val)))
--
-+#endif
- static inline void isa_delay(void)
- {
-   switch(ISA_TYPE)
-@@ -285,6 +291,29 @@ static inline void isa_delay(void)
- #endif /* CONFIG_ISA */
- #if defined(CONFIG_PCI)
-+#ifdef CONFIG_COLDFIRE
-+#define inb_p   inb
-+#define inw_p   inw
-+#define inl_p   inl
-+#define outb_p  outb
-+#define outw_p  outw
-+#define outl_p  outl
-+
-+unsigned char  pci_inb(long addr);
-+unsigned short pci_inw(long addr);
-+unsigned long  pci_inl(long addr);
-+void pci_outb(unsigned char  val, long addr);
-+void pci_outw(unsigned short val, long addr);
-+void pci_outl(unsigned long  val, long addr);
-+
-+void pci_insb(volatile unsigned char* addr, unsigned char* buf, int len);
-+void pci_insw(volatile unsigned short* addr, unsigned short* buf, int len);
-+void pci_insl(volatile unsigned long* addr, unsigned long* buf, int len);
-+
-+void pci_outsb(volatile unsigned char* addr, const unsigned char* buf, int len);
-+void pci_outsw(volatile unsigned short* addr, const unsigned short* buf, int len);
-+void pci_outsl(volatile unsigned long* addr, const unsigned long* buf, int len);
-+#endif
- #define readl(addr)      in_le32(addr)
- #define writel(val,addr) out_le32((addr),(val))
-@@ -300,12 +329,48 @@ static inline void isa_delay(void)
- #define readl_relaxed(addr) readl(addr)
- #ifndef CONFIG_ISA
-+#ifndef CONFIG_COLDFIRE
- #define inb(port)      in_8(port)
- #define outb(val,port) out_8((port),(val))
- #define inw(port)      in_le16(port)
- #define outw(val,port) out_le16((port),(val))
- #define inl(port)      in_le32(port)
- #define outl(val,port) out_le32((port),(val))
-+#define insb(port, buf, nr)   \
-+              raw_insb((u8 *)(port), (u8 *)(buf), (nr))
-+#define outsb(port, buf, nr)  \
-+              raw_outsb((u8 *)(port), (u8 *)(buf), (nr))
-+#define insw(port, buf, nr)   \
-+              raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr))
-+#define outsw(port, buf, nr)  \
-+              raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr))
-+#define insl(port, buf, nr)   \
-+              raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
-+#define outsl(port, buf, nr)  \
-+              raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
-+#else
-+#define inb(port)      pci_inb(port)
-+#define outb(val,port) pci_outb((val),(port))
-+#define inw(port)      pci_inw(port)
-+#define outw(val,port) pci_outw((val),(port))
-+#define insb(a,b,c)  pci_insb((volatile unsigned char*)a,(unsigned char*)b,c)
-+#define insw(a,b,c)  pci_insw((volatile unsigned short*)a,(const unsigned short*)b,c)
-+#define insl(a,b,c)  pci_insl((volatile unsigned long*)a,(const unsigned long*)b,c)
-+#define outsb(a,b,c) pci_outsb((volatile unsigned char*)a,(const unsigned char*)b,c)
-+#define outsw(a,b,c) pci_outsw((volatile unsigned short*)a,(const unsigned short*)b,c)
-+#define outsl(a,b,c) pci_outsl((volatile unsigned long*)a,(const unsigned long*)b,c)
-+#define inl(port)        pci_inl(port)
-+#define outl(val,port)   pci_outl((val),(port))
-+#endif
-+
-+#ifndef CONFIG_COLDFIRE
-+#define __raw_readb readb
-+#define __raw_readw readw
-+#define __raw_readl readl
-+#define __raw_writeb writeb
-+#define __raw_writew writew
-+#define __raw_writel writel
-+#endif
- #else
- /*
-@@ -397,10 +462,12 @@ static inline void memcpy_toio(volatile 
-       __builtin_memcpy((void __force *) dst, src, count);
- }
--#ifndef CONFIG_SUN3
--#define IO_SPACE_LIMIT 0xffff
--#else
-+#if defined(CONFIG_SUN3)
- #define IO_SPACE_LIMIT 0x0fffffff
-+#elif defined(CONFIG_COLDFIRE)
-+#define IO_SPACE_LIMIT 0xffffffff
-+#else
-+#define IO_SPACE_LIMIT 0xffff
- #endif
- #endif /* __KERNEL__ */
-@@ -418,4 +485,31 @@ static inline void memcpy_toio(volatile 
-  */
- #define xlate_dev_kmem_ptr(p) p
-+#ifdef CONFIG_COLDFIRE
-+#define __raw_readb(addr) \
-+    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
-+#define __raw_readw(addr) \
-+    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
-+#define __raw_readl(addr) \
-+    ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; })
-+#define __raw_writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
-+#define __raw_writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
-+#define __raw_writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
-+
-+#define memset_io(a, b, c) memset((void *)(a), (b), (c))
-+#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
-+#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
-+#if !defined(readb)
-+#define readb(addr) \
-+    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
-+#define readw(addr) \
-+    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
-+#define readl(addr) \
-+    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
-+#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b))
-+#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b))
-+#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b))
-+#endif /* readb */
-+#endif /* CONFIG_COLDFIRE */
-+
- #endif /* _IO_H */
---- a/include/asm-m68k/irq.h
-+++ b/include/asm-m68k/irq.h
-@@ -11,7 +11,10 @@
-  * Currently the Atari has 72 and the Amiga 24, but if both are
-  * supported in the kernel it is better to make room for 72.
-  */
--#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
-+#if defined(CONFIG_COLDFIRE)
-+#define SYS_IRQS 256
-+#define NR_IRQS SYS_IRQS
-+#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
- #define NR_IRQS 200
- #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
- #define NR_IRQS 72
---- /dev/null
-+++ b/include/asm-m68k/m5485dma.h
-@@ -0,0 +1,97 @@
-+/*
-+ *    m5485dma.h -- ColdFire 547x/548x DMA controller support.
-+ */
-+#ifndef __MCF548X_DMA_H__
-+#define __MCF548X_DMA_H__
-+
-+
-+/* Register read/write macros */
-+#define MCF_DMA_DIPR    (*(volatile u32*)(void*)(MCF_MBAR+0x008014))
-+#define MCF_DMA_DIMR    (*(volatile u32*)(void*)(MCF_MBAR+0x008018))
-+#define MCF_DMA_IMCR    (*(volatile u32*)(void*)(MCF_MBAR+0x00805C))
-+
-+/* Bit definitions and macros for MCF_DMA_DIPR */
-+#define MCF_DMA_DIPR_TASK0           (0x00000001)
-+#define MCF_DMA_DIPR_TASK1           (0x00000002)
-+#define MCF_DMA_DIPR_TASK2           (0x00000004)
-+#define MCF_DMA_DIPR_TASK3           (0x00000008)
-+#define MCF_DMA_DIPR_TASK4           (0x00000010)
-+#define MCF_DMA_DIPR_TASK5           (0x00000020)
-+#define MCF_DMA_DIPR_TASK6           (0x00000040)
-+#define MCF_DMA_DIPR_TASK7           (0x00000080)
-+#define MCF_DMA_DIPR_TASK8           (0x00000100)
-+#define MCF_DMA_DIPR_TASK9           (0x00000200)
-+#define MCF_DMA_DIPR_TASK10          (0x00000400)
-+#define MCF_DMA_DIPR_TASK11          (0x00000800)
-+#define MCF_DMA_DIPR_TASK12          (0x00001000)
-+#define MCF_DMA_DIPR_TASK13          (0x00002000)
-+#define MCF_DMA_DIPR_TASK14          (0x00004000)
-+#define MCF_DMA_DIPR_TASK15          (0x00008000)
-+
-+/* Bit definitions and macros for MCF_DMA_DIMR */
-+#define MCF_DMA_DIMR_TASK0           (0x00000001)
-+#define MCF_DMA_DIMR_TASK1           (0x00000002)
-+#define MCF_DMA_DIMR_TASK2           (0x00000004)
-+#define MCF_DMA_DIMR_TASK3           (0x00000008)
-+#define MCF_DMA_DIMR_TASK4           (0x00000010)
-+#define MCF_DMA_DIMR_TASK5           (0x00000020)
-+#define MCF_DMA_DIMR_TASK6           (0x00000040)
-+#define MCF_DMA_DIMR_TASK7           (0x00000080)
-+#define MCF_DMA_DIMR_TASK8           (0x00000100)
-+#define MCF_DMA_DIMR_TASK9           (0x00000200)
-+#define MCF_DMA_DIMR_TASK10          (0x00000400)
-+#define MCF_DMA_DIMR_TASK11          (0x00000800)
-+#define MCF_DMA_DIMR_TASK12          (0x00001000)
-+#define MCF_DMA_DIMR_TASK13          (0x00002000)
-+#define MCF_DMA_DIMR_TASK14          (0x00004000)
-+#define MCF_DMA_DIMR_TASK15          (0x00008000)
-+
-+/* Bit definitions and macros for MCF_DMA_IMCR */
-+#define MCF_DMA_IMCR_SRC16(x)        (((x)&0x00000003)<<0)
-+#define MCF_DMA_IMCR_SRC17(x)        (((x)&0x00000003)<<2)
-+#define MCF_DMA_IMCR_SRC18(x)        (((x)&0x00000003)<<4)
-+#define MCF_DMA_IMCR_SRC19(x)        (((x)&0x00000003)<<6)
-+#define MCF_DMA_IMCR_SRC20(x)        (((x)&0x00000003)<<8)
-+#define MCF_DMA_IMCR_SRC21(x)        (((x)&0x00000003)<<10)
-+#define MCF_DMA_IMCR_SRC22(x)        (((x)&0x00000003)<<12)
-+#define MCF_DMA_IMCR_SRC23(x)        (((x)&0x00000003)<<14)
-+#define MCF_DMA_IMCR_SRC24(x)        (((x)&0x00000003)<<16)
-+#define MCF_DMA_IMCR_SRC25(x)        (((x)&0x00000003)<<18)
-+#define MCF_DMA_IMCR_SRC26(x)        (((x)&0x00000003)<<20)
-+#define MCF_DMA_IMCR_SRC27(x)        (((x)&0x00000003)<<22)
-+#define MCF_DMA_IMCR_SRC28(x)        (((x)&0x00000003)<<24)
-+#define MCF_DMA_IMCR_SRC29(x)        (((x)&0x00000003)<<26)
-+#define MCF_DMA_IMCR_SRC30(x)        (((x)&0x00000003)<<28)
-+#define MCF_DMA_IMCR_SRC31(x)        (((x)&0x00000003)<<30)
-+#define MCF_DMA_IMCR_SRC16_FEC0RX    (0x00000000)
-+#define MCF_DMA_IMCR_SRC17_FEC0TX    (0x00000000)
-+#define MCF_DMA_IMCR_SRC18_FEC0RX    (0x00000020)
-+#define MCF_DMA_IMCR_SRC19_FEC0TX    (0x00000080)
-+#define MCF_DMA_IMCR_SRC20_FEC1RX    (0x00000100)
-+#define MCF_DMA_IMCR_SRC21_DREQ1     (0x00000000)
-+#define MCF_DMA_IMCR_SRC21_FEC1TX    (0x00000400)
-+#define MCF_DMA_IMCR_SRC22_FEC0RX    (0x00001000)
-+#define MCF_DMA_IMCR_SRC23_FEC0TX    (0x00004000)
-+#define MCF_DMA_IMCR_SRC24_CTM0      (0x00010000)
-+#define MCF_DMA_IMCR_SRC24_FEC1RX    (0x00020000)
-+#define MCF_DMA_IMCR_SRC25_CTM1      (0x00040000)
-+#define MCF_DMA_IMCR_SRC25_FEC1TX    (0x00080000)
-+#define MCF_DMA_IMCR_SRC26_USBEP4    (0x00000000)
-+#define MCF_DMA_IMCR_SRC26_CTM2      (0x00200000)
-+#define MCF_DMA_IMCR_SRC27_USBEP5    (0x00000000)
-+#define MCF_DMA_IMCR_SRC27_CTM3      (0x00800000)
-+#define MCF_DMA_IMCR_SRC28_USBEP6    (0x00000000)
-+#define MCF_DMA_IMCR_SRC28_CTM4      (0x01000000)
-+#define MCF_DMA_IMCR_SRC28_DREQ1     (0x02000000)
-+#define MCF_DMA_IMCR_SRC28_PSC2RX    (0x03000000)
-+#define MCF_DMA_IMCR_SRC29_DREQ1     (0x04000000)
-+#define MCF_DMA_IMCR_SRC29_CTM5      (0x08000000)
-+#define MCF_DMA_IMCR_SRC29_PSC2TX    (0x0C000000)
-+#define MCF_DMA_IMCR_SRC30_FEC1RX    (0x00000000)
-+#define MCF_DMA_IMCR_SRC30_CTM6      (0x10000000)
-+#define MCF_DMA_IMCR_SRC30_PSC3RX    (0x30000000)
-+#define MCF_DMA_IMCR_SRC31_FEC1TX    (0x00000000)
-+#define MCF_DMA_IMCR_SRC31_CTM7      (0x80000000)
-+#define MCF_DMA_IMCR_SRC31_PSC3TX    (0xC0000000)
-+
-+#endif /* __MCF548X_DMA_H__ */
---- /dev/null
-+++ b/include/asm-m68k/m5485dspi.h
-@@ -0,0 +1,144 @@
-+/*
-+ * File:      mcf548x_dspi.h
-+ * Purpose:   Register and bit definitions for the MCF548X
-+ *
-+ * Notes:
-+ *
-+ */
-+
-+#ifndef _M5485DSPI_H_
-+#define _M5485DSPI_H_
-+
-+/*
-+ *
-+ * DMA Serial Peripheral Interface (DSPI)
-+ *
-+ */
-+
-+/* Register read/write macros */
-+#define MCF_DSPI_DMCR         MCF_REG32(0x008A00)
-+#define MCF_DSPI_DTCR         MCF_REG32(0x008A08)
-+#define MCF_DSPI_DCTAR0       MCF_REG32(0x008A0C)
-+#define MCF_DSPI_DCTAR1       MCF_REG32(0x008A10)
-+#define MCF_DSPI_DCTAR2       MCF_REG32(0x008A14)
-+#define MCF_DSPI_DCTAR3       MCF_REG32(0x008A18)
-+#define MCF_DSPI_DCTAR4       MCF_REG32(0x008A1C)
-+#define MCF_DSPI_DCTAR5       MCF_REG32(0x008A20)
-+#define MCF_DSPI_DCTAR6       MCF_REG32(0x008A24)
-+#define MCF_DSPI_DCTAR7       MCF_REG32(0x008A28)
-+#define MCF_DSPI_DCTARn(x)    MCF_REG32(0x008A0C+(x*4))
-+#define MCF_DSPI_DSR          MCF_REG32(0x008A2C)
-+#define MCF_DSPI_DRSER        MCF_REG32(0x008A30)
-+#define MCF_DSPI_DTFR         MCF_REG32(0x008A34)
-+#define MCF_DSPI_DRFR         MCF_REG32(0x008A38)
-+#define MCF_DSPI_DTFDR0       MCF_REG32(0x008A3C)
-+#define MCF_DSPI_DTFDR1       MCF_REG32(0x008A40)
-+#define MCF_DSPI_DTFDR2       MCF_REG32(0x008A44)
-+#define MCF_DSPI_DTFDR3       MCF_REG32(0x008A48)
-+#define MCF_DSPI_DTFDRn(x)    MCF_REG32(0x008A3C+(x*4))
-+#define MCF_DSPI_DRFDR0       MCF_REG32(0x008A7C)
-+#define MCF_DSPI_DRFDR1       MCF_REG32(0x008A80)
-+#define MCF_DSPI_DRFDR2       MCF_REG32(0x008A84)
-+#define MCF_DSPI_DRFDR3       MCF_REG32(0x008A88)
-+#define MCF_DSPI_DRFDRn(x)    MCF_REG32(0x008A7C+(x*4))
-+
-+/* Bit definitions and macros for MCF_DSPI_DMCR */
-+#define MCF_DSPI_DMCR_HALT             (0x00000001)
-+#define MCF_DSPI_DMCR_SMPL_PT(x)       (((x)&0x00000003)<<8)
-+#define MCF_DSPI_DMCR_CRXF             (0x00000400)
-+#define MCF_DSPI_DMCR_CTXF             (0x00000800)
-+#define MCF_DSPI_DMCR_DRXF             (0x00001000)
-+#define MCF_DSPI_DMCR_DTXF             (0x00002000)
-+#define MCF_DSPI_DMCR_CSIS0            (0x00010000)
-+#define MCF_DSPI_DMCR_CSIS2            (0x00040000)
-+#define MCF_DSPI_DMCR_CSIS3            (0x00080000)
-+#define MCF_DSPI_DMCR_CSIS5            (0x00200000)
-+#define MCF_DSPI_DMCR_ROOE             (0x01000000)
-+#define MCF_DSPI_DMCR_PCSSE            (0x02000000)
-+#define MCF_DSPI_DMCR_MTFE             (0x04000000)
-+#define MCF_DSPI_DMCR_FRZ              (0x08000000)
-+#define MCF_DSPI_DMCR_DCONF(x)         (((x)&0x00000003)<<28)
-+#define MCF_DSPI_DMCR_CSCK             (0x40000000)
-+#define MCF_DSPI_DMCR_MSTR             (0x80000000)
-+
-+/* Bit definitions and macros for MCF_DSPI_DTCR */
-+#define MCF_DSPI_DTCR_SPI_TCNT(x)      (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_DSPI_DCTARn */
-+#define MCF_DSPI_DCTAR_BR(x)          (((x)&0x0000000F)<<0)
-+#define MCF_DSPI_DCTAR_DT(x)          (((x)&0x0000000F)<<4)
-+#define MCF_DSPI_DCTAR_ASC(x)         (((x)&0x0000000F)<<8)
-+#define MCF_DSPI_DCTAR_CSSCK(x)       (((x)&0x0000000F)<<12)
-+#define MCF_DSPI_DCTAR_PBR(x)         (((x)&0x00000003)<<16)
-+#define MCF_DSPI_DCTAR_PDT(x)         (((x)&0x00000003)<<18)
-+#define MCF_DSPI_DCTAR_PASC(x)        (((x)&0x00000003)<<20)
-+#define MCF_DSPI_DCTAR_PCSSCK(x)      (((x)&0x00000003)<<22)
-+#define MCF_DSPI_DCTAR_LSBFE          (0x01000000)
-+#define MCF_DSPI_DCTAR_CPHA           (0x02000000)
-+#define MCF_DSPI_DCTAR_CPOL           (0x04000000)
-+/* #define MCF_DSPI_DCTAR_TRSZ(x)        (((x)&0x0000000F)<<27) */
-+#define MCF_DSPI_DCTAR_FMSZ(x)        (((x)&0x0000000F)<<27)
-+#define MCF_DSPI_DCTAR_PCSSCK_1CLK    (0x00000000)
-+#define MCF_DSPI_DCTAR_PCSSCK_3CLK    (0x00400000)
-+#define MCF_DSPI_DCTAR_PCSSCK_5CLK    (0x00800000)
-+#define MCF_DSPI_DCTAR_PCSSCK_7CLK    (0x00A00000)
-+#define MCF_DSPI_DCTAR_PASC_1CLK      (0x00000000)
-+#define MCF_DSPI_DCTAR_PASC_3CLK      (0x00100000)
-+#define MCF_DSPI_DCTAR_PASC_5CLK      (0x00200000)
-+#define MCF_DSPI_DCTAR_PASC_7CLK      (0x00300000)
-+#define MCF_DSPI_DCTAR_PDT_1CLK       (0x00000000)
-+#define MCF_DSPI_DCTAR_PDT_3CLK       (0x00040000)
-+#define MCF_DSPI_DCTAR_PDT_5CLK       (0x00080000)
-+#define MCF_DSPI_DCTAR_PDT_7CLK       (0x000A0000)
-+#define MCF_DSPI_DCTAR_PBR_1CLK       (0x00000000)
-+#define MCF_DSPI_DCTAR_PBR_3CLK       (0x00010000)
-+#define MCF_DSPI_DCTAR_PBR_5CLK       (0x00020000)
-+#define MCF_DSPI_DCTAR_PBR_7CLK       (0x00030000)
-+
-+/* Bit definitions and macros for MCF_DSPI_DSR */
-+#define MCF_DSPI_DSR_RXPTR(x)          (((x)&0x0000000F)<<0)
-+#define MCF_DSPI_DSR_RXCTR(x)          (((x)&0x0000000F)<<4)
-+#define MCF_DSPI_DSR_TXPTR(x)          (((x)&0x0000000F)<<8)
-+#define MCF_DSPI_DSR_TXCTR(x)          (((x)&0x0000000F)<<12)
-+#define MCF_DSPI_DSR_RFDF              (0x00020000)
-+#define MCF_DSPI_DSR_RFOF              (0x00080000)
-+#define MCF_DSPI_DSR_TFFF              (0x02000000)
-+#define MCF_DSPI_DSR_TFUF              (0x08000000)
-+#define MCF_DSPI_DSR_EOQF              (0x10000000)
-+#define MCF_DSPI_DSR_TXRXS             (0x40000000)
-+#define MCF_DSPI_DSR_TCF               (0x80000000)
-+
-+/* Bit definitions and macros for MCF_DSPI_DRSER */
-+#define MCF_DSPI_DRSER_RFDFS           (0x00010000)
-+#define MCF_DSPI_DRSER_RFDFE           (0x00020000)
-+#define MCF_DSPI_DRSER_RFOFE           (0x00080000)
-+#define MCF_DSPI_DRSER_TFFFS           (0x01000000)
-+#define MCF_DSPI_DRSER_TFFFE           (0x02000000)
-+#define MCF_DSPI_DRSER_TFUFE           (0x08000000)
-+#define MCF_DSPI_DRSER_EOQFE           (0x10000000)
-+#define MCF_DSPI_DRSER_TCFE            (0x80000000)
-+
-+/* Bit definitions and macros for MCF_DSPI_DTFR */
-+#define MCF_DSPI_DTFR_TXDATA(x)        (((x)&0x0000FFFF)<<0)
-+#define MCF_DSPI_DTFR_CS0              (0x00010000)
-+#define MCF_DSPI_DTFR_CS2              (0x00040000)
-+#define MCF_DSPI_DTFR_CS3              (0x00080000)
-+#define MCF_DSPI_DTFR_CS5              (0x00200000)
-+#define MCF_DSPI_DTFR_CTCNT            (0x04000000)
-+#define MCF_DSPI_DTFR_EOQ              (0x08000000)
-+#define MCF_DSPI_DTFR_CTAS(x)          (((x)&0x00000007)<<28)
-+#define MCF_DSPI_DTFR_CONT             (0x80000000)
-+
-+/* Bit definitions and macros for MCF_DSPI_DRFR */
-+#define MCF_DSPI_DRFR_RXDATA(x)        (((x)&0x0000FFFF)<<0)
-+
-+/* Bit definitions and macros for MCF_DSPI_DTFDRn */
-+#define MCF_DSPI_DTFDRn_TXDATA(x)      (((x)&0x0000FFFF)<<0)
-+#define MCF_DSPI_DTFDRn_TXCMD(x)       (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_DSPI_DRFDRn */
-+#define MCF_DSPI_DRFDRn_RXDATA(x)      (((x)&0x0000FFFF)<<0)
-+
-+/********************************************************************/
-+
-+#endif /* _M5485DSPI_H_ */
---- /dev/null
-+++ b/include/asm-m68k/m5485gpio.h
-@@ -0,0 +1,694 @@
-+/*
-+ * File:      mcf548x_gpio.h
-+ * Purpose:   Register and bit definitions for the MCF548X
-+ *
-+ * Notes:     
-+ *    
-+ */
-+
-+#ifndef _M5485GPIO_H_
-+#define _M5485GPIO_H_
-+
-+/*********************************************************************
-+*
-+* General Purpose I/O (GPIO)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_GPIO_PODR_FBCTL         MCF_REG08(0x000A00)
-+#define MCF_GPIO_PODR_FBCS          MCF_REG08(0x000A01)
-+#define MCF_GPIO_PODR_DMA           MCF_REG08(0x000A02)
-+#define MCF_GPIO_PODR_FEC0H         MCF_REG08(0x000A04)
-+#define MCF_GPIO_PODR_FEC0L         MCF_REG08(0x000A05)
-+#define MCF_GPIO_PODR_FEC1H         MCF_REG08(0x000A06)
-+#define MCF_GPIO_PODR_FEC1L         MCF_REG08(0x000A07)
-+#define MCF_GPIO_PODR_FECI2C        MCF_REG08(0x000A08)
-+#define MCF_GPIO_PODR_PCIBG         MCF_REG08(0x000A09)
-+#define MCF_GPIO_PODR_PCIBR         MCF_REG08(0x000A0A)
-+#define MCF_GPIO_PODR_PSC3PSC2      MCF_REG08(0x000A0C)
-+#define MCF_GPIO_PODR_PSC1PSC0      MCF_REG08(0x000A0D)
-+#define MCF_GPIO_PODR_DSPI          MCF_REG08(0x000A0E)
-+#define MCF_GPIO_PDDR_FBCTL         MCF_REG08(0x000A10)
-+#define MCF_GPIO_PDDR_FBCS          MCF_REG08(0x000A11)
-+#define MCF_GPIO_PDDR_DMA           MCF_REG08(0x000A12)
-+#define MCF_GPIO_PDDR_FEC0H         MCF_REG08(0x000A14)
-+#define MCF_GPIO_PDDR_FEC0L         MCF_REG08(0x000A15)
-+#define MCF_GPIO_PDDR_FEC1H         MCF_REG08(0x000A16)
-+#define MCF_GPIO_PDDR_FEC1L         MCF_REG08(0x000A17)
-+#define MCF_GPIO_PDDR_FECI2C        MCF_REG08(0x000A18)
-+#define MCF_GPIO_PDDR_PCIBG         MCF_REG08(0x000A19)
-+#define MCF_GPIO_PDDR_PCIBR         MCF_REG08(0x000A1A)
-+#define MCF_GPIO_PDDR_PSC3PSC2      MCF_REG08(0x000A1C)
-+#define MCF_GPIO_PDDR_PSC1PSC0      MCF_REG08(0x000A1D)
-+#define MCF_GPIO_PDDR_DSPI          MCF_REG08(0x000A1E)
-+#define MCF_GPIO_PPDSDR_FBCTL       MCF_REG08(0x000A20)
-+#define MCF_GPIO_PPDSDR_FBCS        MCF_REG08(0x000A21)
-+#define MCF_GPIO_PPDSDR_DMA         MCF_REG08(0x000A22)
-+#define MCF_GPIO_PPDSDR_FEC0H       MCF_REG08(0x000A24)
-+#define MCF_GPIO_PPDSDR_FEC0L       MCF_REG08(0x000A25)
-+#define MCF_GPIO_PPDSDR_FEC1H       MCF_REG08(0x000A26)
-+#define MCF_GPIO_PPDSDR_FEC1L       MCF_REG08(0x000A27)
-+#define MCF_GPIO_PPDSDR_FECI2C      MCF_REG08(0x000A28)
-+#define MCF_GPIO_PPDSDR_PCIBG       MCF_REG08(0x000A29)
-+#define MCF_GPIO_PPDSDR_PCIBR       MCF_REG08(0x000A2A)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2    MCF_REG08(0x000A2C)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0    MCF_REG08(0x000A2D)
-+#define MCF_GPIO_PPDSDR_DSPI        MCF_REG08(0x000A2E)
-+#define MCF_GPIO_PCLRR_FBCTL        MCF_REG08(0x000A30)
-+#define MCF_GPIO_PCLRR_FBCS         MCF_REG08(0x000A31)
-+#define MCF_GPIO_PCLRR_DMA          MCF_REG08(0x000A32)
-+#define MCF_GPIO_PCLRR_FEC0H        MCF_REG08(0x000A34)
-+#define MCF_GPIO_PCLRR_FEC0L        MCF_REG08(0x000A35)
-+#define MCF_GPIO_PCLRR_FEC1H        MCF_REG08(0x000A36)
-+#define MCF_GPIO_PCLRR_FEC1L        MCF_REG08(0x000A37)
-+#define MCF_GPIO_PCLRR_FECI2C       MCF_REG08(0x000A38)
-+#define MCF_GPIO_PCLRR_PCIBG        MCF_REG08(0x000A39)
-+#define MCF_GPIO_PCLRR_PCIBR        MCF_REG08(0x000A3A)
-+#define MCF_GPIO_PCLRR_PSC3PSC2     MCF_REG08(0x000A3C)
-+#define MCF_GPIO_PCLRR_PSC1PSC0     MCF_REG08(0x000A3D)
-+#define MCF_GPIO_PCLRR_DSPI         MCF_REG08(0x000A3E)
-+#define MCF_GPIO_PAR_FBCTL          MCF_REG16(0x000A40)
-+#define MCF_GPIO_PAR_FBCS           MCF_REG08(0x000A42)
-+#define MCF_GPIO_PAR_DMA            MCF_REG08(0x000A43)
-+#define MCF_GPIO_PAR_FECI2CIRQ      MCF_REG16(0x000A44)
-+#define MCF_GPIO_PAR_PCIBG          MCF_REG16(0x000A48)
-+#define MCF_GPIO_PAR_PCIBR          MCF_REG16(0x000A4A)
-+#define MCF_GPIO_PAR_PSC3           MCF_REG08(0x000A4C)
-+#define MCF_GPIO_PAR_PSC2           MCF_REG08(0x000A4D)
-+#define MCF_GPIO_PAR_PSC1           MCF_REG08(0x000A4E)
-+#define MCF_GPIO_PAR_PSC0           MCF_REG08(0x000A4F)
-+#define MCF_GPIO_PAR_DSPI           MCF_REG16(0x000A50)
-+#define MCF_GPIO_PAR_TIMER          MCF_REG08(0x000A52)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FBCTL */
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL0              (0x01)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL1              (0x02)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL2              (0x04)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL3              (0x08)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL4              (0x10)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL5              (0x20)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL6              (0x40)
-+#define MCF_GPIO_PODR_FBCTL_PODRFBCTL7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FBCS */
-+#define MCF_GPIO_PODR_FBCS_PODRFBCS1                (0x02)
-+#define MCF_GPIO_PODR_FBCS_PODRFBCS2                (0x04)
-+#define MCF_GPIO_PODR_FBCS_PODRFBCS3                (0x08)
-+#define MCF_GPIO_PODR_FBCS_PODRFBCS4                (0x10)
-+#define MCF_GPIO_PODR_FBCS_PODRFBCS5                (0x20)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_DMA */
-+#define MCF_GPIO_PODR_DMA_PODRDMA0                  (0x01)
-+#define MCF_GPIO_PODR_DMA_PODRDMA1                  (0x02)
-+#define MCF_GPIO_PODR_DMA_PODRDMA2                  (0x04)
-+#define MCF_GPIO_PODR_DMA_PODRDMA3                  (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FEC0H */
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H0              (0x01)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H1              (0x02)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H2              (0x04)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H3              (0x08)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H4              (0x10)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H5              (0x20)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H6              (0x40)
-+#define MCF_GPIO_PODR_FEC0H_PODRFEC0H7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FEC0L */
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L0              (0x01)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L1              (0x02)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L2              (0x04)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L3              (0x08)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L4              (0x10)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L5              (0x20)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L6              (0x40)
-+#define MCF_GPIO_PODR_FEC0L_PODRFEC0L7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FEC1H */
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H0              (0x01)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H1              (0x02)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H2              (0x04)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H3              (0x08)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H4              (0x10)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H5              (0x20)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H6              (0x40)
-+#define MCF_GPIO_PODR_FEC1H_PODRFEC1H7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FEC1L */
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L0              (0x01)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L1              (0x02)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L2              (0x04)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L3              (0x08)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L4              (0x10)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L5              (0x20)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L6              (0x40)
-+#define MCF_GPIO_PODR_FEC1L_PODRFEC1L7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_FECI2C */
-+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C0            (0x01)
-+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C1            (0x02)
-+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C2            (0x04)
-+#define MCF_GPIO_PODR_FECI2C_PODRFECI2C3            (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_PCIBG */
-+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG0              (0x01)
-+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG1              (0x02)
-+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG2              (0x04)
-+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG3              (0x08)
-+#define MCF_GPIO_PODR_PCIBG_PODRPCIBG4              (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_PCIBR */
-+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR0              (0x01)
-+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR1              (0x02)
-+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR2              (0x04)
-+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR3              (0x08)
-+#define MCF_GPIO_PODR_PCIBR_PODRPCIBR4              (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_PSC3PSC2 */
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC20        (0x01)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC21        (0x02)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC22        (0x04)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC23        (0x08)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC24        (0x10)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC25        (0x20)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC26        (0x40)
-+#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC27        (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_PSC1PSC0 */
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC00        (0x01)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC01        (0x02)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC02        (0x04)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC03        (0x08)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC04        (0x10)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC05        (0x20)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC06        (0x40)
-+#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC07        (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PODR_DSPI */
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI0                (0x01)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI1                (0x02)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI2                (0x04)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI3                (0x08)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI4                (0x10)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI5                (0x20)
-+#define MCF_GPIO_PODR_DSPI_PODRDSPI6                (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FBCTL */
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL0              (0x01)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL1              (0x02)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL2              (0x04)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL3              (0x08)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL4              (0x10)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL5              (0x20)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL6              (0x40)
-+#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FBCS */
-+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS1                (0x02)
-+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS2                (0x04)
-+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS3                (0x08)
-+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS4                (0x10)
-+#define MCF_GPIO_PDDR_FBCS_PDDRFBCS5                (0x20)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_DMA */
-+#define MCF_GPIO_PDDR_DMA_PDDRDMA0                  (0x01)
-+#define MCF_GPIO_PDDR_DMA_PDDRDMA1                  (0x02)
-+#define MCF_GPIO_PDDR_DMA_PDDRDMA2                  (0x04)
-+#define MCF_GPIO_PDDR_DMA_PDDRDMA3                  (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0H */
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H0              (0x01)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H1              (0x02)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H2              (0x04)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H3              (0x08)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H4              (0x10)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H5              (0x20)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H6              (0x40)
-+#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0L */
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L0              (0x01)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L1              (0x02)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L2              (0x04)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L3              (0x08)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L4              (0x10)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L5              (0x20)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L6              (0x40)
-+#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1H */
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H0              (0x01)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H1              (0x02)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H2              (0x04)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H3              (0x08)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H4              (0x10)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H5              (0x20)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H6              (0x40)
-+#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1L */
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L0              (0x01)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L1              (0x02)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L2              (0x04)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L3              (0x08)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L4              (0x10)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L5              (0x20)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L6              (0x40)
-+#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L7              (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_FECI2C */
-+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C0            (0x01)
-+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C1            (0x02)
-+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C2            (0x04)
-+#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C3            (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBG */
-+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG0              (0x01)
-+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG1              (0x02)
-+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG2              (0x04)
-+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG3              (0x08)
-+#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG4              (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBR */
-+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR0              (0x01)
-+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR1              (0x02)
-+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR2              (0x04)
-+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR3              (0x08)
-+#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR4              (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_PSC3PSC2 */
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC20        (0x01)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC21        (0x02)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC22        (0x04)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC23        (0x08)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC24        (0x10)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC25        (0x20)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC26        (0x40)
-+#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC27        (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_PSC1PSC0 */
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC00        (0x01)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC01        (0x02)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC02        (0x04)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC03        (0x08)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC04        (0x10)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC05        (0x20)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC06        (0x40)
-+#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC07        (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PDDR_DSPI */
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI0                (0x01)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI1                (0x02)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI2                (0x04)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI3                (0x08)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI4                (0x10)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI5                (0x20)
-+#define MCF_GPIO_PDDR_DSPI_PDDRDSPI6                (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCTL */
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL0          (0x01)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL1          (0x02)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL2          (0x04)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL3          (0x08)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL4          (0x10)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL5          (0x20)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL6          (0x40)
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL7          (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCS */
-+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS1            (0x02)
-+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS2            (0x04)
-+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS3            (0x08)
-+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS4            (0x10)
-+#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS5            (0x20)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_DMA */
-+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA0              (0x01)
-+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA1              (0x02)
-+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA2              (0x04)
-+#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA3              (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0H */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H0          (0x01)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H1          (0x02)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H2          (0x04)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H3          (0x08)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H4          (0x10)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H5          (0x20)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H6          (0x40)
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H7          (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0L */
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L0          (0x01)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L1          (0x02)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L2          (0x04)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L3          (0x08)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L4          (0x10)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L5          (0x20)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L6          (0x40)
-+#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L7          (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1H */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H0          (0x01)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H1          (0x02)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H2          (0x04)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H3          (0x08)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H4          (0x10)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H5          (0x20)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H6          (0x40)
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H7          (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1L */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L0          (0x01)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L1          (0x02)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L2          (0x04)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L3          (0x08)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L4          (0x10)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L5          (0x20)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L6          (0x40)
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L7          (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_FECI2C */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C0        (0x01)
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C1        (0x02)
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C2        (0x04)
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C3        (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBG */
-+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG0          (0x01)
-+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG1          (0x02)
-+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG2          (0x04)
-+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG3          (0x08)
-+#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG4          (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBR */
-+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR0          (0x01)
-+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR1          (0x02)
-+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR2          (0x04)
-+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR3          (0x08)
-+#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR4          (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC3PSC2 */
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC20    (0x01)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC21    (0x02)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC22    (0x04)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC23    (0x08)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC24      (0x10)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC25      (0x20)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC26    (0x40)
-+#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC27    (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC1PSC0 */
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC00    (0x01)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC01      (0x02)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC02    (0x04)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC03      (0x08)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC04    (0x10)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC05    (0x20)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC06    (0x40)
-+#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC07    (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PPDSDR_DSPI */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI0            (0x01)
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI1            (0x02)
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI2            (0x04)
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI3            (0x08)
-+#define MCF_GPIO_PPDSDR_DSPI_PDDRDSPI4              (0x10)
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI5            (0x20)
-+#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI6            (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCTL */
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL0            (0x01)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL1            (0x02)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL2            (0x04)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL3            (0x08)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL4            (0x10)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL5            (0x20)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL6            (0x40)
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL7            (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCS */
-+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS1              (0x02)
-+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS2              (0x04)
-+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS3              (0x08)
-+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS4              (0x10)
-+#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS5              (0x20)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_DMA */
-+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA0                (0x01)
-+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA1                (0x02)
-+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA2                (0x04)
-+#define MCF_GPIO_PCLRR_DMA_PCLRRDMA3                (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0H */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H0            (0x01)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H1            (0x02)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H2            (0x04)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H3            (0x08)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H4            (0x10)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H5            (0x20)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H6            (0x40)
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H7            (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0L */
-+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L0            (0x01)
-+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L1             (0x02)
-+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L2            (0x04)
-+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L3            (0x08)
-+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L4             (0x10)
-+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L5             (0x20)
-+#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L6             (0x40)
-+#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L7            (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1H */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H0            (0x01)
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H1            (0x02)
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H2            (0x04)
-+#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H3             (0x08)
-+#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H4             (0x10)
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H5            (0x20)
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H6            (0x40)
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H7            (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1L */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L0            (0x01)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L1            (0x02)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L2            (0x04)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L3            (0x08)
-+#define MCF_GPIO_PCLRR_FEC1L_PODRFEC1L4             (0x10)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L5            (0x20)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L6            (0x40)
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L7            (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_FECI2C */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C0          (0x01)
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C1          (0x02)
-+#define MCF_GPIO_PCLRR_FECI2C_PODRFECI2C2           (0x04)
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C3          (0x08)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBG */
-+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG0             (0x01)
-+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG1             (0x02)
-+#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG2             (0x04)
-+#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG3            (0x08)
-+#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG4            (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBR */
-+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR0            (0x01)
-+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR1            (0x02)
-+#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR2            (0x04)
-+#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR3             (0x08)
-+#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR4             (0x10)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC3PSC2 */
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC20       (0x01)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC21       (0x02)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC22      (0x04)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC23      (0x08)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC24      (0x10)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC25       (0x20)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC26       (0x40)
-+#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC27      (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC1PSC0 */
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC00      (0x01)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC01      (0x02)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC02      (0x04)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC03      (0x08)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC04      (0x10)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC05      (0x20)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PODRPSC1PSC06       (0x40)
-+#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC07      (0x80)
-+
-+/* Bit definitions and macros for MCF_GPIO_PCLRR_DSPI */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI0              (0x01)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI1              (0x02)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI2              (0x04)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI3              (0x08)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI4              (0x10)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI5              (0x20)
-+#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI6              (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_FBCTL */
-+#define MCF_GPIO_PAR_FBCTL_PAR_TS(x)                (((x)&0x0003)<<0)
-+#define MCF_GPIO_PAR_FBCTL_PAR_TA                   (0x0004)
-+#define MCF_GPIO_PAR_FBCTL_PAR_RWB                  (0x0010)
-+#define MCF_GPIO_PAR_FBCTL_PAR_OE                   (0x0040)
-+#define MCF_GPIO_PAR_FBCTL_PAR_BWE0                 (0x0100)
-+#define MCF_GPIO_PAR_FBCTL_PAR_BWE1                 (0x0400)
-+#define MCF_GPIO_PAR_FBCTL_PAR_BWE2                 (0x1000)
-+#define MCF_GPIO_PAR_FBCTL_PAR_BWE3                 (0x4000)
-+#define MCF_GPIO_PAR_FBCTL_PAR_TS_GPIO              (0)
-+#define MCF_GPIO_PAR_FBCTL_PAR_TS_TBST              (2)
-+#define MCF_GPIO_PAR_FBCTL_PAR_TS_TS                (3)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_FBCS */
-+#define MCF_GPIO_PAR_FBCS_PAR_CS1                   (0x02)
-+#define MCF_GPIO_PAR_FBCS_PAR_CS2                   (0x04)
-+#define MCF_GPIO_PAR_FBCS_PAR_CS3                   (0x08)
-+#define MCF_GPIO_PAR_FBCS_PAR_CS4                   (0x10)
-+#define MCF_GPIO_PAR_FBCS_PAR_CS5                   (0x20)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_DMA */
-+#define MCF_GPIO_PAR_DMA_PAR_DREQ0(x)               (((x)&0x03)<<0)
-+#define MCF_GPIO_PAR_DMA_PAR_DREQ1(x)               (((x)&0x03)<<2)
-+#define MCF_GPIO_PAR_DMA_PAR_DACK0(x)               (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_DMA_PAR_DACK1(x)               (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_DMA_PAR_DACKx_GPIO             (0)
-+#define MCF_GPIO_PAR_DMA_PAR_DACKx_TOUT             (2)
-+#define MCF_GPIO_PAR_DMA_PAR_DACKx_DACK             (3)
-+#define MCF_GPIO_PAR_DMA_PAR_DREQx_GPIO             (0)
-+#define MCF_GPIO_PAR_DMA_PAR_DREQx_TIN              (2)
-+#define MCF_GPIO_PAR_DMA_PAR_DREQx_DREQ             (3)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_FECI2CIRQ */
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ5             (0x0001)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ6             (0x0002)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SCL              (0x0004)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SDA              (0x0008)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC(x)         (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO(x)        (((x)&0x0003)<<8)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MII            (0x0400)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E17              (0x0800)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDC            (0x1000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDIO           (0x2000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MII            (0x4000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E07              (0x8000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_CANRX     (0x0000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_SDA       (0x0200)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_EMDIO     (0x0300)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_CANTX      (0x0000)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_SCL        (0x0080)
-+#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_EMDC       (0x00C0)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PCIBG */
-+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG0(x)            (((x)&0x0003)<<0)
-+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG1(x)            (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG2(x)            (((x)&0x0003)<<4)
-+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG3(x)            (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG4(x)            (((x)&0x0003)<<8)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PCIBR */
-+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG0(x)            (((x)&0x0003)<<0)
-+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG1(x)            (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG2(x)            (((x)&0x0003)<<4)
-+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG3(x)            (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_PCIBR_PAR_PCIBR4(x)            (((x)&0x0003)<<8)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PSC3 */
-+#define MCF_GPIO_PAR_PSC3_PAR_TXD3                  (0x04)
-+#define MCF_GPIO_PAR_PSC3_PAR_RXD3                  (0x08)
-+#define MCF_GPIO_PAR_PSC3_PAR_RTS3(x)               (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_PSC3_PAR_CTS3(x)               (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_BCLK             (0x80)
-+#define MCF_GPIO_PAR_PSC3_PAR_CTS3_CTS              (0xC0)
-+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_FSYNC            (0x20)
-+#define MCF_GPIO_PAR_PSC3_PAR_RTS3_RTS              (0x30)
-+#define MCF_GPIO_PAR_PSC3_PAR_CTS2_CANRX            (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PSC2 */
-+#define MCF_GPIO_PAR_PSC2_PAR_TXD2                  (0x04)
-+#define MCF_GPIO_PAR_PSC2_PAR_RXD2                  (0x08)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2(x)               (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_PSC2_PAR_CTS2(x)               (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_BCLK             (0x80)
-+#define MCF_GPIO_PAR_PSC2_PAR_CTS2_CTS              (0xC0)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANTX            (0x10)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_FSYNC            (0x20)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_RTS              (0x30)
-+#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANRX            (0x40)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PSC1 */
-+#define MCF_GPIO_PAR_PSC1_PAR_TXD1                  (0x04)
-+#define MCF_GPIO_PAR_PSC1_PAR_RXD1                  (0x08)
-+#define MCF_GPIO_PAR_PSC1_PAR_RTS1(x)               (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_PSC1_PAR_CTS1(x)               (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_BCLK             (0x80)
-+#define MCF_GPIO_PAR_PSC1_PAR_CTS1_CTS              (0xC0)
-+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_FSYNC            (0x20)
-+#define MCF_GPIO_PAR_PSC1_PAR_RTS1_RTS              (0x30)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_PSC0 */
-+#define MCF_GPIO_PAR_PSC0_PAR_TXD0                  (0x04)
-+#define MCF_GPIO_PAR_PSC0_PAR_RXD0                  (0x08)
-+#define MCF_GPIO_PAR_PSC0_PAR_RTS0(x)               (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_PSC0_PAR_CTS0(x)               (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_BCLK             (0x80)
-+#define MCF_GPIO_PAR_PSC0_PAR_CTS0_CTS              (0xC0)
-+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_GPIO             (0x00)
-+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_FSYNC            (0x20)
-+#define MCF_GPIO_PAR_PSC0_PAR_RTS0_RTS              (0x30)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_DSPI */
-+#define MCF_GPIO_PAR_DSPI_PAR_SOUT(x)               (((x)&0x0003)<<0)
-+#define MCF_GPIO_PAR_DSPI_PAR_SIN(x)                (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_DSPI_PAR_SCK(x)                (((x)&0x0003)<<4)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS0(x)                (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS2(x)                (((x)&0x0003)<<8)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS3(x)                (((x)&0x0003)<<10)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS5                   (0x1000)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS3_GPIO              (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS3_CANTX             (0x0400)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS3_TOUT              (0x0800)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS            (0x0C00)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS2_GPIO              (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS2_CANTX             (0x0100)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS2_TOUT              (0x0200)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS            (0x0300)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS0_GPIO              (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS0_FSYNC             (0x0040)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS0_RTS               (0x0080)
-+#define MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS            (0x00C0)
-+#define MCF_GPIO_PAR_DSPI_PAR_SCK_GPIO              (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_SCK_BCLK              (0x0010)
-+#define MCF_GPIO_PAR_DSPI_PAR_SCK_CTS               (0x0020)
-+#define MCF_GPIO_PAR_DSPI_PAR_SCK_SCK               (0x0030)
-+#define MCF_GPIO_PAR_DSPI_PAR_SIN_GPIO              (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_SIN_RXD               (0x0008)
-+#define MCF_GPIO_PAR_DSPI_PAR_SIN_SIN               (0x000C)
-+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_GPIO             (0x0000)
-+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_TXD              (0x0002)
-+#define MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT             (0x0003)
-+
-+/* Bit definitions and macros for MCF_GPIO_PAR_TIMER */
-+#define MCF_GPIO_PAR_TIMER_PAR_TOUT2                (0x01)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN2(x)              (((x)&0x03)<<1)
-+#define MCF_GPIO_PAR_TIMER_PAR_TOUT3                (0x08)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN3(x)              (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_CANRX           (0x00)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_IRQ             (0x20)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN3_TIN             (0x30)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_CANRX           (0x00)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_IRQ             (0x04)
-+#define MCF_GPIO_PAR_TIMER_PAR_TIN2_TIN             (0x06)
-+
-+/********************************************************************/
-+
-+#endif /* _M5485GPIO_H_ */
---- /dev/null
-+++ b/include/asm-m68k/m5485gpt.h
-@@ -0,0 +1,88 @@
-+/*
-+ * File:      mcf548x_gpt.h
-+ * Purpose:   Register and bit definitions for the MCF548X
-+ *
-+ * Notes:     
-+ *    
-+ */
-+
-+#ifndef __MCF548X_GPT_H__
-+#define __MCF548X_GPT_H__
-+
-+/*********************************************************************
-+*
-+* General Purpose Timers (GPT)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_GPT_GMS0       MCF_REG32(0x000800)
-+#define MCF_GPT_GCIR0      MCF_REG32(0x000804)
-+#define MCF_GPT_GPWM0      MCF_REG32(0x000808)
-+#define MCF_GPT_GSR0       MCF_REG32(0x00080C)
-+#define MCF_GPT_GMS1       MCF_REG32(0x000810)
-+#define MCF_GPT_GCIR1      MCF_REG32(0x000814)
-+#define MCF_GPT_GPWM1      MCF_REG32(0x000818)
-+#define MCF_GPT_GSR1       MCF_REG32(0x00081C)
-+#define MCF_GPT_GMS2       MCF_REG32(0x000820)
-+#define MCF_GPT_GCIR2      MCF_REG32(0x000824)
-+#define MCF_GPT_GPWM2      MCF_REG32(0x000828)
-+#define MCF_GPT_GSR2       MCF_REG32(0x00082C)
-+#define MCF_GPT_GMS3       MCF_REG32(0x000830)
-+#define MCF_GPT_GCIR3      MCF_REG32(0x000834)
-+#define MCF_GPT_GPWM3      MCF_REG32(0x000838)
-+#define MCF_GPT_GSR3       MCF_REG32(0x00083C)
-+#define MCF_GPT_GMS(x)     MCF_REG32(0x000800+((x)*0x010))
-+#define MCF_GPT_GCIR(x)    MCF_REG32(0x000804+((x)*0x010))
-+#define MCF_GPT_GPWM(x)    MCF_REG32(0x000808+((x)*0x010))
-+#define MCF_GPT_GSR(x)     MCF_REG32(0x00080C+((x)*0x010))
-+
-+/* Bit definitions and macros for MCF_GPT_GMS */
-+#define MCF_GPT_GMS_TMS(x)         (((x)&0x00000007)<<0)
-+#define MCF_GPT_GMS_GPIO(x)        (((x)&0x00000003)<<4)
-+#define MCF_GPT_GMS_IEN            (0x00000100)
-+#define MCF_GPT_GMS_OD             (0x00000200)
-+#define MCF_GPT_GMS_SC             (0x00000400)
-+#define MCF_GPT_GMS_CE             (0x00001000)
-+#define MCF_GPT_GMS_WDEN           (0x00008000)
-+#define MCF_GPT_GMS_ICT(x)         (((x)&0x00000003)<<16)
-+#define MCF_GPT_GMS_OCT(x)         (((x)&0x00000003)<<20)
-+#define MCF_GPT_GMS_OCPW(x)        (((x)&0x000000FF)<<24)
-+#define MCF_GPT_GMS_OCT_FRCLOW     (0x00000000)
-+#define MCF_GPT_GMS_OCT_PULSEHI    (0x00100000)
-+#define MCF_GPT_GMS_OCT_PULSELO    (0x00200000)
-+#define MCF_GPT_GMS_OCT_TOGGLE     (0x00300000)
-+#define MCF_GPT_GMS_ICT_ANY        (0x00000000)
-+#define MCF_GPT_GMS_ICT_RISE       (0x00010000)
-+#define MCF_GPT_GMS_ICT_FALL       (0x00020000)
-+#define MCF_GPT_GMS_ICT_PULSE      (0x00030000)
-+#define MCF_GPT_GMS_GPIO_INPUT     (0x00000000)
-+#define MCF_GPT_GMS_GPIO_OUTLO     (0x00000020)
-+#define MCF_GPT_GMS_GPIO_OUTHI     (0x00000030)
-+#define MCF_GPT_GMS_TMS_DISABLE    (0x00000000)
-+#define MCF_GPT_GMS_TMS_INCAPT     (0x00000001)
-+#define MCF_GPT_GMS_TMS_OUTCAPT    (0x00000002)
-+#define MCF_GPT_GMS_TMS_PWM        (0x00000003)
-+#define MCF_GPT_GMS_TMS_GPIO       (0x00000004)
-+
-+/* Bit definitions and macros for MCF_GPT_GCIR */
-+#define MCF_GPT_GCIR_CNT(x)        (((x)&0x0000FFFF)<<0)
-+#define MCF_GPT_GCIR_PRE(x)        (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_GPT_GPWM */
-+#define MCF_GPT_GPWM_LOAD          (0x00000001)
-+#define MCF_GPT_GPWM_PWMOP         (0x00000100)
-+#define MCF_GPT_GPWM_WIDTH(x)      (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_GPT_GSR */
-+#define MCF_GPT_GSR_CAPT           (0x00000001)
-+#define MCF_GPT_GSR_COMP           (0x00000002)
-+#define MCF_GPT_GSR_PWMP           (0x00000004)
-+#define MCF_GPT_GSR_TEXP           (0x00000008)
-+#define MCF_GPT_GSR_PIN            (0x00000100)
-+#define MCF_GPT_GSR_OVF(x)         (((x)&0x00000007)<<12)
-+#define MCF_GPT_GSR_CAPTURE(x)     (((x)&0x0000FFFF)<<16)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF548X_GPT_H__ */
---- /dev/null
-+++ b/include/asm-m68k/m5485i2c.h
-@@ -0,0 +1,45 @@
-+/*
-+ *    m5485i2c.h -- ColdFire 547x/548x i2c controller support.
-+ */
-+#ifndef M548X_I2C_H
-+#define M548X_I2C_H
-+
-+/* Register read/write macros */
-+#define MCF_I2AR     MCF_REG08(0x008F00)      /* I2C Address           */
-+#define MCF_I2FDR    MCF_REG08(0x008F04)      /* I2C Frequency Divider */
-+#define MCF_I2CR     MCF_REG08(0x008F08)      /* I2C Control           */
-+#define MCF_I2SR     MCF_REG08(0x008F0C)      /* I2C Status            */
-+#define MCF_I2DR     MCF_REG08(0x008F10)      /* I2C Data I/O          */
-+#define MCF_I2ICR    MCF_REG08(0x008F20)      /* I2C Interrupt Control */
-+
-+/* Bit definitions and macros for MCF_I2C_I2AR */
-+#define MCF_I2AR_ADR(x)    (((x)&0x7F)<<1)
-+
-+/* Bit definitions and macros for MCF_I2C_I2FDR */
-+#define MCF_I2FDR_IC(x)    (((x)&0x3F)<<0)
-+
-+/* Bit definitions and macros for MCF_I2C_I2CR */
-+#define MCF_I2CR_RSTA      (0x04)
-+#define MCF_I2CR_TXAK      (0x08)
-+#define MCF_I2CR_MTX       (0x10)
-+#define MCF_I2CR_MSTA      (0x20)
-+#define MCF_I2CR_IIEN      (0x40)
-+#define MCF_I2CR_IEN       (0x80)
-+
-+/* Bit definitions and macros for MCF_I2C_I2SR */
-+#define MCF_I2SR_RXAK      (0x01)
-+#define MCF_I2SR_IIF       (0x02)
-+#define MCF_I2SR_SRW       (0x04)
-+#define MCF_I2SR_IAL       (0x10)
-+#define MCF_I2SR_IBB       (0x20)
-+#define MCF_I2SR_IAAS      (0x40)
-+#define MCF_I2SR_ICF       (0x80)
-+
-+/* Bit definitions and macros for MCF_I2C_I2ICR */
-+#define MCF_I2ICR_IE       (0x01)
-+#define MCF_I2ICR_RE       (0x02)
-+#define MCF_I2ICR_TE       (0x04)
-+#define MCF_I2ICR_BNBE     (0x08)
-+
-+/********************************************************************/
-+#endif
---- /dev/null
-+++ b/include/asm-m68k/m5485pci.h
-@@ -0,0 +1,330 @@
-+/*
-+ *    m5485pci.h -- ColdFire 547x/548x PCI controller support.
-+ */
-+#ifndef __MCF548X_PCI_H__
-+#define __MCF548X_PCI_H__
-+
-+
-+/* PCI Type 0 Configuration Registers */
-+#define MCF_PCIIDR        MCF_REG32(0x000B00)   /* PCI Device ID/Vendor ID      */
-+#define MCF_PCISCR        MCF_REG32(0x000B04)   /* PCI Status/Command           */
-+#define MCF_PCICCRIR      MCF_REG32(0x000B08)   /* PCI Class Code / Revision ID */
-+#define MCF_PCICR1        MCF_REG32(0x000B0C)   /* PCI Configuration 1 Register */
-+#define MCF_PCIBAR0       MCF_REG32(0x000B10)   /* PCI Base Address Register 0  */
-+#define MCF_PCIBAR1       MCF_REG32(0x000B14)   /* PCI Base Address Register 1  */
-+#define MCF_PCICCPR       MCF_REG32(0x000B28)   /* PCI Cardbus CIS Pointer      */
-+#define MCF_PCISID        MCF_REG32(0x000B2C)   /* Subsystem ID/Subsystem Vendor ID*/
-+#define MCF_PCIERBAR      MCF_REG32(0x000B30)   /* PCI Expansion ROM            */
-+#define MCF_PCICPR        MCF_REG32(0x000B30)   /* PCI Capabilities Pointer     */
-+#define MCF_PCICR2        MCF_REG32(0x000B3C)   /* PCI Configuration Register 2 */
-+
-+/* General Control/Status Registers */
-+#define MCF_PCIGSCR       MCF_REG32(0x000B60)   /* Global Status/Control Register   */
-+#define MCF_PCITBATR0     MCF_REG32(0x000B64)   /* Target Base Address Translation 0*/
-+#define MCF_PCITBATR1     MCF_REG32(0x000B68)   /* Target Base Address Translation 1*/
-+#define MCF_PCITCR        MCF_REG32(0x000B6C)   /* Target Control Register          */
-+#define MCF_PCIIW0BTAR    MCF_REG32(0x000B70)   /* Initiator Window 0 Base Address  */
-+#define MCF_PCIIW1BTAR    MCF_REG32(0x000B74)   /* Initiator Window 1 Base Address  */
-+#define MCF_PCIIW2BTAR    MCF_REG32(0x000B78)   /* Initiator Window 2 Base  Address */
-+#define MCF_PCIIWCR       MCF_REG32(0x000B80)   /* Initiator Window Configuration   */
-+#define MCF_PCIICR        MCF_REG32(0x000B84)   /* Initiator Control Register       */
-+#define MCF_PCIISR        MCF_REG32(0x000B88)   /* Initiator Status Register        */
-+#define MCF_PCICAR        MCF_REG32(0x000BF8)   /* Configuration Address Register   */
-+
-+/* CommBus FIFO Transmit Interface Registers */
-+#define MCF_PCITPSR       MCF_REG32(0x008400)   /* Tx Packet Size Register            */
-+#define MCF_PCITSAR       MCF_REG32(0x008404)   /* Tx Start Address Register        */
-+#define MCF_PCITTCR       MCF_REG32(0x008408)   /* Tx Transaction Control Register  */
-+#define MCF_PCITER        MCF_REG32(0x00840C)   /* Tx Enables Register                */
-+#define MCF_PCITNAR       MCF_REG32(0x008410)   /* Tx Next Address Register         */
-+#define MCF_PCITLWR       MCF_REG32(0x008414)   /* Tx Last Word Register              */
-+#define MCF_PCITDCR       MCF_REG32(0x008418)   /* Tx Done Counts Register          */
-+#define MCF_PCITSR        MCF_REG32(0x00841C)   /* Tx Status Register                 */
-+#define MCF_PCITFDR       MCF_REG32(0x008440)   /* Tx FIFO Data Register              */
-+#define MCF_PCITFSR       MCF_REG32(0x008444)   /* Tx FIFO Status Register          */
-+#define MCF_PCITFCR       MCF_REG32(0x008448)   /* Tx FIFO Control Register         */
-+#define MCF_PCITFAR       MCF_REG32(0x00844C)   /* Tx FIFO Alarm Register             */
-+#define MCF_PCITFRPR      MCF_REG32(0x008450)   /* Tx FIFO Read Pointer Register    */
-+#define MCF_PCITFWPR      MCF_REG32(0x008454)   /* Tx FIFO Write Pointer Register   */
-+
-+/* CommBus FIFO Receive Interface Registers */
-+#define MCF_PCIRPSR       MCF_REG32(0x008480)   /* Tx Packet Size Register            */
-+#define MCF_PCIRSAR       MCF_REG32(0x008484)   /* Tx Start Address Register        */
-+#define MCF_PCIRTCR       MCF_REG32(0x008488)   /* Tx Transaction Control Register  */
-+#define MCF_PCIRER        MCF_REG32(0x00848C)   /* Tx Enables Register                */
-+#define MCF_PCIRNAR       MCF_REG32(0x008490)   /* Tx Next Address Register         */
-+#define MCF_PCIRDCR       MCF_REG32(0x008498)   /* Tx Done Counts Register          */
-+#define MCF_PCIRSR        MCF_REG32(0x00849C)   /* Tx Status Register                 */
-+#define MCF_PCIRFDR       MCF_REG32(0x0084C0)   /* Tx FIFO Data Register              */
-+#define MCF_PCIRFSR       MCF_REG32(0x0084C4)   /* Tx FIFO Status Register          */
-+#define MCF_PCIRFCR       MCF_REG32(0x0084C8)   /* Tx FIFO Control Register         */
-+#define MCF_PCIRFAR       MCF_REG32(0x0084CC)   /* Tx FIFO Alarm Register             */
-+#define MCF_PCIRFRPR      MCF_REG32(0x0084D0)   /* Tx FIFO Read Pointer Register    */
-+#define MCF_PCIRFWPR      MCF_REG32(0x0084D4)   /* Tx FIFO Write Pointer Register   */
-+
-+/* PCI Arbiter Registers */
-+#define MCF_PCIARB_PACR   MCF_REG32(0x000C00)
-+#define MCF_PCIARB_PASR   MCF_REG32(0x000C04)
-+
-+
-+/* Bit definitions and macros for MCF_PCIIDR */
-+#define MCF_PCIIDR_VENDORID(x)            (((x)&0x0000FFFF)<<0)
-+#define MCF_PCIIDR_DEVICEID(x)            (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PCISCR */
-+#define MCF_PCISCR_M      (0x00000002)
-+#define MCF_PCISCR_B      (0x00000004)
-+#define MCF_PCISCR_SP     (0x00000008)
-+#define MCF_PCISCR_MW     (0x00000010)
-+#define MCF_PCISCR_PER    (0x00000040)
-+#define MCF_PCISCR_S      (0x00000100)
-+#define MCF_PCISCR_F      (0x00000200)
-+#define MCF_PCISCR_C      (0x00100000)
-+#define MCF_PCISCR_66M    (0x00200000)
-+#define MCF_PCISCR_R      (0x00400000)
-+#define MCF_PCISCR_FC     (0x00800000)
-+#define MCF_PCISCR_DP     (0x01000000)
-+#define MCF_PCISCR_DT(x)  (((x)&0x00000003)<<25)
-+#define MCF_PCISCR_TS     (0x08000000)
-+#define MCF_PCISCR_TR     (0x10000000)
-+#define MCF_PCISCR_MA     (0x20000000)
-+#define MCF_PCISCR_SE     (0x40000000)
-+#define MCF_PCISCR_PE     (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PCICCRIR */
-+#define MCF_PCICCRIR_REVID(x)             (((x)&0x000000FF)<<0)
-+#define MCF_PCICCRIR_CLASSCODE(x)         (((x)&0x00FFFFFF)<<8)
-+
-+/* Bit definitions and macros for MCF_PCICR1 */
-+#define MCF_PCICR1_CACHELINESIZE(x)       (((x)&0x0000000F)<<0)
-+#define MCF_PCICR1_LATTIMER(x)            (((x)&0x000000FF)<<8)
-+#define MCF_PCICR1_HEADERTYPE(x)          (((x)&0x000000FF)<<16)
-+#define MCF_PCICR1_BIST(x)                (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIBAR# */
-+#define MCF_PCIBAR0_ADDR(x)               (((x)&0x00003FFF)<<18)
-+#define MCF_PCIBAR1_ADDR(x)               (((x)&0x00000003)<<30)
-+
-+/* Bit definitions and macros for MCF_PCICR2 */
-+#define MCF_PCICR2_INTLINE(x)             (((x)&0x000000FF)<<0)
-+#define MCF_PCICR2_INTPIN(x)              (((x)&0x000000FF)<<8)
-+#define MCF_PCICR2_MINGNT(x)              (((x)&0x000000FF)<<16)
-+#define MCF_PCICR2_MAXLAT(x)              (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIGSCR */
-+#define MCF_PCIGSCR_PR                    (0x00000001)
-+#define MCF_PCIGSCR_SEE                   (0x00001000)
-+#define MCF_PCIGSCR_PEE                   (0x00002000)
-+#define MCF_PCIGSCR_SE                    (0x10000000)
-+#define MCF_PCIGSCR_PE                    (0x20000000)
-+
-+/* Bit definitions and macros for MCF_PCITBATR0 */
-+#define MCF_PCITBATR0_EN                  (0x00000001)
-+#define MCF_PCITBATR0_BAT0(x)             (((x)&0x00003FFF)<<18)
-+
-+/* Bit definitions and macros for MCF_PCITBATR1 */
-+#define MCF_PCITBATR1_EN                  (0x00000001)
-+#define MCF_PCITBATR1_BAT1(x)             (((x)&0x00000003)<<30)
-+
-+/* Bit definitions and macros for MCF_PCITCR */
-+#define MCF_PCITCR_P                      (0x00010000)
-+#define MCF_PCITCR_LD                     (0x01000000)
-+
-+/* Bit definitions and macros for MCF_PCIIW0BTAR */
-+#define MCF_PCIIW0BTAR_WTA0(x)            (((x)&0x000000FF)<<8)
-+#define MCF_PCIIW0BTAR_WAM0(x)            (((x)&0x000000FF)<<16)
-+#define MCF_PCIIW0BTAR_WBA0(x)            (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIIW1BTAR */
-+#define MCF_PCIIW1BTAR_WTA1(x)            (((x)&0x000000FF)<<8)
-+#define MCF_PCIIW1BTAR_WAM1(x)            (((x)&0x000000FF)<<16)
-+#define MCF_PCIIW1BTAR_WBA1(x)            (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIIW2BTAR */
-+#define MCF_PCIIW2BTAR_WTA2(x)            (((x)&0x000000FF)<<8)
-+#define MCF_PCIIW2BTAR_WAM2(x)            (((x)&0x000000FF)<<16)
-+#define MCF_PCIIW2BTAR_WBA2(x)            (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIIWCR */
-+#define MCF_PCIIWCR_WINCTRL2(x)           (((x)&0x0000000F)<<8)
-+#define MCF_PCIIWCR_WINCTRL1(x)           (((x)&0x0000000F)<<16)
-+#define MCF_PCIIWCR_WINCTRL0(x)           (((x)&0x0000000F)<<24)
-+#define MCF_PCIIWCR_WINCTRL0_MEMREAD      (0x01000000)
-+#define MCF_PCIIWCR_WINCTRL0_MEMRDLINE    (0x03000000)
-+#define MCF_PCIIWCR_WINCTRL0_MEMRDMUL     (0x05000000)
-+#define MCF_PCIIWCR_WINCTRL0_IO           (0x09000000)
-+#define MCF_PCIIWCR_WINCTRL0_E            (0x01000000)
-+#define MCF_PCIIWCR_WINCTRL1_MEMREAD      (0x00010000)
-+#define MCF_PCIIWCR_WINCTRL1_MEMRDLINE    (0x00030000)
-+#define MCF_PCIIWCR_WINCTRL1_MEMRDMUL     (0x00050000)
-+#define MCF_PCIIWCR_WINCTRL1_IO           (0x00090000)
-+#define MCF_PCIIWCR_WINCTRL1_E            (0x00010000)
-+#define MCF_PCIIWCR_WINCTRL2_MEMREAD      (0x00000100)
-+#define MCF_PCIIWCR_WINCTRL2_MEMRDLINE    (0x00000300)
-+#define MCF_PCIIWCR_WINCTRL2_MEMRDMUL     (0x00000500)
-+#define MCF_PCIIWCR_WINCTRL2_IO           (0x00000900)
-+#define MCF_PCIIWCR_WINCTRL2_E            (0x00000100)
-+
-+
-+/* Bit definitions and macros for MCF_PCIICR */
-+#define MCF_PCIICR_MAXRETRY(x)            (((x)&0x000000FF)<<0)
-+#define MCF_PCIICR_TAE                    (0x01000000)
-+#define MCF_PCIICR_IAE                    (0x02000000)
-+#define MCF_PCIICR_REE                    (0x04000000)
-+
-+/* Bit definitions and macros for MCF_PCIISR */
-+#define MCF_PCIISR_TA                     (0x01000000)
-+#define MCF_PCIISR_IA                     (0x02000000)
-+#define MCF_PCIISR_RE                     (0x04000000)
-+
-+/* Bit definitions and macros for MCF_PCICAR */
-+#define MCF_PCICAR_DWORD(x)               (((x)&0x0000003F)<<2)
-+#define MCF_PCICAR_FUNCNUM(x)             (((x)&0x00000007)<<8)
-+#define MCF_PCICAR_DEVNUM(x)              (((x)&0x0000001F)<<11)
-+#define MCF_PCICAR_BUSNUM(x)              (((x)&0x000000FF)<<16)
-+#define MCF_PCICAR_E                      (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PCITPSR */
-+#define MCF_PCITPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PCITTCR */
-+#define MCF_PCITTCR_DI                    (0x00000001)
-+#define MCF_PCITTCR_W                     (0x00000010)
-+#define MCF_PCITTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
-+#define MCF_PCITTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
-+#define MCF_PCITTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
-+
-+/* Bit definitions and macros for MCF_PCITER */
-+#define MCF_PCITER_NE                     (0x00010000)
-+#define MCF_PCITER_IAE                    (0x00020000)
-+#define MCF_PCITER_TAE                    (0x00040000)
-+#define MCF_PCITER_RE                     (0x00080000)
-+#define MCF_PCITER_SE                     (0x00100000)
-+#define MCF_PCITER_FEE                    (0x00200000)
-+#define MCF_PCITER_ME                     (0x01000000)
-+#define MCF_PCITER_BE                     (0x08000000)
-+#define MCF_PCITER_CM                     (0x10000000)
-+#define MCF_PCITER_RF                     (0x40000000)
-+#define MCF_PCITER_RC                     (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PCITDCR */
-+#define MCF_PCITDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
-+#define MCF_PCITDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PCITSR */
-+#define MCF_PCITSR_IA                     (0x00010000)
-+#define MCF_PCITSR_TA                     (0x00020000)
-+#define MCF_PCITSR_RE                     (0x00040000)
-+#define MCF_PCITSR_SE                     (0x00080000)
-+#define MCF_PCITSR_FE                     (0x00100000)
-+#define MCF_PCITSR_BE1                    (0x00200000)
-+#define MCF_PCITSR_BE2                    (0x00400000)
-+#define MCF_PCITSR_BE3                    (0x00800000)
-+#define MCF_PCITSR_NT                     (0x01000000)
-+
-+/* Bit definitions and macros for MCF_PCITFSR */
-+#define MCF_PCITFSR_EMT                   (0x00010000)
-+#define MCF_PCITFSR_ALARM                 (0x00020000)
-+#define MCF_PCITFSR_FU                    (0x00040000)
-+#define MCF_PCITFSR_FR                    (0x00080000)
-+#define MCF_PCITFSR_OF                    (0x00100000)
-+#define MCF_PCITFSR_UF                    (0x00200000)
-+#define MCF_PCITFSR_RXW                   (0x00400000)
-+
-+/* Bit definitions and macros for MCF_PCITFCR */
-+#define MCF_PCITFCR_OF_MSK                (0x00080000)
-+#define MCF_PCITFCR_UF_MSK                (0x00100000)
-+#define MCF_PCITFCR_RXW_MSK               (0x00200000)
-+#define MCF_PCITFCR_FAE_MSK               (0x00400000)
-+#define MCF_PCITFCR_IP_MSK                (0x00800000)
-+#define MCF_PCITFCR_GR(x)                 (((x)&0x00000007)<<24)
-+
-+/* Bit definitions and macros for MCF_PCITFAR */
-+#define MCF_PCITFAR_ALARM(x)              (((x)&0x0000007F)<<0)
-+
-+/* Bit definitions and macros for MCF_PCITFRPR */
-+#define MCF_PCITFRPR_READ(x)              (((x)&0x00000FFF)<<0)
-+
-+/* Bit definitions and macros for MCF_PCITFWPR */
-+#define MCF_PCITFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
-+
-+/* Bit definitions and macros for MCF_PCIRPSR */
-+#define MCF_PCIRPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PCIRTCR */
-+#define MCF_PCIRTCR_DI                    (0x00000001)
-+#define MCF_PCIRTCR_W                     (0x00000010)
-+#define MCF_PCIRTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
-+#define MCF_PCIRTCR_FB                    (0x00001000)
-+#define MCF_PCIRTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
-+#define MCF_PCIRTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIRER */
-+#define MCF_PCIRER_NE                     (0x00010000)
-+#define MCF_PCIRER_IAE                    (0x00020000)
-+#define MCF_PCIRER_TAE                    (0x00040000)
-+#define MCF_PCIRER_RE                     (0x00080000)
-+#define MCF_PCIRER_SE                     (0x00100000)
-+#define MCF_PCIRER_FEE                    (0x00200000)
-+#define MCF_PCIRER_ME                     (0x01000000)
-+#define MCF_PCIRER_BE                     (0x08000000)
-+#define MCF_PCIRER_CM                     (0x10000000)
-+#define MCF_PCIRER_FE                     (0x20000000)
-+#define MCF_PCIRER_RF                     (0x40000000)
-+#define MCF_PCIRER_RC                     (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PCIRDCR */
-+#define MCF_PCIRDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
-+#define MCF_PCIRDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PCIRSR */
-+#define MCF_PCIRSR_IA                     (0x00010000)
-+#define MCF_PCIRSR_TA                     (0x00020000)
-+#define MCF_PCIRSR_RE                     (0x00040000)
-+#define MCF_PCIRSR_SE                     (0x00080000)
-+#define MCF_PCIRSR_FE                     (0x00100000)
-+#define MCF_PCIRSR_BE1                    (0x00200000)
-+#define MCF_PCIRSR_BE2                    (0x00400000)
-+#define MCF_PCIRSR_BE3                    (0x00800000)
-+#define MCF_PCIRSR_NT                     (0x01000000)
-+
-+/* Bit definitions and macros for MCF_PCIRFSR */
-+#define MCF_PCIRFSR_EMT                   (0x00010000)
-+#define MCF_PCIRFSR_ALARM                 (0x00020000)
-+#define MCF_PCIRFSR_FU                    (0x00040000)
-+#define MCF_PCIRFSR_FR                    (0x00080000)
-+#define MCF_PCIRFSR_OF                    (0x00100000)
-+#define MCF_PCIRFSR_UF                    (0x00200000)
-+#define MCF_PCIRFSR_RXW                   (0x00400000)
-+
-+/* Bit definitions and macros for MCF_PCIRFCR */
-+#define MCF_PCIRFCR_OF_MSK                (0x00080000)
-+#define MCF_PCIRFCR_UF_MSK                (0x00100000)
-+#define MCF_PCIRFCR_RXW_MSK               (0x00200000)
-+#define MCF_PCIRFCR_FAE_MSK               (0x00400000)
-+#define MCF_PCIRFCR_IP_MSK                (0x00800000)
-+#define MCF_PCIRFCR_GR(x)                 (((x)&0x00000007)<<24)
-+
-+/* Bit definitions and macros for MCF_PCIRFAR */
-+#define MCF_PCIRFAR_ALARM(x)              (((x)&0x0000007F)<<0)
-+
-+/* Bit definitions and macros for MCF_PCIRFRPR */
-+#define MCF_PCIRFRPR_READ(x)              (((x)&0x00000FFF)<<0)
-+
-+/* Bit definitions and macros for MCF_PCIRFWPR */
-+#define MCF_PCIRFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
-+
-+
-+/* Bit definitions and macros for MCF_PCIARB_PACR */
-+#define MCF_PCIARB_PACR_INTMPRI         (0x00000001)
-+#define MCF_PCIARB_PACR_EXTMPRI(x)      (((x)&0x0000001F)<<1)
-+#define MCF_PCIARB_PACR_INTMINTEN       (0x00010000)
-+#define MCF_PCIARB_PACR_EXTMINTEN(x)    (((x)&0x0000001F)<<17)
-+#define MCF_PCIARB_PACR_PKMD            (0x40000000)
-+#define MCF_PCIARB_PACR_DS              (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PCIARB_PASR */
-+#define MCF_PCIARB_PASR_ITLMBK          (0x00010000)
-+#define MCF_PCIARB_PASR_EXTMBK(x)       (((x)&0x0000001F)<<17)
-+
-+#endif /* __MCF548X_PCI_H__ */
---- /dev/null
-+++ b/include/asm-m68k/m5485psc.h
-@@ -0,0 +1,474 @@
-+/*
-+ * File:      mcf548x_psc.h
-+ * Purpose:   Register and bit definitions for the MCF548X
-+ *
-+ * Notes:     
-+ *    
-+ */
-+
-+#ifndef __MCF548X_PSC_H__
-+#define __MCF548X_PSC_H__
-+
-+/*********************************************************************
-+*
-+* Programmable Serial Controller (PSC)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_PSC_MR0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600))
-+#define MCF_PSC_SR0            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604))
-+#define MCF_PSC_CSR0           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604))
-+#define MCF_PSC_CR0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608))
-+#define MCF_PSC_RB0            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
-+#define MCF_PSC_TB0            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
-+#define MCF_PSC_TB_8BIT0       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
-+#define MCF_PSC_TB_16BIT0      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
-+#define MCF_PSC_TB_AC970       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
-+#define MCF_PSC_IPCR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610))
-+#define MCF_PSC_ACR0           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610))
-+#define MCF_PSC_ISR0           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614))
-+#define MCF_PSC_IMR0           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614))
-+#define MCF_PSC_CTUR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618))
-+#define MCF_PSC_CTLR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C))
-+#define MCF_PSC_IP0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634))
-+#define MCF_PSC_OPSET0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638))
-+#define MCF_PSC_OPRESET0       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C))
-+#define MCF_PSC_SICR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640))
-+#define MCF_PSC_IRCR10         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644))
-+#define MCF_PSC_IRCR20         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648))
-+#define MCF_PSC_IRSDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C))
-+#define MCF_PSC_IRMDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650))
-+#define MCF_PSC_IRFDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654))
-+#define MCF_PSC_RFCNT0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658))
-+#define MCF_PSC_TFCNT0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C))
-+#define MCF_PSC_RFSR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664))
-+#define MCF_PSC_TFSR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684))
-+#define MCF_PSC_RFCR0          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668))
-+#define MCF_PSC_TFCR0          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688))
-+#define MCF_PSC_RFAR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00866E))
-+#define MCF_PSC_TFAR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00868E))
-+#define MCF_PSC_RFRP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672))
-+#define MCF_PSC_TFRP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692))
-+#define MCF_PSC_RFWP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676))
-+#define MCF_PSC_TFWP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696))
-+#define MCF_PSC_RLRFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A))
-+#define MCF_PSC_TLRFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A))
-+#define MCF_PSC_RLWFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E))
-+#define MCF_PSC_TLWFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E))
-+#define MCF_PSC_MR1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008700))
-+#define MCF_PSC_SR1            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008704))
-+#define MCF_PSC_CSR1           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008704))
-+#define MCF_PSC_CR1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008708))
-+#define MCF_PSC_RB1            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
-+#define MCF_PSC_TB1            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
-+#define MCF_PSC_TB_8BIT1       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
-+#define MCF_PSC_TB_16BIT1      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
-+#define MCF_PSC_TB_AC971       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
-+#define MCF_PSC_IPCR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710))
-+#define MCF_PSC_ACR1           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710))
-+#define MCF_PSC_ISR1           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714))
-+#define MCF_PSC_IMR1           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714))
-+#define MCF_PSC_CTUR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008718))
-+#define MCF_PSC_CTLR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00871C))
-+#define MCF_PSC_IP1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008734))
-+#define MCF_PSC_OPSET1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008738))
-+#define MCF_PSC_OPRESET1       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00873C))
-+#define MCF_PSC_SICR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008740))
-+#define MCF_PSC_IRCR11         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008744))
-+#define MCF_PSC_IRCR21         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008748))
-+#define MCF_PSC_IRSDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00874C))
-+#define MCF_PSC_IRMDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008750))
-+#define MCF_PSC_IRFDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008754))
-+#define MCF_PSC_RFCNT1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008758))
-+#define MCF_PSC_TFCNT1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00875C))
-+#define MCF_PSC_RFSR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008764))
-+#define MCF_PSC_TFSR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008784))
-+#define MCF_PSC_RFCR1          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008768))
-+#define MCF_PSC_TFCR1          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008788))
-+#define MCF_PSC_RFAR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00876E))
-+#define MCF_PSC_TFAR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00878E))
-+#define MCF_PSC_RFRP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008772))
-+#define MCF_PSC_TFRP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008792))
-+#define MCF_PSC_RFWP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008776))
-+#define MCF_PSC_TFWP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008796))
-+#define MCF_PSC_RLRFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877A))
-+#define MCF_PSC_TLRFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879A))
-+#define MCF_PSC_RLWFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877E))
-+#define MCF_PSC_TLWFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879E))
-+#define MCF_PSC_MR2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008800))
-+#define MCF_PSC_SR2            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008804))
-+#define MCF_PSC_CSR2           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008804))
-+#define MCF_PSC_CR2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008808))
-+#define MCF_PSC_RB2            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
-+#define MCF_PSC_TB2            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
-+#define MCF_PSC_TB_8BIT2       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
-+#define MCF_PSC_TB_16BIT2      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
-+#define MCF_PSC_TB_AC972       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
-+#define MCF_PSC_IPCR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810))
-+#define MCF_PSC_ACR2           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810))
-+#define MCF_PSC_ISR2           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814))
-+#define MCF_PSC_IMR2           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814))
-+#define MCF_PSC_CTUR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008818))
-+#define MCF_PSC_CTLR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00881C))
-+#define MCF_PSC_IP2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008834))
-+#define MCF_PSC_OPSET2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008838))
-+#define MCF_PSC_OPRESET2       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00883C))
-+#define MCF_PSC_SICR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008840))
-+#define MCF_PSC_IRCR12         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008844))
-+#define MCF_PSC_IRCR22         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008848))
-+#define MCF_PSC_IRSDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00884C))
-+#define MCF_PSC_IRMDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008850))
-+#define MCF_PSC_IRFDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008854))
-+#define MCF_PSC_RFCNT2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008858))
-+#define MCF_PSC_TFCNT2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00885C))
-+#define MCF_PSC_RFSR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008864))
-+#define MCF_PSC_TFSR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008884))
-+#define MCF_PSC_RFCR2          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008868))
-+#define MCF_PSC_TFCR2          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008888))
-+#define MCF_PSC_RFAR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00886E))
-+#define MCF_PSC_TFAR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00888E))
-+#define MCF_PSC_RFRP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008872))
-+#define MCF_PSC_TFRP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008892))
-+#define MCF_PSC_RFWP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008876))
-+#define MCF_PSC_TFWP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008896))
-+#define MCF_PSC_RLRFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887A))
-+#define MCF_PSC_TLRFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889A))
-+#define MCF_PSC_RLWFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887E))
-+#define MCF_PSC_TLWFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889E))
-+#define MCF_PSC_MR3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008900))
-+#define MCF_PSC_SR3            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008904))
-+#define MCF_PSC_CSR3           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008904))
-+#define MCF_PSC_CR3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008908))
-+#define MCF_PSC_RB3            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
-+#define MCF_PSC_TB3            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
-+#define MCF_PSC_TB_8BIT3       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
-+#define MCF_PSC_TB_16BIT3      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
-+#define MCF_PSC_TB_AC973       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
-+#define MCF_PSC_IPCR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910))
-+#define MCF_PSC_ACR3           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910))
-+#define MCF_PSC_ISR3           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914))
-+#define MCF_PSC_IMR3           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914))
-+#define MCF_PSC_CTUR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008918))
-+#define MCF_PSC_CTLR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00891C))
-+#define MCF_PSC_IP3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008934))
-+#define MCF_PSC_OPSET3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008938))
-+#define MCF_PSC_OPRESET3       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00893C))
-+#define MCF_PSC_SICR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008940))
-+#define MCF_PSC_IRCR13         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008944))
-+#define MCF_PSC_IRCR23         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008948))
-+#define MCF_PSC_IRSDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00894C))
-+#define MCF_PSC_IRMDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008950))
-+#define MCF_PSC_IRFDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008954))
-+#define MCF_PSC_RFCNT3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008958))
-+#define MCF_PSC_TFCNT3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00895C))
-+#define MCF_PSC_RFSR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008964))
-+#define MCF_PSC_TFSR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008984))
-+#define MCF_PSC_RFCR3          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008968))
-+#define MCF_PSC_TFCR3          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008988))
-+#define MCF_PSC_RFAR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00896E))
-+#define MCF_PSC_TFAR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00898E))
-+#define MCF_PSC_RFRP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008972))
-+#define MCF_PSC_TFRP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008992))
-+#define MCF_PSC_RFWP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008976))
-+#define MCF_PSC_TFWP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008996))
-+#define MCF_PSC_RLRFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897A))
-+#define MCF_PSC_TLRFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899A))
-+#define MCF_PSC_RLWFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897E))
-+#define MCF_PSC_TLWFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899E))
-+#define MCF_PSC_MR(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600+((x)*0x100)))
-+#define MCF_PSC_SR(x)          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604+((x)*0x100)))
-+#define MCF_PSC_CSR(x)         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604+((x)*0x100)))
-+#define MCF_PSC_CR(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608+((x)*0x100)))
-+#define MCF_PSC_RB(x)          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
-+#define MCF_PSC_TB(x)          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
-+#define MCF_PSC_TB_8BIT(x)     (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
-+#define MCF_PSC_TB_16BIT(x)    (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
-+#define MCF_PSC_TB_AC97(x)     (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
-+#define MCF_PSC_IPCR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100)))
-+#define MCF_PSC_ACR(x)         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100)))
-+#define MCF_PSC_ISR(x)         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100)))
-+#define MCF_PSC_IMR(x)         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100)))
-+#define MCF_PSC_CTUR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618+((x)*0x100)))
-+#define MCF_PSC_CTLR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C+((x)*0x100)))
-+#define MCF_PSC_IP(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634+((x)*0x100)))
-+#define MCF_PSC_OPSET(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638+((x)*0x100)))
-+#define MCF_PSC_OPRESET(x)     (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C+((x)*0x100)))
-+#define MCF_PSC_SICR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640+((x)*0x100)))
-+#define MCF_PSC_IRCR1(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644+((x)*0x100)))
-+#define MCF_PSC_IRCR2(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648+((x)*0x100)))
-+#define MCF_PSC_IRSDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C+((x)*0x100)))
-+#define MCF_PSC_IRMDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650+((x)*0x100)))
-+#define MCF_PSC_IRFDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654+((x)*0x100)))
-+#define MCF_PSC_RFCNT(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658+((x)*0x100)))
-+#define MCF_PSC_TFCNT(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C+((x)*0x100)))
-+#define MCF_PSC_RFSR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664+((x)*0x100)))
-+#define MCF_PSC_TFSR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684+((x)*0x100)))
-+#define MCF_PSC_RFCR(x)        (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668+((x)*0x100)))
-+#define MCF_PSC_TFCR(x)        (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688+((x)*0x100)))
-+#define MCF_PSC_RFAR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00866E)+((x)*0x100)))
-+#define MCF_PSC_TFAR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00868E)+((x)*0x100)))
-+#define MCF_PSC_RFRP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672+((x)*0x100)))
-+#define MCF_PSC_TFRP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692+((x)*0x100)))
-+#define MCF_PSC_RFWP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676+((x)*0x100)))
-+#define MCF_PSC_TFWP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696+((x)*0x100)))
-+#define MCF_PSC_RLRFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A+((x)*0x100)))
-+#define MCF_PSC_TLRFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A+((x)*0x100)))
-+#define MCF_PSC_RLWFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E+((x)*0x100)))
-+#define MCF_PSC_TLWFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E+((x)*0x100)))
-+
-+/* Bit definitions and macros for MCF_PSC_MR */
-+#define MCF_PSC_MR_BC(x)              (((x)&0x03)<<0)
-+#define MCF_PSC_MR_PT                 (0x04)
-+#define MCF_PSC_MR_PM(x)              (((x)&0x03)<<3)
-+#define MCF_PSC_MR_ERR                (0x20)
-+#define MCF_PSC_MR_RXIRQ              (0x40)
-+#define MCF_PSC_MR_RXRTS              (0x80)
-+#define MCF_PSC_MR_SB(x)              (((x)&0x0F)<<0)
-+#define MCF_PSC_MR_TXCTS              (0x10)
-+#define MCF_PSC_MR_TXRTS              (0x20)
-+#define MCF_PSC_MR_CM(x)              (((x)&0x03)<<6)
-+#define MCF_PSC_MR_PM_MULTI_ADDR      (0x1C)
-+#define MCF_PSC_MR_PM_MULTI_DATA      (0x18)
-+#define MCF_PSC_MR_PM_NONE            (0x10)
-+#define MCF_PSC_MR_PM_FORCE_HI        (0x0C)
-+#define MCF_PSC_MR_PM_FORCE_LO        (0x08)
-+#define MCF_PSC_MR_PM_ODD             (0x04)
-+#define MCF_PSC_MR_PM_EVEN            (0x00)
-+#define MCF_PSC_MR_BC_5               (0x00)
-+#define MCF_PSC_MR_BC_6               (0x01)
-+#define MCF_PSC_MR_BC_7               (0x02)
-+#define MCF_PSC_MR_BC_8               (0x03)
-+#define MCF_PSC_MR_CM_NORMAL          (0x00)
-+#define MCF_PSC_MR_CM_ECHO            (0x40)
-+#define MCF_PSC_MR_CM_LOCAL_LOOP      (0x80)
-+#define MCF_PSC_MR_CM_REMOTE_LOOP     (0xC0)
-+#define MCF_PSC_MR_SB_STOP_BITS_1     (0x07)
-+#define MCF_PSC_MR_SB_STOP_BITS_15    (0x08)
-+#define MCF_PSC_MR_SB_STOP_BITS_2     (0x0F)
-+
-+/* Bit definitions and macros for MCF_PSC_SR */
-+#define MCF_PSC_SR_ERR                (0x0040)
-+#define MCF_PSC_SR_CDE_DEOF           (0x0080)
-+#define MCF_PSC_SR_RXRDY              (0x0100)
-+#define MCF_PSC_SR_FU                 (0x0200)
-+#define MCF_PSC_SR_TXRDY              (0x0400)
-+#define MCF_PSC_SR_TXEMP_URERR        (0x0800)
-+#define MCF_PSC_SR_OE                 (0x1000)
-+#define MCF_PSC_SR_PE_CRCERR          (0x2000)
-+#define MCF_PSC_SR_FE_PHYERR          (0x4000)
-+#define MCF_PSC_SR_RB_NEOF            (0x8000)
-+
-+/* Bit definitions and macros for MCF_PSC_CSR */
-+#define MCF_PSC_CSR_TCSEL(x)          (((x)&0x0F)<<0)
-+#define MCF_PSC_CSR_RCSEL(x)          (((x)&0x0F)<<4)
-+#define MCF_PSC_CSR_RCSEL_SYS_CLK     (0xD0)
-+#define MCF_PSC_CSR_RCSEL_CTM16       (0xE0)
-+#define MCF_PSC_CSR_RCSEL_CTM         (0xF0)
-+#define MCF_PSC_CSR_TCSEL_SYS_CLK     (0x0D)
-+#define MCF_PSC_CSR_TCSEL_CTM16       (0x0E)
-+#define MCF_PSC_CSR_TCSEL_CTM         (0x0F)
-+
-+/* Bit definitions and macros for MCF_PSC_CR */
-+#define MCF_PSC_CR_RXC(x)             (((x)&0x03)<<0)
-+#define MCF_PSC_CR_TXC(x)             (((x)&0x03)<<2)
-+#define MCF_PSC_CR_MISC(x)            (((x)&0x07)<<4)
-+#define MCF_PSC_CR_NONE               (0x00)
-+#define MCF_PSC_CR_STOP_BREAK         (0x70)
-+#define MCF_PSC_CR_START_BREAK        (0x60)
-+#define MCF_PSC_CR_BKCHGINT           (0x50)
-+#define MCF_PSC_CR_RESET_ERROR        (0x40)
-+#define MCF_PSC_CR_RESET_TX           (0x30)
-+#define MCF_PSC_CR_RESET_RX           (0x20)
-+#define MCF_PSC_CR_RESET_MR           (0x10)
-+#define MCF_PSC_CR_TX_DISABLED        (0x08)
-+#define MCF_PSC_CR_TX_ENABLED         (0x04)
-+#define MCF_PSC_CR_RX_DISABLED        (0x02)
-+#define MCF_PSC_CR_RX_ENABLED         (0x01)
-+
-+/* Bit definitions and macros for MCF_PSC_TB_8BIT */
-+#define MCF_PSC_TB_8BIT_TB3(x)        (((x)&0x000000FF)<<0)
-+#define MCF_PSC_TB_8BIT_TB2(x)        (((x)&0x000000FF)<<8)
-+#define MCF_PSC_TB_8BIT_TB1(x)        (((x)&0x000000FF)<<16)
-+#define MCF_PSC_TB_8BIT_TB0(x)        (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for MCF_PSC_TB_16BIT */
-+#define MCF_PSC_TB_16BIT_TB1(x)       (((x)&0x0000FFFF)<<0)
-+#define MCF_PSC_TB_16BIT_TB0(x)       (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for MCF_PSC_TB_AC97 */
-+#define MCF_PSC_TB_AC97_SOF           (0x00000800)
-+#define MCF_PSC_TB_AC97_TB(x)         (((x)&0x000FFFFF)<<12)
-+
-+/* Bit definitions and macros for MCF_PSC_IPCR */
-+#define MCF_PSC_IPCR_RESERVED         (0x0C)
-+#define MCF_PSC_IPCR_CTS              (0x0D)
-+#define MCF_PSC_IPCR_D_CTS            (0x1C)
-+#define MCF_PSC_IPCR_SYNC             (0x8C)
-+
-+/* Bit definitions and macros for MCF_PSC_ACR */
-+#define MCF_PSC_ACR_IEC0              (0x01)
-+#define MCF_PSC_ACR_CTMS(x)           (((x)&0x07)<<4)
-+#define MCF_PSC_ACR_BRG               (0x80)
-+
-+/* Bit definitions and macros for MCF_PSC_ISR */
-+#define MCF_PSC_ISR_ERR               (0x0040)
-+#define MCF_PSC_ISR_DEOF              (0x0080)
-+#define MCF_PSC_ISR_TXRDY             (0x0100)
-+#define MCF_PSC_ISR_RXRDY_FU          (0x0200)
-+#define MCF_PSC_ISR_DB                (0x0400)
-+#define MCF_PSC_ISR_IPC               (0x8000)
-+
-+/* Bit definitions and macros for MCF_PSC_IMR */
-+#define MCF_PSC_IMR_ERR               (0x0040)
-+#define MCF_PSC_IMR_DEOF              (0x0080)
-+#define MCF_PSC_IMR_TXRDY             (0x0100)
-+#define MCF_PSC_IMR_RXRDY_FU          (0x0200)
-+#define MCF_PSC_IMR_DB                (0x0400)
-+#define MCF_PSC_IMR_IPC               (0x8000)
-+
-+/* Bit definitions and macros for MCF_PSC_IP */
-+#define MCF_PSC_IP_CTS                (0x01)
-+#define MCF_PSC_IP_TGL                (0x40)
-+#define MCF_PSC_IP_LWPR_B             (0x80)
-+
-+/* Bit definitions and macros for MCF_PSC_OPSET */
-+#define MCF_PSC_OPSET_RTS             (0x01)
-+
-+/* Bit definitions and macros for MCF_PSC_OPRESET */
-+#define MCF_PSC_OPRESET_RTS           (0x01)
-+
-+/* Bit definitions and macros for MCF_PSC_SICR */
-+#define MCF_PSC_SICR_SIM(x)           (((x)&0x07)<<0)
-+#define MCF_PSC_SICR_SHDIR            (0x10)
-+#define MCF_PSC_SICR_DTS              (0x20)
-+#define MCF_PSC_SICR_AWR              (0x40)
-+#define MCF_PSC_SICR_ACRB             (0x80)
-+#define MCF_PSC_SICR_SIM_UART         (0x00)
-+#define MCF_PSC_SICR_SIM_MODEM8       (0x01)
-+#define MCF_PSC_SICR_SIM_MODEM16      (0x02)
-+#define MCF_PSC_SICR_SIM_AC97         (0x03)
-+#define MCF_PSC_SICR_SIM_SIR          (0x04)
-+#define MCF_PSC_SICR_SIM_MIR          (0x05)
-+#define MCF_PSC_SICR_SIM_FIR          (0x06)
-+
-+/* Bit definitions and macros for MCF_PSC_IRCR1 */
-+#define MCF_PSC_IRCR1_SPUL            (0x01)
-+#define MCF_PSC_IRCR1_SIPEN           (0x02)
-+#define MCF_PSC_IRCR1_FD              (0x04)
-+
-+/* Bit definitions and macros for MCF_PSC_IRCR2 */
-+#define MCF_PSC_IRCR2_NXTEOF          (0x01)
-+#define MCF_PSC_IRCR2_ABORT           (0x02)
-+#define MCF_PSC_IRCR2_SIPREQ          (0x04)
-+
-+/* Bit definitions and macros for MCF_PSC_IRMDR */
-+#define MCF_PSC_IRMDR_M_FDIV(x)       (((x)&0x7F)<<0)
-+#define MCF_PSC_IRMDR_FREQ            (0x80)
-+
-+/* Bit definitions and macros for MCF_PSC_IRFDR */
-+#define MCF_PSC_IRFDR_F_FDIV(x)       (((x)&0x0F)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RFCNT */
-+#define MCF_PSC_RFCNT_CNT(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TFCNT */
-+#define MCF_PSC_TFCNT_CNT(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RFSR */
-+#define MCF_PSC_RFSR_EMT              (0x0001)
-+#define MCF_PSC_RFSR_ALARM            (0x0002)
-+#define MCF_PSC_RFSR_FU               (0x0004)
-+#define MCF_PSC_RFSR_FRMRY            (0x0008)
-+#define MCF_PSC_RFSR_OF               (0x0010)
-+#define MCF_PSC_RFSR_UF               (0x0020)
-+#define MCF_PSC_RFSR_RXW              (0x0040)
-+#define MCF_PSC_RFSR_FAE              (0x0080)
-+#define MCF_PSC_RFSR_FRM(x)           (((x)&0x000F)<<8)
-+#define MCF_PSC_RFSR_TAG              (0x1000)
-+#define MCF_PSC_RFSR_TXW              (0x4000)
-+#define MCF_PSC_RFSR_IP               (0x8000)
-+#define MCF_PSC_RFSR_FRM_BYTE0        (0x0800)
-+#define MCF_PSC_RFSR_FRM_BYTE1        (0x0400)
-+#define MCF_PSC_RFSR_FRM_BYTE2        (0x0200)
-+#define MCF_PSC_RFSR_FRM_BYTE3        (0x0100)
-+
-+/* Bit definitions and macros for MCF_PSC_TFSR */
-+#define MCF_PSC_TFSR_EMT              (0x0001)
-+#define MCF_PSC_TFSR_ALARM            (0x0002)
-+#define MCF_PSC_TFSR_FU               (0x0004)
-+#define MCF_PSC_TFSR_FRMRY            (0x0008)
-+#define MCF_PSC_TFSR_OF               (0x0010)
-+#define MCF_PSC_TFSR_UF               (0x0020)
-+#define MCF_PSC_TFSR_RXW              (0x0040)
-+#define MCF_PSC_TFSR_FAE              (0x0080)
-+#define MCF_PSC_TFSR_FRM(x)           (((x)&0x000F)<<8)
-+#define MCF_PSC_TFSR_TAG              (0x1000)
-+#define MCF_PSC_TFSR_TXW              (0x4000)
-+#define MCF_PSC_TFSR_IP               (0x8000)
-+#define MCF_PSC_TFSR_FRM_BYTE0        (0x0800)
-+#define MCF_PSC_TFSR_FRM_BYTE1        (0x0400)
-+#define MCF_PSC_TFSR_FRM_BYTE2        (0x0200)
-+#define MCF_PSC_TFSR_FRM_BYTE3        (0x0100)
-+
-+/* Bit definitions and macros for MCF_PSC_RFCR */
-+#define MCF_PSC_RFCR_CNTR(x)          (((x)&0x0000FFFF)<<0)
-+#define MCF_PSC_RFCR_TXW_MSK          (0x00040000)
-+#define MCF_PSC_RFCR_OF_MSK           (0x00080000)
-+#define MCF_PSC_RFCR_UF_MSK           (0x00100000)
-+#define MCF_PSC_RFCR_RXW_MSK          (0x00200000)
-+#define MCF_PSC_RFCR_FAE_MSK          (0x00400000)
-+#define MCF_PSC_RFCR_IP_MSK           (0x00800000)
-+#define MCF_PSC_RFCR_GR(x)            (((x)&0x00000007)<<24)
-+#define MCF_PSC_RFCR_FRMEN            (0x08000000)
-+#define MCF_PSC_RFCR_TIMER            (0x10000000)
-+#define MCF_PSC_RFCR_WRITETAG         (0x20000000)
-+#define MCF_PSC_RFCR_SHADOW           (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PSC_TFCR */
-+#define MCF_PSC_TFCR_CNTR(x)          (((x)&0x0000FFFF)<<0)
-+#define MCF_PSC_TFCR_TXW_MSK          (0x00040000)
-+#define MCF_PSC_TFCR_OF_MSK           (0x00080000)
-+#define MCF_PSC_TFCR_UF_MSK           (0x00100000)
-+#define MCF_PSC_TFCR_RXW_MSK          (0x00200000)
-+#define MCF_PSC_TFCR_FAE_MSK          (0x00400000)
-+#define MCF_PSC_TFCR_IP_MSK           (0x00800000)
-+#define MCF_PSC_TFCR_GR(x)            (((x)&0x00000007)<<24)
-+#define MCF_PSC_TFCR_FRMEN            (0x08000000)
-+#define MCF_PSC_TFCR_TIMER            (0x10000000)
-+#define MCF_PSC_TFCR_WRITETAG         (0x20000000)
-+#define MCF_PSC_TFCR_SHADOW           (0x80000000)
-+
-+/* Bit definitions and macros for MCF_PSC_RFAR */
-+#define MCF_PSC_RFAR_ALARM(x)         (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TFAR */
-+#define MCF_PSC_TFAR_ALARM(x)         (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RFRP */
-+#define MCF_PSC_RFRP_READ(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TFRP */
-+#define MCF_PSC_TFRP_READ(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RFWP */
-+#define MCF_PSC_RFWP_WRITE(x)         (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TFWP */
-+#define MCF_PSC_TFWP_WRITE(x)         (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RLRFP */
-+#define MCF_PSC_RLRFP_LFP(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TLRFP */
-+#define MCF_PSC_TLRFP_LFP(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_RLWFP */
-+#define MCF_PSC_RLWFP_LFP(x)          (((x)&0x01FF)<<0)
-+
-+/* Bit definitions and macros for MCF_PSC_TLWFP */
-+#define MCF_PSC_TLWFP_LFP(x)          (((x)&0x01FF)<<0)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF548X_PSC_H__ */
---- /dev/null
-+++ b/include/asm-m68k/m5485sim.h
-@@ -0,0 +1,221 @@
-+/*
-+ *    m5485sim.h -- ColdFire 547x/548x System Integration Unit support.
-+ */
-+ 
-+#ifndef       m5485sim_h
-+#define       m5485sim_h
-+
-+
-+/*
-+ *      System Integration Unit Registers
-+ */
-+#define MCF_SDRAMDS   MCF_REG32(0x000004)     /* SDRAM Drive Strength         */
-+#define MCF_SBCR              MCF_REG32(0x000010)     /* System Breakpoint Control    */
-+#define MCF_CSnCFG(x) MCF_REG32(0x000020+(x*4))/* SDRAM Chip Select X         */
-+#define MCF_SECSACR     MCF_REG32(0x000038)   /* Sequential Access Control    */      
-+#define MCF_RSR         MCF_REG32(0x000044)   /* Reset Status                 */
-+#define MCF_JTAGID      MCF_REG32(0x000050)   /* JTAG Device Identification   */
-+
-+/*
-+ *      FlexBus Chip Selects Registers
-+ */
-+#define MCF_CSARn(x)    MCF_REG32(0x000500+(x*0xC))
-+#define MCF_CSMRn(x)    MCF_REG32(0x000504+(x*0xC))
-+#define MCF_CSCRn(x)    MCF_REG32(0x000508+(x*0xC))
-+
-+/*
-+ *      Interrupt Controller Registers
-+ */
-+#define MCF_IPRH              MCF_REG32(0x000700)
-+#define MCF_IPRL              MCF_REG32(0x000704)
-+#define MCF_IMRH              MCF_REG32(0x000708)
-+#define MCF_IMRL              MCF_REG32(0x00070C)
-+#define MCF_INTFRCH           MCF_REG32(0x000710)
-+#define MCF_INTFRCL           MCF_REG32(0x000714)
-+#define MCF_IRLR              MCF_REG08(0x000718)
-+#define MCF_IACKLPR           MCF_REG08(0x000719)
-+#define MCF_SWIACK            MCF_REG08(0x0007E0)
-+#define MCF_LnIACK(x)         MCF_REG08(0x0007E4+((x)*0x004))
-+#define MCF_ICR(x)            MCF_REG08(0x000740+((x)*0x001))
-+
-+/*
-+ *    Slice Timers Registers
-+ */
-+#define MCF_SLTCNT(x)   MCF_REG32(0x000900+((x)*0x010))
-+#define MCF_SCR(x)      MCF_REG32(0x000904+((x)*0x010))
-+#define MCF_SCNT(x)     MCF_REG32(0x000908+((x)*0x010))
-+#define MCF_SSR(x)      MCF_REG32(0x00090C+((x)*0x010))
-+
-+/*
-+ *    Interrupt sources
-+ */
-+#define ISC_EPORT_Fn(x)               (x)             /* EPORT Interrupts     */
-+#define ISC_USB_EPn(x)                (15+(x))        /* USB Endopint         */
-+#define ISC_USB_ISR           (22)            /* USB General source   */
-+#define ISC_USB_AISR          (22)            /* USB core source      */
-+#define ISC_DSPI_OVRFW                (25)            /* DSPI overflow        */
-+#define ISC_DSPI_RFOF         (26)            
-+#define ISC_DSPI_RFDF         (27)            
-+#define ISC_DSPI_TFUF         (28)            
-+#define ISC_DSPI_TCF          (29)            
-+#define ISC_DSPI_TFFF         (30)            
-+#define ISC_DSPI_EOQF         (31)            
-+#define ISC_PSCn(x)           (35-(x))                
-+#define ISC_COMM_TIM          (36)            
-+#define ISC_SEC                       (37)            
-+#define ISC_FEC1              (38)            
-+#define ISC_FEC0              (39)            
-+#define ISC_I2C                       (40)            
-+#define ISC_PCI_ARB           (41)            
-+#define ISC_PCI_CB            (42)            
-+#define ISC_PCI_XLB           (43)            
-+#define ISC_DMA                       (48)            
-+#define ISC_CANn_ERR(x)               (49+(6*(x)))            
-+#define ISC_CANn_BUSOFF(x)    (50+(6*(x)))            
-+#define ISC_CANn_MBOR(x)      (51+(6*(x)))            
-+#define ISC_CAN0_WAKEIN               (52)            
-+#define ISC_SLTn(x)           (54-(x))                
-+#define ISC_GPTn(x)           (62-(x))                
-+
-+/*
-+ *    Interrupt level and priorities
-+ */
-+#define ILP_TOP                       (MCF_ICR_IL(5) | MCF_ICR_IP(3))
-+#define ILP_SLT0              (MCF_ICR_IL(5) | MCF_ICR_IP(2))
-+#define ILP_SLT1              (MCF_ICR_IL(5) | MCF_ICR_IP(1))
-+#define ILP_DMA                       (MCF_ICR_IL(5) | MCF_ICR_IP(0))
-+#define ILP_SEC                       (MCF_ICR_IL(4) | MCF_ICR_IP(7))
-+#define ILP_FEC0              (MCF_ICR_IL(4) | MCF_ICR_IP(6))
-+#define ILP_FEC1              (MCF_ICR_IL(4) | MCF_ICR_IP(5))
-+#define ILP_PCI_XLB           (MCF_ICR_IL(4) | MCF_ICR_IP(4))
-+#define ILP_PCI_ARB           (MCF_ICR_IL(4) | MCF_ICR_IP(3))
-+#define ILP_PCI_CB            (MCF_ICR_IL(4) | MCF_ICR_IP(2))
-+#define ILP_I2C                       (MCF_ICR_IL(4) | MCF_ICR_IP(1))
-+
-+#define ILP_USB_EPn(x)                (MCF_ICR_IL(3) | MCF_ICR_IP(7-(x)))
-+#define ILP_USB_EP0           (MCF_ICR_IL(3) | MCF_ICR_IP(7))
-+#define ILP_USB_EP1           (MCF_ICR_IL(3) | MCF_ICR_IP(6))
-+#define ILP_USB_EP2           (MCF_ICR_IL(3) | MCF_ICR_IP(5))
-+#define ILP_USB_EP3           (MCF_ICR_IL(3) | MCF_ICR_IP(4))
-+#define ILP_USB_EP4           (MCF_ICR_IL(3) | MCF_ICR_IP(3))
-+#define ILP_USB_EP5           (MCF_ICR_IL(3) | MCF_ICR_IP(2))
-+#define ILP_USB_EP6           (MCF_ICR_IL(3) | MCF_ICR_IP(1))
-+#define ILP_USB_ISR           (MCF_ICR_IL(3) | MCF_ICR_IP(0))
-+
-+#define ILP_USB_AISR          (MCF_ICR_IL(2) | MCF_ICR_IP(7))
-+#define ILP_DSPI_OVRFW                (MCF_ICR_IL(2) | MCF_ICR_IP(6))
-+#define ILP_DSPI_RFOF         (MCF_ICR_IL(2) | MCF_ICR_IP(5))
-+#define ILP_DSPI_RFDF         (MCF_ICR_IL(2) | MCF_ICR_IP(4))
-+#define ILP_DSPI_TFUF         (MCF_ICR_IL(2) | MCF_ICR_IP(3))
-+#define ILP_DSPI_TCF          (MCF_ICR_IL(2) | MCF_ICR_IP(2))
-+#define ILP_DSPI_TFFF         (MCF_ICR_IL(2) | MCF_ICR_IP(1))
-+#define ILP_DSPI_EOQF         (MCF_ICR_IL(2) | MCF_ICR_IP(0))
-+
-+#define ILP_COMM_TIM          (MCF_ICR_IL(1) | MCF_ICR_IP(7))
-+#define ILP_PSCn(x)           (MCF_ICR_IL(1) | MCF_ICR_IP(3-((x)&3)))
-+#define ILP_PSC0              (MCF_ICR_IL(1) | MCF_ICR_IP(3))
-+#define ILP_PSC1              (MCF_ICR_IL(1) | MCF_ICR_IP(2))
-+#define ILP_PSC2              (MCF_ICR_IL(1) | MCF_ICR_IP(1))
-+#define ILP_PSC3              (MCF_ICR_IL(1) | MCF_ICR_IP(0))
-+
-+
-+
-+
-+
-+/********************************************************************/
-+
-+/*
-+ *      System Integration Unit Bitfields
-+ */
-+ 
-+/* SBCR */
-+#define MCF_SBCR_PIN2DSPI       (0x08000000)
-+#define MCF_SBCR_DMA2CPU        (0x10000000)
-+#define MCF_SBCR_CPU2DMA        (0x20000000)
-+#define MCF_SBCR_PIN2DMA        (0x40000000)
-+#define MCF_SBCR_PIN2CPU        (0x80000000)
-+
-+/* SECSACR */
-+#define MCF_SECSACR_SEQEN       (0x00000001)
-+
-+/* RSR */
-+#define MCF_RSR_RST             (0x00000001)
-+#define MCF_RSR_RSTWD           (0x00000002)
-+#define MCF_RSR_RSTJTG          (0x00000008)
-+
-+/* JTAGID */
-+#define MCF_JTAGID_REV          (0xF0000000)
-+#define MCF_JTAGID_PROCESSOR    (0x0FFFFFFF)
-+#define MCF_JTAGID_MCF5485      (0x0800C01D)
-+#define MCF_JTAGID_MCF5484      (0x0800D01D)
-+#define MCF_JTAGID_MCF5483      (0x0800E01D)
-+#define MCF_JTAGID_MCF5482      (0x0800F01D)
-+#define MCF_JTAGID_MCF5481      (0x0801001D)
-+#define MCF_JTAGID_MCF5480      (0x0801101D)
-+#define MCF_JTAGID_MCF5475      (0x0801201D)
-+#define MCF_JTAGID_MCF5474      (0x0801301D)
-+#define MCF_JTAGID_MCF5473      (0x0801401D)
-+#define MCF_JTAGID_MCF5472      (0x0801501D)
-+#define MCF_JTAGID_MCF5471      (0x0801601D)
-+#define MCF_JTAGID_MCF5470      (0x0801701D)
-+
-+
-+/*
-+ *      Interrupt Controller Bitfields
-+ */
-+#define MCF_IRLR_IRQ(x)         (((x)&0x7F)<<1)
-+#define MCF_IACKLPR_PRI(x)      (((x)&0x0F)<<0)
-+#define MCF_IACKLPR_LEVEL(x)    (((x)&0x07)<<4)
-+#define MCF_ICR_IP(x)           (((x)&0x07)<<0)
-+#define MCF_ICR_IL(x)           (((x)&0x07)<<3)
-+
-+/*
-+ *      Slice Timers Bitfields
-+ */
-+#define MCF_SCR_TEN                   (0x01000000)
-+#define MCF_SCR_IEN                   (0x02000000)
-+#define MCF_SCR_RUN                   (0x04000000)
-+#define MCF_SSR_ST                    (0x01000000)
-+#define MCF_SSR_BE                    (0x02000000)
-+
-+
-+/*
-+ * Some needed coldfire registers
-+ */
-+#define MCF_PAR_PCIBG                    MCF_REG16(0x000A48)
-+#define MCF_PAR_PCIBR            MCF_REG16(0x000A4A)
-+#define MCF_PAR_PSCn(x)            MCF_REG08(0x000A4F-((x)&0x3))
-+#define MCF_PAR_FECI2CIRQ        MCF_REG16(0x000A44)
-+#define MCF_PAR_DSPI               MCF_REG16(0x000A50)
-+#define MCF_PAR_TIMER              MCF_REG08(0X000A52)
-+#define MCF_EPPAR                MCF_REG16(0x000F00)
-+#define MCF_EPIER                MCF_REG08(0x000F05)
-+#define MCF_EPFR                         MCF_REG08(0x000F0C)
-+
-+/*
-+ * Some GPIO bitfields
-+ */
-+#define MCF_PAR_SDA                   (0x0008)
-+#define MCF_PAR_SCL                   (0x0004)
-+#define MCF_PAR_PSC_TXD               (0x04)
-+#define MCF_PAR_PSC_RXD               (0x08)
-+#define MCF_PAR_PSC_RTS(x)            (((x)&0x03)<<4)
-+#define MCF_PAR_PSC_CTS(x)            (((x)&0x03)<<6)
-+#define MCF_PAR_PSC_CTS_GPIO          (0x00)
-+#define MCF_PAR_PSC_CTS_BCLK          (0x80)
-+#define MCF_PAR_PSC_CTS_CTS           (0xC0)
-+#define MCF_PAR_PSC_RTS_GPIO          (0x00)
-+#define MCF_PAR_PSC_RTS_FSYNC         (0x20)
-+#define MCF_PAR_PSC_RTS_RTS           (0x30)
-+#define MCF_PAR_PSC_CANRX             (0x40)
-+
-+
-+/*
-+ * Some used coldfire values
-+ */
-+#define MCF_EPIER_EPIE(x)          (0x01 << (x))
-+#define MCF_EPPAR_EPPAx_FALLING    (2)
-+#define MCF_EPPAR_EPPA(n,x)        (((x)&0x0003) << (2*n))
-+
-+
-+#endif        /* m5485sim_h */
---- /dev/null
-+++ b/include/asm-m68k/m5485sram.h
-@@ -0,0 +1,12 @@
-+#ifndef SYS_SRAM_H
-+#define SYS_SRAM_H
-+
-+
-+#define SYS_SRAM_DMA_START        MCF_MBAR + 0x10000
-+#define SYS_SRAM_DMA_SIZE         8192
-+#define SYS_SRAM_FEC_START        SYS_SRAM_DMA_START + SYS_SRAM_DMA_SIZE
-+#define SYS_SRAM_FEC_SIZE         2048
-+#define SYS_SRAM_SEC_START        SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE
-+#define SYS_SRAM_SEC_SIZE         1280
-+
-+#endif /* SYS_SRAM_H */
---- a/include/asm-m68k/machdep.h
-+++ b/include/asm-m68k/machdep.h
-@@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int);
- extern void (*mach_l2_flush) (int);
- extern void (*mach_beep) (unsigned int, unsigned int);
-+#ifdef CONFIG_COLDFIRE
-+extern void __init config_coldfire(void);
-+extern void __init mmu_context_init(void);
-+extern irq_handler_t mach_default_handler;
-+extern void (*mach_tick)(void);
-+#endif
-+
- #endif /* _M68K_MACHDEP_H */
---- /dev/null
-+++ b/include/asm-m68k/MCD_dma.h
-@@ -0,0 +1,408 @@
-+/*********************************************************************
-+ *
-+ * Copyright (C) 2004  Motorola, Inc.
-+ *  MOTOROLA, INC. All Rights Reserved.
-+ *  You are hereby granted a copyright license to use
-+ *  the SOFTWARE so long as this entire notice is
-+ *  retained without alteration in any modified and/or redistributed
-+ *  versions, and that such modified versions are clearly identified
-+ *  as such. No licenses are granted by implication, estoppel or
-+ *  otherwise under any patents or trademarks of Motorola, Inc. This
-+ *  software is provided on an "AS IS" basis and without warranty.
-+ *
-+ *  To the maximum extent permitted by applicable law, MOTOROLA
-+ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
-+ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
-+ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
-+ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
-+ *  ACCOMPANYING WRITTEN MATERIALS.
-+ *
-+ *  To the maximum extent permitted by applicable law, IN NO EVENT
-+ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
-+ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
-+ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
-+ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
-+ *
-+ *  Motorola assumes no responsibility for the maintenance and support
-+ *  of this software
-+ ********************************************************************/
-+
-+/*
-+ * File:        MCD_dma.h
-+ * Purpose:     Main header file for multi-channel DMA API.
-+ *
-+ * Notes:
-+ *
-+ * Modifications:
-+ */
-+#ifndef _MCD_API_H
-+#define _MCD_API_H
-+
-+#include <asm/types.h>
-+
-+/*
-+ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
-+ */
-+#undef MCD_INCLUDE_EU
-+
-+/*
-+ * Number of DMA channels
-+ */
-+#define NCHANNELS 16
-+
-+/*
-+ * Total number of variants
-+ */
-+#ifdef MCD_INCLUDE_EU
-+#define NUMOFVARIANTS   6
-+#else
-+#define NUMOFVARIANTS   4
-+#endif
-+
-+/*
-+ * Define sizes of the various tables
-+ */
-+#define TASK_TABLE_SIZE     (NCHANNELS*32)
-+#define VAR_TAB_SIZE        (128)
-+#define CONTEXT_SAVE_SIZE   (128)
-+#define FUNCDESC_TAB_SIZE   (256)
-+
-+#ifdef MCD_INCLUDE_EU
-+#define FUNCDESC_TAB_NUM    16
-+#else
-+#define FUNCDESC_TAB_NUM    1
-+#endif
-+
-+
-+#ifndef DEFINESONLY
-+
-+/*
-+ * Portability typedefs
-+ */
-+ /*
-+#ifndef s32
-+typedef int s32;
-+#endif
-+#ifndef u32
-+typedef unsigned int u32;
-+#endif
-+#ifndef s16
-+typedef short s16;
-+#endif
-+#ifndef u16
-+typedef unsigned short u16;
-+#endif
-+#ifndef s8
-+typedef char s8;
-+#endif
-+#ifndef u8
-+typedef unsigned char u8;
-+#endif
-+*/
-+/*
-+ * These structures represent the internal registers of the
-+ * multi-channel DMA
-+ */
-+struct dmaRegs_s {
-+   u32 taskbar;         /* task table base address register */
-+   u32 currPtr;
-+   u32 endPtr;
-+   u32 varTablePtr;
-+   u16 dma_rsvd0;
-+   u16 ptdControl;      /* ptd control */
-+   u32 intPending;      /* interrupt pending register */
-+   u32 intMask;         /* interrupt mask register */
-+   u16 taskControl[16]; /* task control registers */
-+   u8  priority[32];    /* priority registers */
-+   u32 initiatorMux;    /* initiator mux control */
-+   u32 taskSize0;       /* task size control register 0. */
-+   u32 taskSize1;       /* task size control register 1. */
-+   u32 dma_rsvd1;       /* reserved */
-+   u32 dma_rsvd2;       /* reserved */
-+   u32 debugComp1;      /* debug comparator 1 */
-+   u32 debugComp2;      /* debug comparator 2 */
-+   u32 debugControl;    /* debug control */
-+   u32 debugStatus;     /* debug status */
-+   u32 ptdDebug;        /* priority task decode debug */
-+   u32 dma_rsvd3[31];   /* reserved */
-+};
-+typedef volatile struct dmaRegs_s dmaRegs;
-+
-+#endif
-+
-+/*
-+ * PTD contrl reg bits
-+ */
-+#define PTD_CTL_TSK_PRI         0x8000
-+#define PTD_CTL_COMM_PREFETCH   0x0001
-+
-+/*
-+ * Task Control reg bits and field masks
-+ */
-+#define TASK_CTL_EN             0x8000
-+#define TASK_CTL_VALID          0x4000
-+#define TASK_CTL_ALWAYS         0x2000
-+#define TASK_CTL_INIT_MASK      0x1f00
-+#define TASK_CTL_ASTRT          0x0080
-+#define TASK_CTL_HIPRITSKEN     0x0040
-+#define TASK_CTL_HLDINITNUM     0x0020
-+#define TASK_CTL_ASTSKNUM_MASK  0x000f
-+
-+/*
-+ * Priority reg bits and field masks
-+ */
-+#define PRIORITY_HLD            0x80
-+#define PRIORITY_PRI_MASK       0x07
-+
-+/*
-+ * Debug Control reg bits and field masks
-+ */
-+#define DBG_CTL_BLOCK_TASKS_MASK    0xffff0000
-+#define DBG_CTL_AUTO_ARM            0x00008000
-+#define DBG_CTL_BREAK               0x00004000
-+#define DBG_CTL_COMP1_TYP_MASK      0x00003800
-+#define DBG_CTL_COMP2_TYP_MASK      0x00000070
-+#define DBG_CTL_EXT_BREAK           0x00000004
-+#define DBG_CTL_INT_BREAK           0x00000002
-+
-+/*
-+ * PTD Debug reg selector addresses
-+ * This reg must be written with a value to show the contents of
-+ * one of the desired internal register.
-+ */
-+#define PTD_DBG_REQ             0x00 /* shows the state of 31 initiators */
-+#define PTD_DBG_TSK_VLD_INIT    0x01 /* shows which 16 tasks are valid and
-+                                        have initiators asserted */
-+
-+
-+/*
-+ * General return values
-+ */
-+#define MCD_OK                   0
-+#define MCD_ERROR               -1
-+#define MCD_TABLE_UNALIGNED     -2
-+#define MCD_CHANNEL_INVALID     -3
-+
-+/*
-+ * MCD_initDma input flags
-+ */
-+#define MCD_RELOC_TASKS         0x00000001
-+#define MCD_NO_RELOC_TASKS      0x00000000
-+#define MCD_COMM_PREFETCH_EN    0x00000002  /* Commbus Prefetching - MCF547x/548x ONLY */
-+
-+/*
-+ * MCD_dmaStatus Status Values for each channel
-+ */
-+#define MCD_NO_DMA  1 /* No DMA has been requested since reset */
-+#define MCD_IDLE    2 /* DMA active, but the initiator is currently inactive */
-+#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
-+#define MCD_PAUSED  4 /* DMA active but it is currently paused */
-+#define MCD_HALTED  5 /* the most recent DMA has been killed with MCD_killTask() */
-+#define MCD_DONE    6 /* the most recent DMA has completed. */
-+
-+
-+/*
-+ * MCD_startDma parameter defines
-+ */
-+
-+/*
-+ * Constants for the funcDesc parameter
-+ */
-+/* Byte swapping: */
-+#define MCD_NO_BYTE_SWAP    0x00045670  /* to disable byte swapping. */
-+#define MCD_BYTE_REVERSE    0x00076540  /* to reverse the bytes of each u32 of the DMAed data. */
-+#define MCD_U16_REVERSE     0x00067450  /* to reverse the 16-bit halves of
-+                                           each 32-bit data value being DMAed.*/
-+#define MCD_U16_BYTE_REVERSE    0x00054760 /* to reverse the byte halves of each
-+                                            16-bit half of each 32-bit data value DMAed */
-+#define MCD_NO_BIT_REV  0x00000000  /* do not reverse the bits of each byte DMAed. */
-+#define MCD_BIT_REV     0x00088880  /* reverse the bits of each byte DMAed */
-+/* CRCing: */
-+#define MCD_CRC16       0xc0100000  /* to perform CRC-16 on DMAed data. */
-+#define MCD_CRCCCITT    0xc0200000  /* to perform CRC-CCITT on DMAed data. */
-+#define MCD_CRC32       0xc0300000  /* to perform CRC-32 on DMAed data. */
-+#define MCD_CSUMINET    0xc0400000  /* to perform internet checksums on DMAed data.*/
-+#define MCD_NO_CSUM     0xa0000000  /* to perform no checksumming. */
-+
-+#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
-+#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
-+
-+/*
-+ * Constants for the flags parameter
-+ */
-+#define MCD_TT_FLAGS_RL   0x00000001 /* Read line */
-+#define MCD_TT_FLAGS_CW   0x00000002 /* Combine Writes */
-+#define MCD_TT_FLAGS_SP   0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY  */
-+#define MCD_TT_FLAGS_MASK 0x000000ff
-+#define MCD_TT_FLAGS_DEF  (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
-+
-+#define MCD_SINGLE_DMA  0x00000100 /* Unchained DMA */
-+#define MCD_CHAIN_DMA              /* TBD */
-+#define MCD_EU_DMA                 /* TBD */
-+#define MCD_FECTX_DMA   0x00001000 /* FEC TX ring DMA */
-+#define MCD_FECRX_DMA   0x00002000 /* FEC RX ring DMA */
-+
-+
-+/* these flags are valid for MCD_startDma and the chained buffer descriptors */
-+#define MCD_BUF_READY   0x80000000 /* indicates that this buffer is now under the DMA's control */
-+#define MCD_WRAP        0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
-+#define MCD_INTERRUPT   0x10000000 /* to generate an interrupt after completion of the DMA. */
-+#define MCD_END_FRAME   0x08000000 /* tell the DMA to end the frame when transferring
-+                                      last byte of data in buffer */
-+#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
-+                                      prior to performing the DMA. */
-+
-+/* Defines for the FEC buffer descriptor control/status word*/
-+#define MCD_FEC_BUF_READY   0x8000
-+#define MCD_FEC_WRAP        0x2000
-+#define MCD_FEC_INTERRUPT   0x1000
-+#define MCD_FEC_END_FRAME   0x0800
-+
-+
-+/*
-+ * Defines for general intuitiveness
-+ */
-+
-+#define MCD_TRUE  1
-+#define MCD_FALSE 0
-+
-+/*
-+ * Three different cases for destination and source.
-+ */
-+#define MINUS1          -1
-+#define ZERO            0
-+#define PLUS1           1
-+
-+#ifndef DEFINESONLY
-+
-+/* Task Table Entry struct*/
-+typedef struct {
-+    u32 TDTstart;   /* task descriptor table start */
-+    u32 TDTend;     /* task descriptor table end */
-+    u32 varTab;     /* variable table start */
-+    u32 FDTandFlags;    /* function descriptor table start and flags */
-+    volatile u32 descAddrAndStatus;
-+    volatile u32 modifiedVarTab;
-+    u32 contextSaveSpace;   /* context save space start */
-+    u32 literalBases;
-+} TaskTableEntry;
-+
-+
-+/* Chained buffer descriptor */
-+typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
-+struct MCD_bufDesc_struct {
-+   u32 flags;         /* flags describing the DMA */
-+   u32 csumResult;    /* checksum from checksumming performed since last checksum reset */
-+   s8  *srcAddr;      /* the address to move data from */
-+   s8  *destAddr;     /* the address to move data to */
-+   s8  *lastDestAddr; /* the last address written to */
-+   u32 dmaSize;       /* the number of bytes to transfer independent of the transfer size */
-+   MCD_bufDesc *next; /* next buffer descriptor in chain */
-+   u32 info;          /* private information about this descriptor;  DMA does not affect it */
-+};
-+
-+/* Progress Query struct */
-+typedef volatile struct MCD_XferProg_struct {
-+   s8 *lastSrcAddr;         /* the most-recent or last, post-increment source address */
-+   s8 *lastDestAddr;        /* the most-recent or last, post-increment destination address */
-+   u32  dmaSize;            /* the amount of data transferred for the current buffer */
-+   MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
-+} MCD_XferProg;
-+
-+
-+/* FEC buffer descriptor */
-+typedef volatile struct MCD_bufDescFec_struct {
-+    u16 statCtrl;
-+    u16 length;
-+    u32 dataPointer;
-+} MCD_bufDescFec;
-+
-+
-+/*************************************************************************/
-+/*
-+ * API function Prototypes  - see MCD_dmaApi.c for further notes
-+ */
-+
-+/*
-+ * MCD_startDma starts a particular kind of DMA .
-+ */
-+int MCD_startDma (
-+   int channel,   /* the channel on which to run the DMA */
-+   s8  *srcAddr,  /* the address to move data from, or buffer-descriptor address */
-+   s16 srcIncr,   /* the amount to increment the source address per transfer */
-+   s8  *destAddr, /* the address to move data to */
-+   s16 destIncr,  /* the amount to increment the destination address per transfer */
-+   u32 dmaSize,   /* the number of bytes to transfer independent of the transfer size */
-+   u32 xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
-+   u32 initiator, /* what device initiates the DMA */
-+   int priority,  /* priority of the DMA */
-+   u32 flags,     /* flags describing the DMA */
-+   u32 funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
-+);
-+
-+/* 
-+ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA 
-+ * registers, relocating and creating the appropriate task structures, and 
-+ * setting up some global settings
-+ */
-+int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
-+
-+/* 
-+ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
-+ */
-+int MCD_dmaStatus (int channel);
-+
-+/* 
-+ * MCD_XferProgrQuery() returns progress of DMA on requested channel
-+ */
-+int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
-+
-+/* 
-+ * MCD_killDma() halts the DMA on the requested channel, without any
-+ * intention of resuming the DMA.
-+ */
-+int MCD_killDma (int channel);
-+
-+/* 
-+ * MCD_continDma() continues a DMA which as stopped due to encountering an
-+ * unready buffer descriptor.
-+ */
-+int MCD_continDma (int channel);
-+
-+/* 
-+ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
-+ * running on that channel). 
-+ */
-+int MCD_pauseDma (int channel);
-+
-+/* 
-+ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
-+ * running on that channel).
-+ */
-+int MCD_resumeDma (int channel);
-+
-+/* 
-+ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
-+ */
-+int MCD_csumQuery (int channel, u32 *csum);
-+
-+/* 
-+ * MCD_getCodeSize provides the packed size required by the microcoded task
-+ * and structures.
-+ */
-+int MCD_getCodeSize(void);
-+
-+/*
-+ * MCD_getVersion provides a pointer to a version string and returns a
-+ * version number.
-+ */
-+int MCD_getVersion(char **longVersion);
-+
-+/* macro for setting a location in the variable table */
-+#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
-+   /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
-+      so I'm avoiding surrounding it with "do {} while(0)" */
-+
-+#endif  /* DEFINESONLY */
-+
-+#endif /* _MCD_API_H */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_ccm.h
-@@ -0,0 +1,163 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_CCM_H__
-+#define __MCF5445X_CCM_H__
-+
-+/*********************************************************************
-+*
-+* Chip Configuration Module (CCM)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_CCM_CCR   MCF_REG16(0xFC0A0004)   /* Chip Configuration Register (Read-only) (256 or 360 TEPBGA) */
-+#define MCF_CCM_RCON  MCF_REG16(0xFC0A0008)   /* Reset Configuration (Read-only) (256 or 360 TEPBGA) */
-+#define MCF_CCM_CIR   MCF_REG16(0xFC0A000A)   /* Chip Identification Register (Read-only) */
-+#define MCF_CCM_MISCCR        MCF_REG16(0xFC0A0010)   /* Miscellaneous Control Register */
-+#define MCF_CCM_CDR   MCF_REG16(0xFC0A0012)   /* Clock Divider Register */
-+#define MCF_CCM_UOCSR MCF_REG16(0xFC0A0014)   /* USB On-the-Go Controller Status Register */
-+#define MCF_CCM_SBFSR MCF_REG16(0xFC0A0018)   /* Serial Boot Facility Status Register (Read Only) */
-+#define MCF_CCM_SBFCR MCF_REG16(0xFC0A0020)   /* Serial Boot Facility Control Register */
-+
-+/* Bit definitions and macros for CCR_360 */
-+#define MCF_CCM_CCR_360_PLLMULT2(x)         (((x) & 0x0003))  /* 2-Bit PLL clock mode */
-+#define MCF_CCM_CCR_360_PCISLEW             (0x0004)          /* PCI pad slew rate mode */
-+#define MCF_CCM_CCR_360_PCIMODE             (0x0008)          /* PCI host/agent mode */
-+#define MCF_CCM_CCR_360_PLLMODE             (0x0010)          /* PLL Mode */
-+#define MCF_CCM_CCR_360_FBCONFIG(x)         (((x) & 0x0007) << 5)  /* Flexbus/PCI port size configuration */
-+#define MCF_CCM_CCR_360_PLLMULT3(x)         (((x) & 0x0007))  /* 3-Bit PLL Clock Mode */
-+#define MCF_CCM_CCR_360_OSCMODE             (0x0008)          /* Oscillator Clock Mode */
-+#define MCF_CCM_CCR_360_FBCONFIG_MASK       (0x00E0)
-+#define MCF_CCM_CCR_360_PLLMULT2_MASK       (0x0003)
-+#define MCF_CCM_CCR_360_PLLMULT3_MASK       (0x0007)
-+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_32   (0x0000)
-+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_8    (0x0020)
-+#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_16   (0x0040)
-+#define MCF_CCM_CCR_360_FBCONFIG_M_P_16     (0x0060)
-+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_32    (0x0080)
-+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_8     (0x00A0)
-+#define MCF_CCM_CCR_360_FBCONFIG_M_NP_16    (0x00C0)
-+#define MCF_CCM_CCR_360_FBCONFIG_M_P_8      (0x00E0)
-+#define MCF_CCM_CCR_360_PLLMULT2_12X        (0x0000)
-+#define MCF_CCM_CCR_360_PLLMULT2_6X         (0x0001)
-+#define MCF_CCM_CCR_360_PLLMULT2_16X        (0x0002)
-+#define MCF_CCM_CCR_360_PLLMULT2_8X         (0x0003)
-+#define MCF_CCM_CCR_360_PLLMULT3_20X        (0x0000)
-+#define MCF_CCM_CCR_360_PLLMULT3_10X        (0x0001)
-+#define MCF_CCM_CCR_360_PLLMULT3_24X        (0x0002)
-+#define MCF_CCM_CCR_360_PLLMULT3_18X        (0x0003)
-+#define MCF_CCM_CCR_360_PLLMULT3_12X        (0x0004)
-+#define MCF_CCM_CCR_360_PLLMULT3_6X         (0x0005)
-+#define MCF_CCM_CCR_360_PLLMULT3_16X        (0x0006)
-+#define MCF_CCM_CCR_360_PLLMULT3_8X         (0x0007)
-+
-+/* Bit definitions and macros for CCR_256 */
-+#define MCF_CCM_CCR_256_PLLMULT3(x)         (((x) & 0x0007))  /* 3-Bit PLL clock mode */
-+#define MCF_CCM_CCR_256_OSCMODE             (0x0008)        /* Oscillator clock mode */
-+#define MCF_CCM_CCR_256_PLLMODE             (0x0010)        /* PLL Mode */
-+#define MCF_CCM_CCR_256_FBCONFIG(x)         (((x) & 0x0007) << 5)  /* Flexbus/PCI port size configuration */
-+#define MCF_CCM_CCR_256_FBCONFIG_MASK       (0x00E0)
-+#define MCF_CCM_CCR_256_FBCONFIG_NM_32      (0x0000)
-+#define MCF_CCM_CCR_256_FBCONFIG_NM_8       (0x0020)
-+#define MCF_CCM_CCR_256_FBCONFIG_NM_16      (0x0040)
-+#define MCF_CCM_CCR_256_FBCONFIG_M_32       (0x0080)
-+#define MCF_CCM_CCR_256_FBCONFIG_M_8        (0x00A0)
-+#define MCF_CCM_CCR_256_FBCONFIG_M_16       (0x00C0)
-+#define MCF_CCM_CCR_256_PLLMULT3_MASK       (0x0007)
-+#define MCF_CCM_CCR_256_PLLMULT3_20X        (0x0000)
-+#define MCF_CCM_CCR_256_PLLMULT3_10X        (0x0001)
-+#define MCF_CCM_CCR_256_PLLMULT3_24X        (0x0002)
-+#define MCF_CCM_CCR_256_PLLMULT3_18X        (0x0003)
-+#define MCF_CCM_CCR_256_PLLMULT3_12X        (0x0004)
-+#define MCF_CCM_CCR_256_PLLMULT3_6X         (0x0005)
-+#define MCF_CCM_CCR_256_PLLMULT3_16X        (0x0006)
-+#define MCF_CCM_CCR_256_PLLMULT3_8X         (0x0007)
-+
-+/* Bit definitions and macros for RCON_360 */
-+#define MCF_CCM_RCON_360_PLLMULT(x)     (((x)&0x0003))        /* PLL clock mode */
-+#define MCF_CCM_RCON_360_PCISLEW        (0x0004)      /* PCI pad slew rate mode */
-+#define MCF_CCM_RCON_360_PCIMODE        (0x0008)      /* PCI host/agent mode */
-+#define MCF_CCM_RCON_360_PLLMODE        (0x0010)      /* PLL Mode */
-+#define MCF_CCM_RCON_360_FBCONFIG(x)    (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */
-+
-+/* Bit definitions and macros for RCON_256 */
-+#define MCF_CCM_RCON_256_PLLMULT(x)     (((x) & 0x0007)) /* PLL clock mode */
-+#define MCF_CCM_RCON_256_OSCMODE        (0x0008)      /* Oscillator clock mode */
-+#define MCF_CCM_RCON_256_PLLMODE        (0x0010)      /* PLL Mode */
-+#define MCF_CCM_RCON_256_FBCONFIG(x)    (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */
-+
-+/* Bit definitions and macros for CIR */
-+#define MCF_CCM_CIR_PRN(x)          (((x) & 0x003F))  /* Part revision number */
-+#define MCF_CCM_CIR_PIN(x)          (((x) & 0x03FF) << 6)     /* Part identification number */
-+#define MCF_CCM_CIR_PIN_MASK        (0xFFC0)
-+#define MCF_CCM_CIR_PRN_MASK        (0x003F)
-+#define MCF_CCM_CIR_PIN_MCF54450    (0x4F << 6)
-+#define MCF_CCM_CIR_PIN_MCF54451    (0x4D << 6)
-+#define MCF_CCM_CIR_PIN_MCF54452    (0x4B << 6)
-+#define MCF_CCM_CIR_PIN_MCF54453    (0x49 << 6)
-+#define MCF_CCM_CIR_PIN_MCF54454    (0x4A << 6)
-+#define MCF_CCM_CIR_PIN_MCF54455    (0x48 << 6)
-+
-+/* Bit definitions and macros for MISCCR */
-+#define MCF_CCM_MISCCR_USBSRC           (0x0001)      /* USB clock source */
-+#define MCF_CCM_MISCCR_USBOC            (0x0002)      /* USB VBUS over-current sense polarity */
-+#define MCF_CCM_MISCCR_USBPUE           (0x0004)      /* USB transceiver pull-up enable */
-+#define MCF_CCM_MISCCR_SSISRC           (0x0010)      /* SSI clock source */
-+#define MCF_CCM_MISCCR_TIMDMA           (0x0020)      /* Timer DMA mux selection */
-+#define MCF_CCM_MISCCR_SSIPUS           (0x0040)      /* SSI RXD/TXD pull select */
-+#define MCF_CCM_MISCCR_SSIPUE           (0x0080)      /* SSI RXD/TXD pull enable */
-+#define MCF_CCM_MISCCR_BMT(x)           (((x) & 0x0007) << 8) /* Bus monitor timing field */
-+#define MCF_CCM_MISCCR_BME              (0x0800)      /* Bus monitor external enable bit */
-+#define MCF_CCM_MISCCR_LIMP             (0x1000)      /* Limp mode enable */
-+#define MCF_CCM_MISCCR_BMT_65536        (0 << 8)
-+#define MCF_CCM_MISCCR_BMT_32768        (1 << 8)
-+#define MCF_CCM_MISCCR_BMT_16384        (2 << 8)
-+#define MCF_CCM_MISCCR_BMT_8192         (3 << 8)
-+#define MCF_CCM_MISCCR_BMT_4096         (4 << 8)
-+#define MCF_CCM_MISCCR_BMT_2048         (5 << 8)
-+#define MCF_CCM_MISCCR_BMT_1024         (6 << 8)
-+#define MCF_CCM_MISCCR_BMT_512          (7 << 8)
-+#define MCF_CCM_MISCCR_SSIPUE_UP        (1 << 7)
-+#define MCF_CCM_MISCCR_SSIPUE_DOWN      (0 << 7)
-+#define MCF_CCM_MISCCR_SSIPUS_UP        (1 << 6)
-+#define MCF_CCM_MISCCR_SSIPUS_DOWN      (0 << 6)
-+#define MCF_CCM_MISCCR_TIMDMA_TIM       (1 << 5)
-+#define MCF_CCM_MISCCR_TIMDMA_SSI       (0 << 5)
-+#define MCF_CCM_MISCCR_SSISRC_CLKIN     (0 << 4)
-+#define MCF_CCM_MISCCR_SSISRC_PLL       (1 << 4)
-+#define MCF_CCM_MISCCR_USBOC_ACTHI      (0 << 1)
-+#define MCF_CCM_MISCCR_USBOC_ACTLO      (1 << 1)
-+#define MCF_CCM_MISCCR_USBSRC_CLKIN     (0)
-+#define MCF_CCM_MISCCR_USBSRC_PLL       (1)
-+
-+/* Bit definitions and macros for CDR */
-+#define MCF_CCM_CDR_SSIDIV(x)   (((x) & 0x00FF))      /* SSI oversampling clock divider */
-+#define MCF_CCM_CDR_LPDIV(x)    (((x) & 0x000F) << 8) /* Low power clock divider */
-+
-+/* Bit definitions and macros for UOCSR */
-+#define MCF_CCM_UOCSR_XPDE          (0x0001)  /* On-chip transceiver pull-down enable */
-+#define MCF_CCM_UOCSR_UOMIE         (0x0002)  /* USB OTG misc interrupt enable */
-+#define MCF_CCM_UOCSR_WKUP          (0x0004)  /* USB OTG controller wake-up event */
-+#define MCF_CCM_UOCSR_PWRFLT        (0x0008)  /* VBUS power fault */
-+#define MCF_CCM_UOCSR_SEND          (0x0010)  /* Session end */
-+#define MCF_CCM_UOCSR_VVLD          (0x0020)  /* VBUS valid indicator */
-+#define MCF_CCM_UOCSR_BVLD          (0x0040)  /* B-peripheral valid indicator */
-+#define MCF_CCM_UOCSR_AVLD          (0x0080)  /* A-peripheral valid indicator */
-+#define MCF_CCM_UOCSR_DPPU          (0x0100)  /* D+ pull-up for FS enabled (read-only) */
-+#define MCF_CCM_UOCSR_DCR_VBUS      (0x0200)  /* VBUS discharge resistor enabled (read-only) */
-+#define MCF_CCM_UOCSR_CRG_VBUS      (0x0400)  /* VBUS charge resistor enabled (read-only) */
-+#define MCF_CCM_UOCSR_DMPD          (0x1000)  /* D- 15Kohm pull-down (read-only) */
-+#define MCF_CCM_UOCSR_DPPD          (0x2000)  /* D+ 15Kohm pull-down (read-only) */
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_CCM_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_dspi.h
-@@ -0,0 +1,402 @@
-+/*
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_DSPI_H__
-+#define __MCF5445X_DSPI_H__
-+
-+/*********************************************************************
-+*
-+* DMA Serial Peripheral Interface (DSPI)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_DSPI_DMCR           MCF_REG32(0xFC05C000)   /* DSPI Module Configuration Register */
-+#define MCF_DSPI_DTCR           MCF_REG32(0xFC05C008)   /* DSPI Transfer Count Register */
-+#define MCF_DSPI_DCTAR0         MCF_REG32(0xFC05C00C)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR1         MCF_REG32(0xFC05C010)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR2         MCF_REG32(0xFC05C014)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR3         MCF_REG32(0xFC05C018)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR4         MCF_REG32(0xFC05C01C)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR5         MCF_REG32(0xFC05C020)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR6         MCF_REG32(0xFC05C024)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DCTAR7         MCF_REG32(0xFC05C028)   /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DSR            MCF_REG32(0xFC05C02C)   /* DSPI Status Register */
-+#define MCF_DSPI_DRSER          MCF_REG32(0xFC05C030)   /* DSPI DMA/Interrupt Request Select and Enable Register */
-+#define MCF_DSPI_DTFR           MCF_REG32(0xFC05C034)   /* DSPI Transmit FIFO Register */
-+#define MCF_DSPI_DRFR           MCF_REG32(0xFC05C038)   /* DSPI Receive FIFO Register */
-+#define MCF_DSPI_DTFDR0         MCF_REG32(0xFC05C03C)   /* DSPI Transmit FIFO Debugging Registers */
-+#define MCF_DSPI_DTFDR1         MCF_REG32(0xFC05C040)   /* DSPI Transmit FIFO Debugging Registers */
-+#define MCF_DSPI_DTFDR2         MCF_REG32(0xFC05C044)   /* DSPI Transmit FIFO Debugging Registers */
-+#define MCF_DSPI_DTFDR3         MCF_REG32(0xFC05C048)   /* DSPI Transmit FIFO Debugging Registers */
-+#define MCF_DSPI_DRFDR0         MCF_REG32(0xFC05C07C)   /* DSPI Receive FIFO Debugging Registers */
-+#define MCF_DSPI_DRFDR1         MCF_REG32(0xFC05C080)   /* DSPI Receive FIFO Debugging Registers */
-+#define MCF_DSPI_DRFDR2         MCF_REG32(0xFC05C084)   /* DSPI Receive FIFO Debugging Registers */
-+#define MCF_DSPI_DRFDR3         MCF_REG32(0xFC05C088)   /* DSPI Receive FIFO Debugging Registers */
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_DSPI_DCTAR(x)       MCF_REG32(0xFC05C00C+((x)*0x004))     /* DSPI Clock and Transfer Attributes Register */
-+#define MCF_DSPI_DTFDR(x)       MCF_REG32(0xFC05C03C+((x)*0x004))     /* DSPI Transmit FIFO Debugging Registers */
-+#define MCF_DSPI_DRFDR(x)       MCF_REG32(0xFC05C07C+((x)*0x004))     /* DSPI Receive FIFO Debugging Registers */
-+
-+/* Bit definitions and macros for DMCR */
-+#define MCF_DSPI_DMCR_HALT          (0x00000001)            /* Halt -- stops and starts DSPI transfers */
-+#define MCF_DSPI_DMCR_SMPLPT(x)     (((x)&0x00000003)<<8)   /* Sample point selection */
-+#define MCF_DSPI_DMCR_CLRRXF        (0x00000400)            /* Clear receive FIFO */
-+#define MCF_DSPI_DMCR_CLRTXF        (0x00000800)            /* Clear transmit FIFO */
-+#define MCF_DSPI_DMCR_DISRXF        (0x00001000)            /* Disable receive FIFO */
-+#define MCF_DSPI_DMCR_DISTXF        (0x00002000)            /* Disable transmit FIFO */
-+#define MCF_DSPI_DMCR_MDIS          (0x00004000)            /* Module Disable */
-+#define MCF_DSPI_DMCR_PCSIS0        (0x00010000)            /* Peripheral chip-select 0 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS1        (0x00020000)            /* Peripheral chip-select 1 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS2        (0x00040000)            /* Peripheral chip-select 2 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS3        (0x00080000)            /* Peripheral chip-select 3 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS4        (0x00100000)            /* Peripheral chip-select 4 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS5        (0x00200000)            /* Peripheral chip-select 5 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS6        (0x00400000)            /* Peripheral chip-select 6 inactive state */
-+#define MCF_DSPI_DMCR_PCSIS7        (0x00800000)            /* Peripheral chip-select 7 inactive state */
-+#define MCF_DSPI_DMCR_ROOE          (0x01000000)            /* Receive FIFO overflow overwrite enable */
-+#define MCF_DSPI_DMCR_PCSSE         (0x02000000)            /* Peripheral chip select strobe enable */
-+#define MCF_DSPI_DMCR_MTFE          (0x04000000)            /* Modified timing format enable */
-+#define MCF_DSPI_DMCR_FRZ           (0x08000000)            /* Freeze */
-+#define MCF_DSPI_DMCR_DCONF(x)      (((x)&0x00000003)<<28)  /* DSPI configuration */
-+#define MCF_DSPI_DMCR_CONT_SCKE     (0x40000000)            /* Continuous SCK enable */
-+#define MCF_DSPI_DMCR_MSTR          (0x80000000)            /* Master/Slave mode select */
-+#define MCF_DSPI_DMCR_DCONF_SPI     (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS7_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS7_HIGH   (0x00800000)
-+#define MCF_DSPI_DMCR_PCSIS6_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS6_HIGH   (0x00400000)
-+#define MCF_DSPI_DMCR_PCSIS5_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS5_HIGH   (0x00200000)
-+#define MCF_DSPI_DMCR_PCSIS4_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS4_HIGH   (0x00100000)
-+#define MCF_DSPI_DMCR_PCSIS3_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS3_HIGH   (0x00080000)
-+#define MCF_DSPI_DMCR_PCSIS2_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS2_HIGH   (0x00040000)
-+#define MCF_DSPI_DMCR_PCSIS1_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS1_HIGH   (0x00020000)
-+#define MCF_DSPI_DMCR_PCSIS0_LOW    (0x00000000)
-+#define MCF_DSPI_DMCR_PCSIS0_HIGH   (0x00010000)
-+
-+/* Bit definitions and macros for DTCR */
-+#define MCF_DSPI_DTCR_SPI_TCNT(x)   (((x)&0x0000FFFF)<<16)  /* SPI transfer count */
-+
-+/* Bit definitions and macros for DCTAR group */
-+#define MCF_DSPI_DCTAR_BR(x)                (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR_DT(x)                (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR_ASC(x)               (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR_CSSCK(x)             (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR_PBR(x)               (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR_PDT(x)               (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR_PASC(x)              (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR_PCSSCK(x)            (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR_LSBFE                (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR_CPHA                 (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR_CPOL                 (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR_FMSZ(x)              (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR_DBR                  (0x80000000)            /* Double baud rate */
-+#define MCF_DSPI_DCTAR_CPOL_LOW             (0x00000000)
-+#define MCF_DSPI_DCTAR_CPOL_HIGH            (0x04000000)
-+#define MCF_DSPI_DCTAR_CPHA_LATCH_RISING    (0x00000000)
-+#define MCF_DSPI_DCTAR_CPHA_LATCH_FALLING   (0x02000000)
-+#define MCF_DSPI_DCTAR_PCSSCK_1CLK          (0x00000000)
-+#define MCF_DSPI_DCTAR_PCSSCK_3CLK          (0x00400000)
-+#define MCF_DSPI_DCTAR_PCSSCK_5CLK          (0x00800000)
-+#define MCF_DSPI_DCTAR_PCSSCK_7CLK          (0x00C00000)
-+#define MCF_DSPI_DCTAR_PASC_1CLK            (0x00000000)
-+#define MCF_DSPI_DCTAR_PASC_3CLK            (0x00100000)
-+#define MCF_DSPI_DCTAR_PASC_5CLK            (0x00200000)
-+#define MCF_DSPI_DCTAR_PASC_7CLK            (0x00300000)
-+#define MCF_DSPI_DCTAR_PDT_1CLK             (0x00000000)
-+#define MCF_DSPI_DCTAR_PDT_3CLK             (0x00040000)
-+#define MCF_DSPI_DCTAR_PDT_5CLK             (0x00080000)
-+#define MCF_DSPI_DCTAR_PDT_7CLK             (0x000C0000)
-+#define MCF_DSPI_DCTAR_PBR_2CLK             (0x00000000)
-+#define MCF_DSPI_DCTAR_PBR_3CLK             (0x00010000)
-+#define MCF_DSPI_DCTAR_PBR_5CLK             (0x00020000)
-+#define MCF_DSPI_DCTAR_PBR_7CLK             (0x00030000)
-+
-+/* Bit definitions and macros for DCTAR0 */
-+#define MCF_DSPI_DCTAR0_BR(x)                   (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR0_DT(x)                   (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR0_ASC(x)                  (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR0_CSSCK(x)                (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR0_PBR(x)                  (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR0_PDT(x)                  (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR0_PASC(x)                 (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR0_PCSSCK(x)               (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR0_LSBFE                   (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR0_CPHA                    (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR0_CPOL                    (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR0_FMSZ(x)                 (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR0_DBR                     (0x80000000)            /* Double baud rate */
-+#define MCF_DSPI_DCTAR0_CPOL_LOW                (0x00000000)
-+#define MCF_DSPI_DCTAR0_CPOL_HIGH               (0x04000000)
-+#define MCF_DSPI_DCTAR0_CPHA_LATCH_RISING       (0x00000000)
-+#define MCF_DSPI_DCTAR0_CPHA_LATCH_FALLING      (0x02000000)
-+#define MCF_DSPI_DCTAR0_PCSSCK_1CLK             (0x00000000)
-+#define MCF_DSPI_DCTAR0_PCSSCK_3CLK             (0x00400000)
-+#define MCF_DSPI_DCTAR0_PCSSCK_5CLK             (0x00800000)
-+#define MCF_DSPI_DCTAR0_PCSSCK_7CLK             (0x00C00000)
-+#define MCF_DSPI_DCTAR0_PASC_1CLK               (0x00000000)
-+#define MCF_DSPI_DCTAR0_PASC_3CLK               (0x00100000)
-+#define MCF_DSPI_DCTAR0_PASC_5CLK               (0x00200000)
-+#define MCF_DSPI_DCTAR0_PASC_7CLK               (0x00300000)
-+#define MCF_DSPI_DCTAR0_PDT_1CLK                (0x00000000)
-+#define MCF_DSPI_DCTAR0_PDT_3CLK                (0x00040000)
-+#define MCF_DSPI_DCTAR0_PDT_5CLK                (0x00080000)
-+#define MCF_DSPI_DCTAR0_PDT_7CLK                (0x000C0000)
-+#define MCF_DSPI_DCTAR0_PBR_2CLK                (0x00000000)
-+#define MCF_DSPI_DCTAR0_PBR_3CLK                (0x00010000)
-+#define MCF_DSPI_DCTAR0_PBR_5CLK                (0x00020000)
-+#define MCF_DSPI_DCTAR0_PBR_7CLK                (0x00030000)
-+
-+/* Bit definitions and macros for DCTAR1 */
-+#define MCF_DSPI_DCTAR1_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR1_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR1_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR1_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR1_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR1_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR1_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR1_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR1_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR1_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR1_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR1_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR1_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR2 */
-+#define MCF_DSPI_DCTAR2_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR2_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR2_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR2_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR2_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR2_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR2_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR2_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR2_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR2_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR2_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR2_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR2_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR3 */
-+#define MCF_DSPI_DCTAR3_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR3_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR3_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR3_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR3_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR3_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR3_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR3_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR3_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR3_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR3_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR3_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR3_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR4 */
-+#define MCF_DSPI_DCTAR4_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR4_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR4_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR4_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR4_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR4_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR4_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR4_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR4_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR4_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR4_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR4_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR4_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR5 */
-+#define MCF_DSPI_DCTAR5_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR5_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR5_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR5_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR5_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR5_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR5_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR5_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR5_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR5_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR5_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR5_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR5_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR6 */
-+#define MCF_DSPI_DCTAR6_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR6_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR6_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR6_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR6_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR6_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR6_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR6_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR6_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR6_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR6_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR6_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR6_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DCTAR7 */
-+#define MCF_DSPI_DCTAR7_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
-+#define MCF_DSPI_DCTAR7_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
-+#define MCF_DSPI_DCTAR7_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
-+#define MCF_DSPI_DCTAR7_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
-+#define MCF_DSPI_DCTAR7_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
-+#define MCF_DSPI_DCTAR7_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
-+#define MCF_DSPI_DCTAR7_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
-+#define MCF_DSPI_DCTAR7_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
-+#define MCF_DSPI_DCTAR7_LSBFE       (0x01000000)            /* LSB first enable */
-+#define MCF_DSPI_DCTAR7_CPHA        (0x02000000)            /* Clock phase */
-+#define MCF_DSPI_DCTAR7_CPOL        (0x04000000)            /* Clock polarity */
-+#define MCF_DSPI_DCTAR7_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
-+#define MCF_DSPI_DCTAR7_DBR         (0x80000000)            /* Double baud rate */
-+
-+/* Bit definitions and macros for DSR */
-+#define MCF_DSPI_DSR_RXPTR(x)   (((x)&0x0000000F))      /* Receive next pointer */
-+#define MCF_DSPI_DSR_RXCTR(x)   (((x)&0x0000000F)<<4)   /* Receive FIFO counter */
-+#define MCF_DSPI_DSR_TXPTR(x)   (((x)&0x0000000F)<<8)   /* Transmit next pointer */
-+#define MCF_DSPI_DSR_TXCTR(x)   (((x)&0x0000000F)<<12)  /* Transmit FIFO counter */
-+#define MCF_DSPI_DSR_RFDF       (0x00020000)            /* Receive FIFO drain flag */
-+#define MCF_DSPI_DSR_RFOF       (0x00080000)            /* Receive FIFO overflow flag */
-+#define MCF_DSPI_DSR_TFFF       (0x02000000)            /* Transmit FIFO fill flag */
-+#define MCF_DSPI_DSR_TFUF       (0x08000000)            /* Transmit FIFO underflow flag */
-+#define MCF_DSPI_DSR_EOQF       (0x10000000)            /* End of queue flag */
-+#define MCF_DSPI_DSR_TXRXS      (0x40000000)            /* Tx and Rx status (enabled | disabled) */
-+#define MCF_DSPI_DSR_TCF        (0x80000000)            /* Transfer complete flag */
-+
-+/* Bit definitions and macros for DRSER */
-+#define MCF_DSPI_DRSER_RFDFS    (0x00010000)    /* Receive FIFO drain DMA or interrupt select */
-+#define MCF_DSPI_DRSER_RFDFE    (0x00020000)    /* Receive FIFO drain request enable */
-+#define MCF_DSPI_DRSER_RFOFE    (0x00080000)    /* Receive FIFO overflow request enable */
-+#define MCF_DSPI_DRSER_TFFFS    (0x01000000)    /* Transmit FIFO fill DMA or interrupt select */
-+#define MCF_DSPI_DRSER_TFFFE    (0x02000000)    /* Transmit FIFO fill request enable */
-+#define MCF_DSPI_DRSER_TFUFE    (0x08000000)    /* Transmit FIFO underflow request enable */
-+#define MCF_DSPI_DRSER_EOQFE    (0x10000000)    /* DSPI finished request enable */
-+#define MCF_DSPI_DRSER_TCFE     (0x80000000)    /* Transmission complete request enable */
-+
-+/* Bit definitions and macros for DTFR */
-+#define MCF_DSPI_DTFR_TXDATA(x)     (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFR_PCS0          (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFR_PCS1          (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFR_PCS2          (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFR_PCS3          (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFR_PCS4          (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFR_PCS5          (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFR_PCS6          (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFR_PCS7          (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFR_CTCNT         (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFR_EOQ           (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFR_CTAS(x)       (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFR_CONT          (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DRFR */
-+#define MCF_DSPI_DRFR_RXDATA(x)     (((x)&0x0000FFFF))  /* Receive data */
-+
-+/* Bit definitions and macros for DTFDR group */
-+#define MCF_DSPI_DTFDR_TXDATA(x)    (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFDR_PCS0         (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFDR_PCS1         (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFDR_PCS2         (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFDR_PCS3         (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFDR_PCS4         (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFDR_PCS5         (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFDR_PCS6         (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFDR_PCS7         (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFDR_CTCNT        (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFDR_EOQ          (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFDR_CTAS(x)      (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFDR_CONT         (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DTFDR0 */
-+#define MCF_DSPI_DTFDR0_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFDR0_PCS0        (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFDR0_PCS1        (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFDR0_PCS2        (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFDR0_PCS3        (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFDR0_PCS4        (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFDR0_PCS5        (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFDR0_PCS6        (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFDR0_PCS7        (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFDR0_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFDR0_EOQ         (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFDR0_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFDR0_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DTFDR1 */
-+#define MCF_DSPI_DTFDR1_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFDR1_PCS0        (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFDR1_PCS1        (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFDR1_PCS2        (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFDR1_PCS3        (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFDR1_PCS4        (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFDR1_PCS5        (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFDR1_PCS6        (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFDR1_PCS7        (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFDR1_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFDR1_EOQ         (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFDR1_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFDR1_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DTFDR2 */
-+#define MCF_DSPI_DTFDR2_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFDR2_PCS0        (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFDR2_PCS1        (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFDR2_PCS2        (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFDR2_PCS3        (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFDR2_PCS4        (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFDR2_PCS5        (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFDR2_PCS6        (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFDR2_PCS7        (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFDR2_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFDR2_EOQ         (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFDR2_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFDR2_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DTFDR3 */
-+#define MCF_DSPI_DTFDR3_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
-+#define MCF_DSPI_DTFDR3_PCS0        (0x00010000)            /* Peripheral chip select 0 */
-+#define MCF_DSPI_DTFDR3_PCS1        (0x00020000)            /* Peripheral chip select 1 */
-+#define MCF_DSPI_DTFDR3_PCS2        (0x00040000)            /* Peripheral chip select 2 */
-+#define MCF_DSPI_DTFDR3_PCS3        (0x00080000)            /* Peripheral chip select 3 */
-+#define MCF_DSPI_DTFDR3_PCS4        (0x00100000)            /* Peripheral chip select 4 */
-+#define MCF_DSPI_DTFDR3_PCS5        (0x00200000)            /* Peripheral chip select 5 */
-+#define MCF_DSPI_DTFDR3_PCS6        (0x00400000)            /* Peripheral chip select 6 */
-+#define MCF_DSPI_DTFDR3_PCS7        (0x00800000)            /* Peripheral chip select 7 */
-+#define MCF_DSPI_DTFDR3_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
-+#define MCF_DSPI_DTFDR3_EOQ         (0x08000000)            /* End of queue */
-+#define MCF_DSPI_DTFDR3_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
-+#define MCF_DSPI_DTFDR3_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
-+
-+/* Bit definitions and macros for DRFDR group */
-+#define MCF_DSPI_DRFDR_RXDATA(x)    (((x)&0x0000FFFF))  /* Receive data */
-+
-+/* Bit definitions and macros for DRFDR0 */
-+#define MCF_DSPI_DRFDR0_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
-+
-+/* Bit definitions and macros for DRFDR1 */
-+#define MCF_DSPI_DRFDR1_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
-+
-+/* Bit definitions and macros for DRFDR2 */
-+#define MCF_DSPI_DRFDR2_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
-+
-+/* Bit definitions and macros for DRFDR3 */
-+#define MCF_DSPI_DRFDR3_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_DSPI_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_dtim.h
-@@ -0,0 +1,87 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_DTIM_H__
-+#define __MCF5445X_DTIM_H__
-+
-+/*********************************************************************
-+*
-+* DMA Timers (DTIM)
-+*
-+*********************************************************************/
-+/* Register read/write macros */
-+#define MCF_DTIM0_DTMR        0xFC070000      /* DMA Timer Mode Register */
-+#define MCF_DTIM0_DTXMR       0xFC070002      /* DMA Timer Extended Mode Register */
-+#define MCF_DTIM0_DTER        0xFC070003      /* DMA Timer Event Register */
-+#define MCF_DTIM0_DTRR        0xFC070004      /* DMA Timer Reference Register */
-+#define MCF_DTIM0_DTCR        0xFC070008      /* DMA Timer Capture Register */
-+#define MCF_DTIM0_DTCN        0xFC07000C      /* DMA Timer Counter Register */
-+#define MCF_DTIM1_DTMR        0xFC074000      /* DMA Timer Mode Register */
-+#define MCF_DTIM1_DTXMR       0xFC074002      /* DMA Timer Extended Mode Register */
-+#define MCF_DTIM1_DTER        0xFC074003      /* DMA Timer Event Register */
-+#define MCF_DTIM1_DTRR        0xFC074004      /* DMA Timer Reference Register */
-+#define MCF_DTIM1_DTCR        0xFC074008      /* DMA Timer Capture Register */
-+#define MCF_DTIM1_DTCN        0xFC07400C      /* DMA Timer Counter Register */
-+#define MCF_DTIM2_DTMR        0xFC078000      /* DMA Timer Mode Register */
-+#define MCF_DTIM2_DTXMR       0xFC078002      /* DMA Timer Extended Mode Register */
-+#define MCF_DTIM2_DTER        0xFC078003      /* DMA Timer Event Register */
-+#define MCF_DTIM2_DTRR        0xFC078004      /* DMA Timer Reference Register */
-+#define MCF_DTIM2_DTCR        0xFC078008      /* DMA Timer Capture Register */
-+#define MCF_DTIM2_DTCN        0xFC07800C      /* DMA Timer Counter Register */
-+#define MCF_DTIM3_DTMR        0xFC07C000      /* DMA Timer Mode Register */
-+#define MCF_DTIM3_DTXMR       0xFC07C002      /* DMA Timer Extended Mode Register */
-+#define MCF_DTIM3_DTER        0xFC07C003      /* DMA Timer Event Register */
-+#define MCF_DTIM3_DTRR        0xFC07C004      /* DMA Timer Reference Register */
-+#define MCF_DTIM3_DTCR        0xFC07C008      /* DMA Timer Capture Register */
-+#define MCF_DTIM3_DTCN        0xFC07C00C      /* DMA Timer Counter Register */
-+
-+/* Parameterized register read/write macros for multiple modules */
-+#define MCF_DTIM_DTMR(x)      0xFC070000+((x)*0x4000)  /* DMA Timer Mode Register */
-+#define MCF_DTIM_DTXMR(x)     0xFC070002+((x)*0x4000)  /* DMA Timer Extended Mode Register */
-+#define MCF_DTIM_DTER(x)      0xFC070003+((x)*0x4000)  /* DMA Timer Event Register */
-+#define MCF_DTIM_DTRR(x)      0xFC070004+((x)*0x4000)  /* DMA Timer Reference Register */
-+#define MCF_DTIM_DTCR(x)      0xFC070008+((x)*0x4000)  /* DMA Timer Capture Register */
-+#define MCF_DTIM_DTCN(x)      0xFC07000C+((x)*0x4000)  /* DMA Timer Counter Register */
-+
-+/* Bit definitions and macros for DTMR */
-+#define MCF_DTIM_DTMR_RST     (0x0001)                /* Reset */
-+#define MCF_DTIM_DTMR_CLK(x)  (((x)&0x0003)<<1)       /* Input clock source */
-+#define MCF_DTIM_DTMR_FRR     (0x0008)                /* Free run/restart */
-+#define MCF_DTIM_DTMR_ORRI    (0x0010)                /* Output reference request/interrupt enable */
-+#define MCF_DTIM_DTMR_OM      (0x0020)                /* Output Mode */
-+#define MCF_DTIM_DTMR_CE(x)   (((x)&0x0003)<<6)       /* Capture Edge */
-+#define MCF_DTIM_DTMR_PS(x)   (((x)&0x00FF)<<8)       /* Prescaler value */
-+#define MCF_DTIM_DTMR_RST_EN  (0x0001)
-+#define MCF_DTIM_DTMR_RST_RST (0x0000)
-+#define MCF_DTIM_DTMR_CE_ANY  (0x00C0)
-+#define MCF_DTIM_DTMR_CE_FALL (0x0080)
-+#define MCF_DTIM_DTMR_CE_RISE (0x0040)
-+#define MCF_DTIM_DTMR_CE_NONE (0x0000)
-+#define MCF_DTIM_DTMR_CLK_DTIN        (0x0006)
-+#define MCF_DTIM_DTMR_CLK_DIV16       (0x0004)
-+#define MCF_DTIM_DTMR_CLK_DIV1        (0x0002)
-+#define MCF_DTIM_DTMR_CLK_STOP        (0x0000)
-+
-+/* Bit definitions and macros for DTXMR */
-+#define MCF_DTIM_DTXMR_MODE16 (0x01)  /* Increment Mode */
-+#define MCF_DTIM_DTXMR_DMAEN  (0x80)  /* DMA request */
-+
-+/* Bit definitions and macros for DTER */
-+#define MCF_DTIM_DTER_CAP     (0x01)  /* Capture event */
-+#define MCF_DTIM_DTER_REF     (0x02)  /* Output reference event */
-+
-+/* Interrupts used for system timers */
-+#define MCFSIM_ICR_TIMER1       (0xFC048040+32)
-+#define MCFSIM_ICR_TIMER2       (0xFC048040+33)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_DTIM_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_edma.h
-@@ -0,0 +1,1472 @@
-+/*
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+#ifndef __MCF5445X_EDMA_H__
-+#define __MCF5445X_EDMA_H__
-+
-+/*
-+ * Enhanced DMA (EDMA)
-+ */
-+
-+/* Channels */
-+#define MCF_EDMA_CHAN_DREQ0   0       /* External DMA request 0 */
-+#define MCF_EDMA_CHAN_DREQ1   1       /* External DMA request 1 */
-+#define MCF_EDMA_CHAN_UART0_RX        2       /* UART0 Receive */
-+#define MCF_EDMA_CHAN_UART0_TX        3       /* UART0 Transmit */
-+#define MCF_EDMA_CHAN_UART1_RX        4       /* UART1 Receive */
-+#define MCF_EDMA_CHAN_UART1_TX        5       /* UART1 Transmit */
-+#define MCF_EDMA_CHAN_UART2_RX        6       /* UART2 Receive */
-+#define MCF_EDMA_CHAN_UART2_TX        7       /* UART2 Transmit */
-+#define MCF_EDMA_CHAN_TIMER0  8       /* Timer 0 / SSI0 Rx */
-+#define MCF_EDMA_CHAN_TIMER1  9       /* Timer 1 / SSI1 Rx */
-+#define MCF_EDMA_CHAN_TIMER2  10      /* Timer 2 / SSI0 Tx */
-+#define MCF_EDMA_CHAN_TIMER3  11      /* Timer 3 / SSI1 Tx */
-+#define MCF_EDMA_CHAN_DSPI_RX 12      /* DSPI Receive */
-+#define MCF_EDMA_CHAN_DSPI_TX 13      /* DSPI Transmit */
-+#define MCF_EDMA_CHAN_ATA_RX  14      /* ATA Receive */
-+#define MCF_EDMA_CHAN_ATA_TX  15      /* ATA Transmit */
-+
-+/* Register read/write macros */
-+#define MCF_EDMA_CR                     MCF_REG32(0xFC044000)
-+#define MCF_EDMA_ES                     MCF_REG32(0xFC044004)
-+#define MCF_EDMA_ERQ                    MCF_REG16(0xFC04400E)
-+#define MCF_EDMA_EEI                    MCF_REG16(0xFC044016)
-+#define MCF_EDMA_SERQ                   MCF_REG08(0xFC044018)
-+#define MCF_EDMA_CERQ                   MCF_REG08(0xFC044019)
-+#define MCF_EDMA_SEEI                   MCF_REG08(0xFC04401A)
-+#define MCF_EDMA_CEEI                   MCF_REG08(0xFC04401B)
-+#define MCF_EDMA_CINT                   MCF_REG08(0xFC04401C)
-+#define MCF_EDMA_CERR                   MCF_REG08(0xFC04401D)
-+#define MCF_EDMA_SSRT                   MCF_REG08(0xFC04401E)
-+#define MCF_EDMA_CDNE                   MCF_REG08(0xFC04401F)
-+#define MCF_EDMA_INTR                   MCF_REG16(0xFC044026)
-+#define MCF_EDMA_ERR                    MCF_REG16(0xFC04402E)
-+#define MCF_EDMA_DCHPRI0                MCF_REG08(0xFC044100)
-+#define MCF_EDMA_DCHPRI1                MCF_REG08(0xFC044101)
-+#define MCF_EDMA_DCHPRI2                MCF_REG08(0xFC044102)
-+#define MCF_EDMA_DCHPRI3                MCF_REG08(0xFC044103)
-+#define MCF_EDMA_DCHPRI4                MCF_REG08(0xFC044104)
-+#define MCF_EDMA_DCHPRI5                MCF_REG08(0xFC044105)
-+#define MCF_EDMA_DCHPRI6                MCF_REG08(0xFC044106)
-+#define MCF_EDMA_DCHPRI7                MCF_REG08(0xFC044107)
-+#define MCF_EDMA_DCHPRI8                MCF_REG08(0xFC044108)
-+#define MCF_EDMA_DCHPRI9                MCF_REG08(0xFC044109)
-+#define MCF_EDMA_DCHPRI10               MCF_REG08(0xFC04410A)
-+#define MCF_EDMA_DCHPRI11               MCF_REG08(0xFC04410B)
-+#define MCF_EDMA_DCHPRI12               MCF_REG08(0xFC04410C)
-+#define MCF_EDMA_DCHPRI13               MCF_REG08(0xFC04410D)
-+#define MCF_EDMA_DCHPRI14               MCF_REG08(0xFC04410E)
-+#define MCF_EDMA_DCHPRI15               MCF_REG08(0xFC04410F)
-+#define MCF_EDMA_TCD0_SADDR             MCF_REG32(0xFC045000)
-+#define MCF_EDMA_TCD0_ATTR              MCF_REG16(0xFC045004)
-+#define MCF_EDMA_TCD0_SOFF              MCF_REG16(0xFC045006)
-+#define MCF_EDMA_TCD0_NBYTES            MCF_REG32(0xFC045008)
-+#define MCF_EDMA_TCD0_SLAST             MCF_REG32(0xFC04500C)
-+#define MCF_EDMA_TCD0_DADDR             MCF_REG32(0xFC045010)
-+#define MCF_EDMA_TCD0_CITER_ELINK       MCF_REG16(0xFC045014)
-+#define MCF_EDMA_TCD0_CITER             MCF_REG16(0xFC045014)
-+#define MCF_EDMA_TCD0_DOFF              MCF_REG16(0xFC045016)
-+#define MCF_EDMA_TCD0_DLAST_SGA         MCF_REG32(0xFC045018)
-+#define MCF_EDMA_TCD0_BITER_ELINK       MCF_REG16(0xFC04501C)
-+#define MCF_EDMA_TCD0_BITER             MCF_REG16(0xFC04501C)
-+#define MCF_EDMA_TCD0_CSR               MCF_REG16(0xFC04501E)
-+#define MCF_EDMA_TCD1_SADDR             MCF_REG32(0xFC045020)
-+#define MCF_EDMA_TCD1_ATTR              MCF_REG16(0xFC045024)
-+#define MCF_EDMA_TCD1_SOFF              MCF_REG16(0xFC045026)
-+#define MCF_EDMA_TCD1_NBYTES            MCF_REG32(0xFC045028)
-+#define MCF_EDMA_TCD1_SLAST             MCF_REG32(0xFC04502C)
-+#define MCF_EDMA_TCD1_DADDR             MCF_REG32(0xFC045030)
-+#define MCF_EDMA_TCD1_CITER_ELINK       MCF_REG16(0xFC045034)
-+#define MCF_EDMA_TCD1_CITER             MCF_REG16(0xFC045034)
-+#define MCF_EDMA_TCD1_DOFF              MCF_REG16(0xFC045036)
-+#define MCF_EDMA_TCD1_DLAST_SGA         MCF_REG32(0xFC045038)
-+#define MCF_EDMA_TCD1_BITER             MCF_REG16(0xFC04503C)
-+#define MCF_EDMA_TCD1_BITER_ELINK       MCF_REG16(0xFC04503C)
-+#define MCF_EDMA_TCD1_CSR               MCF_REG16(0xFC04503E)
-+#define MCF_EDMA_TCD2_SADDR             MCF_REG32(0xFC045040)
-+#define MCF_EDMA_TCD2_ATTR              MCF_REG16(0xFC045044)
-+#define MCF_EDMA_TCD2_SOFF              MCF_REG16(0xFC045046)
-+#define MCF_EDMA_TCD2_NBYTES            MCF_REG32(0xFC045048)
-+#define MCF_EDMA_TCD2_SLAST             MCF_REG32(0xFC04504C)
-+#define MCF_EDMA_TCD2_DADDR             MCF_REG32(0xFC045050)
-+#define MCF_EDMA_TCD2_CITER             MCF_REG16(0xFC045054)
-+#define MCF_EDMA_TCD2_CITER_ELINK       MCF_REG16(0xFC045054)
-+#define MCF_EDMA_TCD2_DOFF              MCF_REG16(0xFC045056)
-+#define MCF_EDMA_TCD2_DLAST_SGA         MCF_REG32(0xFC045058)
-+#define MCF_EDMA_TCD2_BITER_ELINK       MCF_REG16(0xFC04505C)
-+#define MCF_EDMA_TCD2_BITER             MCF_REG16(0xFC04505C)
-+#define MCF_EDMA_TCD2_CSR               MCF_REG16(0xFC04505E)
-+#define MCF_EDMA_TCD3_SADDR             MCF_REG32(0xFC045060)
-+#define MCF_EDMA_TCD3_ATTR              MCF_REG16(0xFC045064)
-+#define MCF_EDMA_TCD3_SOFF              MCF_REG16(0xFC045066)
-+#define MCF_EDMA_TCD3_NBYTES            MCF_REG32(0xFC045068)
-+#define MCF_EDMA_TCD3_SLAST             MCF_REG32(0xFC04506C)
-+#define MCF_EDMA_TCD3_DADDR             MCF_REG32(0xFC045070)
-+#define MCF_EDMA_TCD3_CITER             MCF_REG16(0xFC045074)
-+#define MCF_EDMA_TCD3_CITER_ELINK       MCF_REG16(0xFC045074)
-+#define MCF_EDMA_TCD3_DOFF              MCF_REG16(0xFC045076)
-+#define MCF_EDMA_TCD3_DLAST_SGA         MCF_REG32(0xFC045078)
-+#define MCF_EDMA_TCD3_BITER_ELINK       MCF_REG16(0xFC04507C)
-+#define MCF_EDMA_TCD3_BITER             MCF_REG16(0xFC04507C)
-+#define MCF_EDMA_TCD3_CSR               MCF_REG16(0xFC04507E)
-+#define MCF_EDMA_TCD4_SADDR             MCF_REG32(0xFC045080)
-+#define MCF_EDMA_TCD4_ATTR              MCF_REG16(0xFC045084)
-+#define MCF_EDMA_TCD4_SOFF              MCF_REG16(0xFC045086)
-+#define MCF_EDMA_TCD4_NBYTES            MCF_REG32(0xFC045088)
-+#define MCF_EDMA_TCD4_SLAST             MCF_REG32(0xFC04508C)
-+#define MCF_EDMA_TCD4_DADDR             MCF_REG32(0xFC045090)
-+#define MCF_EDMA_TCD4_CITER             MCF_REG16(0xFC045094)
-+#define MCF_EDMA_TCD4_CITER_ELINK       MCF_REG16(0xFC045094)
-+#define MCF_EDMA_TCD4_DOFF              MCF_REG16(0xFC045096)
-+#define MCF_EDMA_TCD4_DLAST_SGA         MCF_REG32(0xFC045098)
-+#define MCF_EDMA_TCD4_BITER             MCF_REG16(0xFC04509C)
-+#define MCF_EDMA_TCD4_BITER_ELINK       MCF_REG16(0xFC04509C)
-+#define MCF_EDMA_TCD4_CSR               MCF_REG16(0xFC04509E)
-+#define MCF_EDMA_TCD5_SADDR             MCF_REG32(0xFC0450A0)
-+#define MCF_EDMA_TCD5_ATTR              MCF_REG16(0xFC0450A4)
-+#define MCF_EDMA_TCD5_SOFF              MCF_REG16(0xFC0450A6)
-+#define MCF_EDMA_TCD5_NBYTES            MCF_REG32(0xFC0450A8)
-+#define MCF_EDMA_TCD5_SLAST             MCF_REG32(0xFC0450AC)
-+#define MCF_EDMA_TCD5_DADDR             MCF_REG32(0xFC0450B0)
-+#define MCF_EDMA_TCD5_CITER             MCF_REG16(0xFC0450B4)
-+#define MCF_EDMA_TCD5_CITER_ELINK       MCF_REG16(0xFC0450B4)
-+#define MCF_EDMA_TCD5_DOFF              MCF_REG16(0xFC0450B6)
-+#define MCF_EDMA_TCD5_DLAST_SGA         MCF_REG32(0xFC0450B8)
-+#define MCF_EDMA_TCD5_BITER_ELINK       MCF_REG16(0xFC0450BC)
-+#define MCF_EDMA_TCD5_BITER             MCF_REG16(0xFC0450BC)
-+#define MCF_EDMA_TCD5_CSR               MCF_REG16(0xFC0450BE)
-+#define MCF_EDMA_TCD6_SADDR             MCF_REG32(0xFC0450C0)
-+#define MCF_EDMA_TCD6_ATTR              MCF_REG16(0xFC0450C4)
-+#define MCF_EDMA_TCD6_SOFF              MCF_REG16(0xFC0450C6)
-+#define MCF_EDMA_TCD6_NBYTES            MCF_REG32(0xFC0450C8)
-+#define MCF_EDMA_TCD6_SLAST             MCF_REG32(0xFC0450CC)
-+#define MCF_EDMA_TCD6_DADDR             MCF_REG32(0xFC0450D0)
-+#define MCF_EDMA_TCD6_CITER             MCF_REG16(0xFC0450D4)
-+#define MCF_EDMA_TCD6_CITER_ELINK       MCF_REG16(0xFC0450D4)
-+#define MCF_EDMA_TCD6_DOFF              MCF_REG16(0xFC0450D6)
-+#define MCF_EDMA_TCD6_DLAST_SGA         MCF_REG32(0xFC0450D8)
-+#define MCF_EDMA_TCD6_BITER_ELINK       MCF_REG16(0xFC0450DC)
-+#define MCF_EDMA_TCD6_BITER             MCF_REG16(0xFC0450DC)
-+#define MCF_EDMA_TCD6_CSR               MCF_REG16(0xFC0450DE)
-+#define MCF_EDMA_TCD7_SADDR             MCF_REG32(0xFC0450E0)
-+#define MCF_EDMA_TCD7_ATTR              MCF_REG16(0xFC0450E4)
-+#define MCF_EDMA_TCD7_SOFF              MCF_REG16(0xFC0450E6)
-+#define MCF_EDMA_TCD7_NBYTES            MCF_REG32(0xFC0450E8)
-+#define MCF_EDMA_TCD7_SLAST             MCF_REG32(0xFC0450EC)
-+#define MCF_EDMA_TCD7_DADDR             MCF_REG32(0xFC0450F0)
-+#define MCF_EDMA_TCD7_CITER             MCF_REG16(0xFC0450F4)
-+#define MCF_EDMA_TCD7_CITER_ELINK       MCF_REG16(0xFC0450F4)
-+#define MCF_EDMA_TCD7_DOFF              MCF_REG16(0xFC0450F6)
-+#define MCF_EDMA_TCD7_DLAST_SGA         MCF_REG32(0xFC0450F8)
-+#define MCF_EDMA_TCD7_BITER_ELINK       MCF_REG16(0xFC0450FC)
-+#define MCF_EDMA_TCD7_BITER             MCF_REG16(0xFC0450FC)
-+#define MCF_EDMA_TCD7_CSR               MCF_REG16(0xFC0450FE)
-+#define MCF_EDMA_TCD8_SADDR             MCF_REG32(0xFC045100)
-+#define MCF_EDMA_TCD8_ATTR              MCF_REG16(0xFC045104)
-+#define MCF_EDMA_TCD8_SOFF              MCF_REG16(0xFC045106)
-+#define MCF_EDMA_TCD8_NBYTES            MCF_REG32(0xFC045108)
-+#define MCF_EDMA_TCD8_SLAST             MCF_REG32(0xFC04510C)
-+#define MCF_EDMA_TCD8_DADDR             MCF_REG32(0xFC045110)
-+#define MCF_EDMA_TCD8_CITER             MCF_REG16(0xFC045114)
-+#define MCF_EDMA_TCD8_CITER_ELINK       MCF_REG16(0xFC045114)
-+#define MCF_EDMA_TCD8_DOFF              MCF_REG16(0xFC045116)
-+#define MCF_EDMA_TCD8_DLAST_SGA         MCF_REG32(0xFC045118)
-+#define MCF_EDMA_TCD8_BITER_ELINK       MCF_REG16(0xFC04511C)
-+#define MCF_EDMA_TCD8_BITER             MCF_REG16(0xFC04511C)
-+#define MCF_EDMA_TCD8_CSR               MCF_REG16(0xFC04511E)
-+#define MCF_EDMA_TCD9_SADDR             MCF_REG32(0xFC045120)
-+#define MCF_EDMA_TCD9_ATTR              MCF_REG16(0xFC045124)
-+#define MCF_EDMA_TCD9_SOFF              MCF_REG16(0xFC045126)
-+#define MCF_EDMA_TCD9_NBYTES            MCF_REG32(0xFC045128)
-+#define MCF_EDMA_TCD9_SLAST             MCF_REG32(0xFC04512C)
-+#define MCF_EDMA_TCD9_DADDR             MCF_REG32(0xFC045130)
-+#define MCF_EDMA_TCD9_CITER_ELINK       MCF_REG16(0xFC045134)
-+#define MCF_EDMA_TCD9_CITER             MCF_REG16(0xFC045134)
-+#define MCF_EDMA_TCD9_DOFF              MCF_REG16(0xFC045136)
-+#define MCF_EDMA_TCD9_DLAST_SGA         MCF_REG32(0xFC045138)
-+#define MCF_EDMA_TCD9_BITER_ELINK       MCF_REG16(0xFC04513C)
-+#define MCF_EDMA_TCD9_BITER             MCF_REG16(0xFC04513C)
-+#define MCF_EDMA_TCD9_CSR               MCF_REG16(0xFC04513E)
-+#define MCF_EDMA_TCD10_SADDR            MCF_REG32(0xFC045140)
-+#define MCF_EDMA_TCD10_ATTR             MCF_REG16(0xFC045144)
-+#define MCF_EDMA_TCD10_SOFF             MCF_REG16(0xFC045146)
-+#define MCF_EDMA_TCD10_NBYTES           MCF_REG32(0xFC045148)
-+#define MCF_EDMA_TCD10_SLAST            MCF_REG32(0xFC04514C)
-+#define MCF_EDMA_TCD10_DADDR            MCF_REG32(0xFC045150)
-+#define MCF_EDMA_TCD10_CITER_ELINK      MCF_REG16(0xFC045154)
-+#define MCF_EDMA_TCD10_CITER            MCF_REG16(0xFC045154)
-+#define MCF_EDMA_TCD10_DOFF             MCF_REG16(0xFC045156)
-+#define MCF_EDMA_TCD10_DLAST_SGA        MCF_REG32(0xFC045158)
-+#define MCF_EDMA_TCD10_BITER            MCF_REG16(0xFC04515C)
-+#define MCF_EDMA_TCD10_BITER_ELINK      MCF_REG16(0xFC04515C)
-+#define MCF_EDMA_TCD10_CSR              MCF_REG16(0xFC04515E)
-+#define MCF_EDMA_TCD11_SADDR            MCF_REG32(0xFC045160)
-+#define MCF_EDMA_TCD11_ATTR             MCF_REG16(0xFC045164)
-+#define MCF_EDMA_TCD11_SOFF             MCF_REG16(0xFC045166)
-+#define MCF_EDMA_TCD11_NBYTES           MCF_REG32(0xFC045168)
-+#define MCF_EDMA_TCD11_SLAST            MCF_REG32(0xFC04516C)
-+#define MCF_EDMA_TCD11_DADDR            MCF_REG32(0xFC045170)
-+#define MCF_EDMA_TCD11_CITER            MCF_REG16(0xFC045174)
-+#define MCF_EDMA_TCD11_CITER_ELINK      MCF_REG16(0xFC045174)
-+#define MCF_EDMA_TCD11_DOFF             MCF_REG16(0xFC045176)
-+#define MCF_EDMA_TCD11_DLAST_SGA        MCF_REG32(0xFC045178)
-+#define MCF_EDMA_TCD11_BITER            MCF_REG16(0xFC04517C)
-+#define MCF_EDMA_TCD11_BITER_ELINK      MCF_REG16(0xFC04517C)
-+#define MCF_EDMA_TCD11_CSR              MCF_REG16(0xFC04517E)
-+#define MCF_EDMA_TCD12_SADDR            MCF_REG32(0xFC045180)
-+#define MCF_EDMA_TCD12_ATTR             MCF_REG16(0xFC045184)
-+#define MCF_EDMA_TCD12_SOFF             MCF_REG16(0xFC045186)
-+#define MCF_EDMA_TCD12_NBYTES           MCF_REG32(0xFC045188)
-+#define MCF_EDMA_TCD12_SLAST            MCF_REG32(0xFC04518C)
-+#define MCF_EDMA_TCD12_DADDR            MCF_REG32(0xFC045190)
-+#define MCF_EDMA_TCD12_CITER            MCF_REG16(0xFC045194)
-+#define MCF_EDMA_TCD12_CITER_ELINK      MCF_REG16(0xFC045194)
-+#define MCF_EDMA_TCD12_DOFF             MCF_REG16(0xFC045196)
-+#define MCF_EDMA_TCD12_DLAST_SGA        MCF_REG32(0xFC045198)
-+#define MCF_EDMA_TCD12_BITER            MCF_REG16(0xFC04519C)
-+#define MCF_EDMA_TCD12_BITER_ELINK      MCF_REG16(0xFC04519C)
-+#define MCF_EDMA_TCD12_CSR              MCF_REG16(0xFC04519E)
-+#define MCF_EDMA_TCD13_SADDR            MCF_REG32(0xFC0451A0)
-+#define MCF_EDMA_TCD13_ATTR             MCF_REG16(0xFC0451A4)
-+#define MCF_EDMA_TCD13_SOFF             MCF_REG16(0xFC0451A6)
-+#define MCF_EDMA_TCD13_NBYTES           MCF_REG32(0xFC0451A8)
-+#define MCF_EDMA_TCD13_SLAST            MCF_REG32(0xFC0451AC)
-+#define MCF_EDMA_TCD13_DADDR            MCF_REG32(0xFC0451B0)
-+#define MCF_EDMA_TCD13_CITER_ELINK      MCF_REG16(0xFC0451B4)
-+#define MCF_EDMA_TCD13_CITER            MCF_REG16(0xFC0451B4)
-+#define MCF_EDMA_TCD13_DOFF             MCF_REG16(0xFC0451B6)
-+#define MCF_EDMA_TCD13_DLAST_SGA        MCF_REG32(0xFC0451B8)
-+#define MCF_EDMA_TCD13_BITER_ELINK      MCF_REG16(0xFC0451BC)
-+#define MCF_EDMA_TCD13_BITER            MCF_REG16(0xFC0451BC)
-+#define MCF_EDMA_TCD13_CSR              MCF_REG16(0xFC0451BE)
-+#define MCF_EDMA_TCD14_SADDR            MCF_REG32(0xFC0451C0)
-+#define MCF_EDMA_TCD14_ATTR             MCF_REG16(0xFC0451C4)
-+#define MCF_EDMA_TCD14_SOFF             MCF_REG16(0xFC0451C6)
-+#define MCF_EDMA_TCD14_NBYTES           MCF_REG32(0xFC0451C8)
-+#define MCF_EDMA_TCD14_SLAST            MCF_REG32(0xFC0451CC)
-+#define MCF_EDMA_TCD14_DADDR            MCF_REG32(0xFC0451D0)
-+#define MCF_EDMA_TCD14_CITER            MCF_REG16(0xFC0451D4)
-+#define MCF_EDMA_TCD14_CITER_ELINK      MCF_REG16(0xFC0451D4)
-+#define MCF_EDMA_TCD14_DOFF             MCF_REG16(0xFC0451D6)
-+#define MCF_EDMA_TCD14_DLAST_SGA        MCF_REG32(0xFC0451D8)
-+#define MCF_EDMA_TCD14_BITER_ELINK      MCF_REG16(0xFC0451DC)
-+#define MCF_EDMA_TCD14_BITER            MCF_REG16(0xFC0451DC)
-+#define MCF_EDMA_TCD14_CSR              MCF_REG16(0xFC0451DE)
-+#define MCF_EDMA_TCD15_SADDR            MCF_REG32(0xFC0451E0)
-+#define MCF_EDMA_TCD15_ATTR             MCF_REG16(0xFC0451E4)
-+#define MCF_EDMA_TCD15_SOFF             MCF_REG16(0xFC0451E6)
-+#define MCF_EDMA_TCD15_NBYTES           MCF_REG32(0xFC0451E8)
-+#define MCF_EDMA_TCD15_SLAST            MCF_REG32(0xFC0451EC)
-+#define MCF_EDMA_TCD15_DADDR            MCF_REG32(0xFC0451F0)
-+#define MCF_EDMA_TCD15_CITER_ELINK      MCF_REG16(0xFC0451F4)
-+#define MCF_EDMA_TCD15_CITER            MCF_REG16(0xFC0451F4)
-+#define MCF_EDMA_TCD15_DOFF             MCF_REG16(0xFC0451F6)
-+#define MCF_EDMA_TCD15_DLAST_SGA        MCF_REG32(0xFC0451F8)
-+#define MCF_EDMA_TCD15_BITER            MCF_REG16(0xFC0451FC)
-+#define MCF_EDMA_TCD15_BITER_ELINK      MCF_REG16(0xFC0451FC)
-+#define MCF_EDMA_TCD15_CSR              MCF_REG16(0xFC0451FE)
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_EDMA_DCHPRI(x)              MCF_REG08(0xFC044100+((x)*0x001))
-+#define MCF_EDMA_TCD_SADDR(x)           MCF_REG32(0xFC045000+((x)*0x020))
-+#define MCF_EDMA_TCD_ATTR(x)            MCF_REG16(0xFC045004+((x)*0x020))
-+#define MCF_EDMA_TCD_SOFF(x)            MCF_REG16(0xFC045006+((x)*0x020))
-+#define MCF_EDMA_TCD_NBYTES(x)          MCF_REG32(0xFC045008+((x)*0x020))
-+#define MCF_EDMA_TCD_SLAST(x)           MCF_REG32(0xFC04500C+((x)*0x020))
-+#define MCF_EDMA_TCD_DADDR(x)           MCF_REG32(0xFC045010+((x)*0x020))
-+#define MCF_EDMA_TCD_CITER_ELINK(x)     MCF_REG16(0xFC045014+((x)*0x020))
-+#define MCF_EDMA_TCD_CITER(x)           MCF_REG16(0xFC045014+((x)*0x020))
-+#define MCF_EDMA_TCD_DOFF(x)            MCF_REG16(0xFC045016+((x)*0x020))
-+#define MCF_EDMA_TCD_DLAST_SGA(x)       MCF_REG32(0xFC045018+((x)*0x020))
-+#define MCF_EDMA_TCD_BITER_ELINK(x)     MCF_REG16(0xFC04501C+((x)*0x020))
-+#define MCF_EDMA_TCD_BITER(x)           MCF_REG16(0xFC04501C+((x)*0x020))
-+#define MCF_EDMA_TCD_CSR(x)             MCF_REG16(0xFC04501e +((x)*0x020))
-+
-+/* Bit definitions and macros for CR */
-+#define MCF_EDMA_CR_EDBG        (0x00000002)
-+#define MCF_EDMA_CR_ERCA        (0x00000004)
-+
-+/* Bit definitions and macros for ES */
-+#define MCF_EDMA_ES_DBE         (0x00000001)
-+#define MCF_EDMA_ES_SBE         (0x00000002)
-+#define MCF_EDMA_ES_SGE         (0x00000004)
-+#define MCF_EDMA_ES_NCE         (0x00000008)
-+#define MCF_EDMA_ES_DOE         (0x00000010)
-+#define MCF_EDMA_ES_DAE         (0x00000020)
-+#define MCF_EDMA_ES_SOE         (0x00000040)
-+#define MCF_EDMA_ES_SAE         (0x00000080)
-+#define MCF_EDMA_ES_ERRCHN(x)   (((x)&0x0000000F)<<8)
-+#define MCF_EDMA_ES_CPE         (0x00004000)
-+#define MCF_EDMA_ES_VLD         (0x80000000)
-+
-+/* Bit definitions and macros for ERQ */
-+#define MCF_EDMA_ERQ_ERQ0       (0x0001)
-+#define MCF_EDMA_ERQ_ERQ1       (0x0002)
-+#define MCF_EDMA_ERQ_ERQ2       (0x0004)
-+#define MCF_EDMA_ERQ_ERQ3       (0x0008)
-+#define MCF_EDMA_ERQ_ERQ4       (0x0010)
-+#define MCF_EDMA_ERQ_ERQ5       (0x0020)
-+#define MCF_EDMA_ERQ_ERQ6       (0x0040)
-+#define MCF_EDMA_ERQ_ERQ7       (0x0080)
-+#define MCF_EDMA_ERQ_ERQ8       (0x0100)
-+#define MCF_EDMA_ERQ_ERQ9       (0x0200)
-+#define MCF_EDMA_ERQ_ERQ10      (0x0400)
-+#define MCF_EDMA_ERQ_ERQ11      (0x0800)
-+#define MCF_EDMA_ERQ_ERQ12      (0x1000)
-+#define MCF_EDMA_ERQ_ERQ13      (0x2000)
-+#define MCF_EDMA_ERQ_ERQ14      (0x4000)
-+#define MCF_EDMA_ERQ_ERQ15      (0x8000)
-+
-+/* Bit definitions and macros for EEI */
-+#define MCF_EDMA_EEI_EEI0       (0x0001)
-+#define MCF_EDMA_EEI_EEI1       (0x0002)
-+#define MCF_EDMA_EEI_EEI2       (0x0004)
-+#define MCF_EDMA_EEI_EEI3       (0x0008)
-+#define MCF_EDMA_EEI_EEI4       (0x0010)
-+#define MCF_EDMA_EEI_EEI5       (0x0020)
-+#define MCF_EDMA_EEI_EEI6       (0x0040)
-+#define MCF_EDMA_EEI_EEI7       (0x0080)
-+#define MCF_EDMA_EEI_EEI8       (0x0100)
-+#define MCF_EDMA_EEI_EEI9       (0x0200)
-+#define MCF_EDMA_EEI_EEI10      (0x0400)
-+#define MCF_EDMA_EEI_EEI11      (0x0800)
-+#define MCF_EDMA_EEI_EEI12      (0x1000)
-+#define MCF_EDMA_EEI_EEI13      (0x2000)
-+#define MCF_EDMA_EEI_EEI14      (0x4000)
-+#define MCF_EDMA_EEI_EEI15      (0x8000)
-+
-+/* Bit definitions and macros for SERQ */
-+#define MCF_EDMA_SERQ_SERQ(x)   (((x)&0x0F))
-+#define MCF_EDMA_SERQ_SAER      (0x40)
-+
-+/* Bit definitions and macros for CERQ */
-+#define MCF_EDMA_CERQ_CERQ(x)   (((x)&0x0F))
-+#define MCF_EDMA_CERQ_CAER      (0x40)
-+
-+/* Bit definitions and macros for SEEI */
-+#define MCF_EDMA_SEEI_SEEI(x)   (((x)&0x0F))
-+#define MCF_EDMA_SEEI_SAEE      (0x40)
-+
-+/* Bit definitions and macros for CEEI */
-+#define MCF_EDMA_CEEI_CEEI(x)   (((x)&0x0F))
-+#define MCF_EDMA_CEEI_CAEE      (0x40)
-+
-+/* Bit definitions and macros for CINT */
-+#define MCF_EDMA_CINT_CINT(x)   (((x)&0x0F))
-+#define MCF_EDMA_CINT_CAIR      (0x40)
-+
-+/* Bit definitions and macros for CERR */
-+#define MCF_EDMA_CERR_CERR(x)   (((x)&0x0F))
-+#define MCF_EDMA_CERR_CAER      (0x40)
-+
-+/* Bit definitions and macros for SSRT */
-+#define MCF_EDMA_SSRT_SSRT(x)   (((x)&0x0F))
-+#define MCF_EDMA_SSRT_SAST      (0x40)
-+
-+/* Bit definitions and macros for CDNE */
-+#define MCF_EDMA_CDNE_CDNE(x)   (((x)&0x0F))
-+#define MCF_EDMA_CDNE_CADN      (0x40)
-+
-+/* Bit definitions and macros for INTR */
-+#define MCF_EDMA_INTR_INT0      (0x0001)
-+#define MCF_EDMA_INTR_INT1      (0x0002)
-+#define MCF_EDMA_INTR_INT2      (0x0004)
-+#define MCF_EDMA_INTR_INT3      (0x0008)
-+#define MCF_EDMA_INTR_INT4      (0x0010)
-+#define MCF_EDMA_INTR_INT5      (0x0020)
-+#define MCF_EDMA_INTR_INT6      (0x0040)
-+#define MCF_EDMA_INTR_INT7      (0x0080)
-+#define MCF_EDMA_INTR_INT8      (0x0100)
-+#define MCF_EDMA_INTR_INT9      (0x0200)
-+#define MCF_EDMA_INTR_INT10     (0x0400)
-+#define MCF_EDMA_INTR_INT11     (0x0800)
-+#define MCF_EDMA_INTR_INT12     (0x1000)
-+#define MCF_EDMA_INTR_INT13     (0x2000)
-+#define MCF_EDMA_INTR_INT14     (0x4000)
-+#define MCF_EDMA_INTR_INT15     (0x8000)
-+
-+/* Bit definitions and macros for ERR */
-+#define MCF_EDMA_ERR_ERR0       (0x0001)
-+#define MCF_EDMA_ERR_ERR1       (0x0002)
-+#define MCF_EDMA_ERR_ERR2       (0x0004)
-+#define MCF_EDMA_ERR_ERR3       (0x0008)
-+#define MCF_EDMA_ERR_ERR4       (0x0010)
-+#define MCF_EDMA_ERR_ERR5       (0x0020)
-+#define MCF_EDMA_ERR_ERR6       (0x0040)
-+#define MCF_EDMA_ERR_ERR7       (0x0080)
-+#define MCF_EDMA_ERR_ERR8       (0x0100)
-+#define MCF_EDMA_ERR_ERR9       (0x0200)
-+#define MCF_EDMA_ERR_ERR10      (0x0400)
-+#define MCF_EDMA_ERR_ERR11      (0x0800)
-+#define MCF_EDMA_ERR_ERR12      (0x1000)
-+#define MCF_EDMA_ERR_ERR13      (0x2000)
-+#define MCF_EDMA_ERR_ERR14      (0x4000)
-+#define MCF_EDMA_ERR_ERR15      (0x8000)
-+
-+/* Bit definitions and macros for DCHPRI group */
-+#define MCF_EDMA_DCHPRI_CHPRI(x)    (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI_ECP         (0x80)
-+
-+/* Bit definitions and macros for DCHPRI0 */
-+#define MCF_EDMA_DCHPRI0_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI0_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI1 */
-+#define MCF_EDMA_DCHPRI1_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI1_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI2 */
-+#define MCF_EDMA_DCHPRI2_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI2_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI3 */
-+#define MCF_EDMA_DCHPRI3_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI3_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI4 */
-+#define MCF_EDMA_DCHPRI4_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI4_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI5 */
-+#define MCF_EDMA_DCHPRI5_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI5_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI6 */
-+#define MCF_EDMA_DCHPRI6_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI6_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI7 */
-+#define MCF_EDMA_DCHPRI7_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI7_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI8 */
-+#define MCF_EDMA_DCHPRI8_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI8_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI9 */
-+#define MCF_EDMA_DCHPRI9_CHPRI(x)   (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI9_ECP        (0x80)
-+
-+/* Bit definitions and macros for DCHPRI10 */
-+#define MCF_EDMA_DCHPRI10_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI10_ECP           (0x80)
-+
-+/* Bit definitions and macros for DCHPRI11 */
-+#define MCF_EDMA_DCHPRI11_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI11_ECP           (0x80)
-+
-+/* Bit definitions and macros for DCHPRI12 */
-+#define MCF_EDMA_DCHPRI12_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI12_ECP           (0x80)
-+
-+/* Bit definitions and macros for DCHPRI13 */
-+#define MCF_EDMA_DCHPRI13_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI13_ECP           (0x80)
-+
-+/* Bit definitions and macros for DCHPRI14 */
-+#define MCF_EDMA_DCHPRI14_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI14_ECP           (0x80)
-+
-+/* Bit definitions and macros for DCHPRI15 */
-+#define MCF_EDMA_DCHPRI15_CHPRI(x)      (((x)&0x0F))
-+#define MCF_EDMA_DCHPRI15_ECP           (0x80)
-+
-+/* Bit definitions and macros for TCD_SADDR group */
-+#define MCF_EDMA_TCD_SADDR_SADDR(x)     (x)
-+
-+/* Bit definitions and macros for TCD0_SADDR */
-+#define MCF_EDMA_TCD0_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD_ATTR group */
-+#define MCF_EDMA_TCD_ATTR_DSIZE(x)          (((x)&0x0007))
-+#define MCF_EDMA_TCD_ATTR_DMOD(x)           (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD_ATTR_SSIZE(x)          (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD_ATTR_SMOD(x)           (((x)&0x001F)<<11)
-+#define MCF_EDMA_TCD_ATTR_SSIZE_8BIT        (0x0000)
-+#define MCF_EDMA_TCD_ATTR_SSIZE_16BIT       (0x0100)
-+#define MCF_EDMA_TCD_ATTR_SSIZE_32BIT       (0x0200)
-+#define MCF_EDMA_TCD_ATTR_SSIZE_16BYTE      (0x0400)
-+#define MCF_EDMA_TCD_ATTR_DSIZE_8BIT        (0x0000)
-+#define MCF_EDMA_TCD_ATTR_DSIZE_16BIT       (0x0001)
-+#define MCF_EDMA_TCD_ATTR_DSIZE_32BIT       (0x0002)
-+#define MCF_EDMA_TCD_ATTR_DSIZE_16BYTE      (0x0004)
-+
-+/* Bit definitions and macros for TCD0_ATTR */
-+#define MCF_EDMA_TCD0_ATTR_DSIZE(x)         (((x)&0x0007))
-+#define MCF_EDMA_TCD0_ATTR_DMOD(x)          (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD0_ATTR_SSIZE(x)         (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD0_ATTR_SMOD(x)          (((x)&0x001F)<<11)
-+#define MCF_EDMA_TCD0_ATTR_SSIZE_8BIT       (0x0000)
-+#define MCF_EDMA_TCD0_ATTR_SSIZE_16BIT      (0x0100)
-+#define MCF_EDMA_TCD0_ATTR_SSIZE_32BIT      (0x0200)
-+#define MCF_EDMA_TCD0_ATTR_SSIZE_16BYTE     (0x0400)
-+#define MCF_EDMA_TCD0_ATTR_DSIZE_8BIT       (0x0000)
-+#define MCF_EDMA_TCD0_ATTR_DSIZE_16BIT      (0x0001)
-+#define MCF_EDMA_TCD0_ATTR_DSIZE_32BIT      (0x0002)
-+#define MCF_EDMA_TCD0_ATTR_DSIZE_16BYTE     (0x0004)
-+
-+/* Bit definitions and macros for TCD_SOFF group */
-+#define MCF_EDMA_TCD_SOFF_SOFF(x)   (x)
-+
-+/* Bit definitions and macros for TCD0_SOFF */
-+#define MCF_EDMA_TCD0_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD_NBYTES group */
-+#define MCF_EDMA_TCD_NBYTES_NBYTES(x)   (x)
-+
-+/* Bit definitions and macros for TCD0_NBYTES */
-+#define MCF_EDMA_TCD0_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD_SLAST group */
-+#define MCF_EDMA_TCD_SLAST_SLAST(x)     (x)
-+
-+/* Bit definitions and macros for TCD0_SLAST */
-+#define MCF_EDMA_TCD0_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD_DADDR group */
-+#define MCF_EDMA_TCD_DADDR_DADDR(x)     (x)
-+
-+/* Bit definitions and macros for TCD0_DADDR */
-+#define MCF_EDMA_TCD0_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD_CITER_ELINK group */
-+#define MCF_EDMA_TCD_CITER_ELINK_CITER(x)       (((x)&0x01FF))
-+#define MCF_EDMA_TCD_CITER_ELINK_LINKCH(x)      (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD_CITER_ELINK_E_LINK         (0x8000)
-+
-+/* Bit definitions and macros for TCD0_CITER_ELINK */
-+#define MCF_EDMA_TCD0_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD0_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD0_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD_CITER group */
-+#define MCF_EDMA_TCD_CITER_CITER(x)     (((x)&0x7FFF))
-+#define MCF_EDMA_TCD_CITER_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD0_CITER */
-+#define MCF_EDMA_TCD0_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD0_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD_DOFF group */
-+#define MCF_EDMA_TCD_DOFF_DOFF(x)   (x)
-+
-+/* Bit definitions and macros for TCD0_DOFF */
-+#define MCF_EDMA_TCD0_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD_DLAST_SGA group */
-+#define MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(x)     (x)
-+
-+/* Bit definitions and macros for TCD0_DLAST_SGA */
-+#define MCF_EDMA_TCD0_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD_BITER_ELINK group */
-+#define MCF_EDMA_TCD_BITER_ELINK_BITER(x)       (((x)&0x01FF))
-+#define MCF_EDMA_TCD_BITER_ELINK_LINKCH(x)      (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD_BITER_ELINK_E_LINK         (0x8000)
-+
-+/* Bit definitions and macros for TCD0_BITER_ELINK */
-+#define MCF_EDMA_TCD0_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD0_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD0_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD_BITER group */
-+#define MCF_EDMA_TCD_BITER_BITER(x)     (((x)&0x7FFF))
-+#define MCF_EDMA_TCD_BITER_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD0_BITER */
-+#define MCF_EDMA_TCD0_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD0_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD_CSR group */
-+#define MCF_EDMA_TCD_CSR_START              (0x0001)
-+#define MCF_EDMA_TCD_CSR_INT_MAJOR          (0x0002)
-+#define MCF_EDMA_TCD_CSR_INT_HALF           (0x0004)
-+#define MCF_EDMA_TCD_CSR_D_REQ              (0x0008)
-+#define MCF_EDMA_TCD_CSR_E_SG               (0x0010)
-+#define MCF_EDMA_TCD_CSR_E_LINK             (0x0020)
-+#define MCF_EDMA_TCD_CSR_ACTIVE             (0x0040)
-+#define MCF_EDMA_TCD_CSR_DONE               (0x0080)
-+#define MCF_EDMA_TCD_CSR_LINKCH(x)          (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD_CSR_BWC(x)             (((x)&0x0003)<<14)
-+#define MCF_EDMA_TCD_CSR_BWC_NO_STALL       (0x0000)
-+#define MCF_EDMA_TCD_CSR_BWC_4CYC_STALL     (0x8000)
-+#define MCF_EDMA_TCD_CSR_BWC_8CYC_STALL     (0xC000)
-+
-+/* Bit definitions and macros for TCD0_CSR */
-+#define MCF_EDMA_TCD0_CSR_START             (0x0001)
-+#define MCF_EDMA_TCD0_CSR_INT_MAJOR         (0x0002)
-+#define MCF_EDMA_TCD0_CSR_INT_HALF          (0x0004)
-+#define MCF_EDMA_TCD0_CSR_D_REQ             (0x0008)
-+#define MCF_EDMA_TCD0_CSR_E_SG              (0x0010)
-+#define MCF_EDMA_TCD0_CSR_E_LINK            (0x0020)
-+#define MCF_EDMA_TCD0_CSR_ACTIVE            (0x0040)
-+#define MCF_EDMA_TCD0_CSR_DONE              (0x0080)
-+#define MCF_EDMA_TCD0_CSR_LINKCH(x)         (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD0_CSR_BWC(x)            (((x)&0x0003)<<14)
-+#define MCF_EDMA_TCD0_CSR_BWC_NO_STALL      (0x0000)
-+#define MCF_EDMA_TCD0_CSR_BWC_4CYC_STALL    (0x8000)
-+#define MCF_EDMA_TCD0_CSR_BWC_8CYC_STALL    (0xC000)
-+
-+/* Bit definitions and macros for TCD1_SADDR */
-+#define MCF_EDMA_TCD1_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD1_ATTR */
-+#define MCF_EDMA_TCD1_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD1_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD1_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD1_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD1_SOFF */
-+#define MCF_EDMA_TCD1_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD1_NBYTES */
-+#define MCF_EDMA_TCD1_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD1_SLAST */
-+#define MCF_EDMA_TCD1_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD1_DADDR */
-+#define MCF_EDMA_TCD1_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD1_CITER_ELINK */
-+#define MCF_EDMA_TCD1_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD1_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD1_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD1_CITER */
-+#define MCF_EDMA_TCD1_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD1_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD1_DOFF */
-+#define MCF_EDMA_TCD1_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD1_DLAST_SGA */
-+#define MCF_EDMA_TCD1_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD1_BITER */
-+#define MCF_EDMA_TCD1_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD1_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD1_BITER_ELINK */
-+#define MCF_EDMA_TCD1_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD1_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD1_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD1_CSR */
-+#define MCF_EDMA_TCD1_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD1_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD1_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD1_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD1_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD1_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD1_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD1_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD1_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD1_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD2_SADDR */
-+#define MCF_EDMA_TCD2_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD2_ATTR */
-+#define MCF_EDMA_TCD2_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD2_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD2_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD2_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD2_SOFF */
-+#define MCF_EDMA_TCD2_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD2_NBYTES */
-+#define MCF_EDMA_TCD2_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD2_SLAST */
-+#define MCF_EDMA_TCD2_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD2_DADDR */
-+#define MCF_EDMA_TCD2_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD2_CITER */
-+#define MCF_EDMA_TCD2_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD2_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD2_CITER_ELINK */
-+#define MCF_EDMA_TCD2_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD2_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD2_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD2_DOFF */
-+#define MCF_EDMA_TCD2_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD2_DLAST_SGA */
-+#define MCF_EDMA_TCD2_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD2_BITER_ELINK */
-+#define MCF_EDMA_TCD2_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD2_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD2_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD2_BITER */
-+#define MCF_EDMA_TCD2_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD2_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD2_CSR */
-+#define MCF_EDMA_TCD2_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD2_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD2_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD2_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD2_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD2_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD2_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD2_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD2_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD2_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD3_SADDR */
-+#define MCF_EDMA_TCD3_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD3_ATTR */
-+#define MCF_EDMA_TCD3_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD3_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD3_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD3_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD3_SOFF */
-+#define MCF_EDMA_TCD3_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD3_NBYTES */
-+#define MCF_EDMA_TCD3_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD3_SLAST */
-+#define MCF_EDMA_TCD3_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD3_DADDR */
-+#define MCF_EDMA_TCD3_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD3_CITER */
-+#define MCF_EDMA_TCD3_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD3_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD3_CITER_ELINK */
-+#define MCF_EDMA_TCD3_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD3_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD3_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD3_DOFF */
-+#define MCF_EDMA_TCD3_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD3_DLAST_SGA */
-+#define MCF_EDMA_TCD3_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD3_BITER_ELINK */
-+#define MCF_EDMA_TCD3_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD3_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD3_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD3_BITER */
-+#define MCF_EDMA_TCD3_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD3_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD3_CSR */
-+#define MCF_EDMA_TCD3_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD3_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD3_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD3_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD3_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD3_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD3_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD3_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD3_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD3_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD4_SADDR */
-+#define MCF_EDMA_TCD4_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD4_ATTR */
-+#define MCF_EDMA_TCD4_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD4_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD4_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD4_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD4_SOFF */
-+#define MCF_EDMA_TCD4_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD4_NBYTES */
-+#define MCF_EDMA_TCD4_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD4_SLAST */
-+#define MCF_EDMA_TCD4_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD4_DADDR */
-+#define MCF_EDMA_TCD4_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD4_CITER */
-+#define MCF_EDMA_TCD4_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD4_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD4_CITER_ELINK */
-+#define MCF_EDMA_TCD4_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD4_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD4_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD4_DOFF */
-+#define MCF_EDMA_TCD4_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD4_DLAST_SGA */
-+#define MCF_EDMA_TCD4_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD4_BITER */
-+#define MCF_EDMA_TCD4_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD4_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD4_BITER_ELINK */
-+#define MCF_EDMA_TCD4_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD4_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD4_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD4_CSR */
-+#define MCF_EDMA_TCD4_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD4_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD4_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD4_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD4_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD4_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD4_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD4_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD4_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD4_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD5_SADDR */
-+#define MCF_EDMA_TCD5_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD5_ATTR */
-+#define MCF_EDMA_TCD5_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD5_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD5_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD5_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD5_SOFF */
-+#define MCF_EDMA_TCD5_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD5_NBYTES */
-+#define MCF_EDMA_TCD5_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD5_SLAST */
-+#define MCF_EDMA_TCD5_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD5_DADDR */
-+#define MCF_EDMA_TCD5_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD5_CITER */
-+#define MCF_EDMA_TCD5_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD5_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD5_CITER_ELINK */
-+#define MCF_EDMA_TCD5_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD5_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD5_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD5_DOFF */
-+#define MCF_EDMA_TCD5_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD5_DLAST_SGA */
-+#define MCF_EDMA_TCD5_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD5_BITER_ELINK */
-+#define MCF_EDMA_TCD5_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD5_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD5_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD5_BITER */
-+#define MCF_EDMA_TCD5_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD5_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD5_CSR */
-+#define MCF_EDMA_TCD5_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD5_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD5_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD5_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD5_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD5_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD5_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD5_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD5_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD5_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD6_SADDR */
-+#define MCF_EDMA_TCD6_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD6_ATTR */
-+#define MCF_EDMA_TCD6_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD6_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD6_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD6_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD6_SOFF */
-+#define MCF_EDMA_TCD6_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD6_NBYTES */
-+#define MCF_EDMA_TCD6_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD6_SLAST */
-+#define MCF_EDMA_TCD6_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD6_DADDR */
-+#define MCF_EDMA_TCD6_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD6_CITER */
-+#define MCF_EDMA_TCD6_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD6_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD6_CITER_ELINK */
-+#define MCF_EDMA_TCD6_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD6_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD6_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD6_DOFF */
-+#define MCF_EDMA_TCD6_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD6_DLAST_SGA */
-+#define MCF_EDMA_TCD6_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD6_BITER_ELINK */
-+#define MCF_EDMA_TCD6_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD6_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD6_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD6_BITER */
-+#define MCF_EDMA_TCD6_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD6_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD6_CSR */
-+#define MCF_EDMA_TCD6_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD6_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD6_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD6_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD6_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD6_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD6_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD6_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD6_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD6_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD7_SADDR */
-+#define MCF_EDMA_TCD7_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD7_ATTR */
-+#define MCF_EDMA_TCD7_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD7_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD7_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD7_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD7_SOFF */
-+#define MCF_EDMA_TCD7_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD7_NBYTES */
-+#define MCF_EDMA_TCD7_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD7_SLAST */
-+#define MCF_EDMA_TCD7_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD7_DADDR */
-+#define MCF_EDMA_TCD7_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD7_CITER */
-+#define MCF_EDMA_TCD7_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD7_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD7_CITER_ELINK */
-+#define MCF_EDMA_TCD7_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD7_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD7_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD7_DOFF */
-+#define MCF_EDMA_TCD7_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD7_DLAST_SGA */
-+#define MCF_EDMA_TCD7_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD7_BITER_ELINK */
-+#define MCF_EDMA_TCD7_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD7_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD7_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD7_BITER */
-+#define MCF_EDMA_TCD7_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD7_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD7_CSR */
-+#define MCF_EDMA_TCD7_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD7_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD7_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD7_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD7_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD7_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD7_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD7_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD7_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD7_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD8_SADDR */
-+#define MCF_EDMA_TCD8_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD8_ATTR */
-+#define MCF_EDMA_TCD8_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD8_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD8_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD8_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD8_SOFF */
-+#define MCF_EDMA_TCD8_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD8_NBYTES */
-+#define MCF_EDMA_TCD8_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD8_SLAST */
-+#define MCF_EDMA_TCD8_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD8_DADDR */
-+#define MCF_EDMA_TCD8_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD8_CITER */
-+#define MCF_EDMA_TCD8_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD8_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD8_CITER_ELINK */
-+#define MCF_EDMA_TCD8_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD8_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD8_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD8_DOFF */
-+#define MCF_EDMA_TCD8_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD8_DLAST_SGA */
-+#define MCF_EDMA_TCD8_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD8_BITER_ELINK */
-+#define MCF_EDMA_TCD8_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD8_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD8_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD8_BITER */
-+#define MCF_EDMA_TCD8_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD8_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD8_CSR */
-+#define MCF_EDMA_TCD8_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD8_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD8_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD8_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD8_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD8_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD8_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD8_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD8_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD8_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD9_SADDR */
-+#define MCF_EDMA_TCD9_SADDR_SADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD9_ATTR */
-+#define MCF_EDMA_TCD9_ATTR_DSIZE(x)     (((x)&0x0007))
-+#define MCF_EDMA_TCD9_ATTR_DMOD(x)      (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD9_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD9_ATTR_SMOD(x)      (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD9_SOFF */
-+#define MCF_EDMA_TCD9_SOFF_SOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD9_NBYTES */
-+#define MCF_EDMA_TCD9_NBYTES_NBYTES(x)      (x)
-+
-+/* Bit definitions and macros for TCD9_SLAST */
-+#define MCF_EDMA_TCD9_SLAST_SLAST(x)    (x)
-+
-+/* Bit definitions and macros for TCD9_DADDR */
-+#define MCF_EDMA_TCD9_DADDR_DADDR(x)    (x)
-+
-+/* Bit definitions and macros for TCD9_CITER_ELINK */
-+#define MCF_EDMA_TCD9_CITER_ELINK_CITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD9_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD9_CITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD9_CITER */
-+#define MCF_EDMA_TCD9_CITER_CITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD9_CITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD9_DOFF */
-+#define MCF_EDMA_TCD9_DOFF_DOFF(x)      (x)
-+
-+/* Bit definitions and macros for TCD9_DLAST_SGA */
-+#define MCF_EDMA_TCD9_DLAST_SGA_DLAST_SGA(x)    (x)
-+
-+/* Bit definitions and macros for TCD9_BITER_ELINK */
-+#define MCF_EDMA_TCD9_BITER_ELINK_BITER(x)      (((x)&0x01FF))
-+#define MCF_EDMA_TCD9_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD9_BITER_ELINK_E_LINK        (0x8000)
-+
-+/* Bit definitions and macros for TCD9_BITER */
-+#define MCF_EDMA_TCD9_BITER_BITER(x)    (((x)&0x7FFF))
-+#define MCF_EDMA_TCD9_BITER_E_LINK      (0x8000)
-+
-+/* Bit definitions and macros for TCD9_CSR */
-+#define MCF_EDMA_TCD9_CSR_START         (0x0001)
-+#define MCF_EDMA_TCD9_CSR_INT_MAJOR     (0x0002)
-+#define MCF_EDMA_TCD9_CSR_INT_HALF      (0x0004)
-+#define MCF_EDMA_TCD9_CSR_D_REQ         (0x0008)
-+#define MCF_EDMA_TCD9_CSR_E_SG          (0x0010)
-+#define MCF_EDMA_TCD9_CSR_E_LINK        (0x0020)
-+#define MCF_EDMA_TCD9_CSR_ACTIVE        (0x0040)
-+#define MCF_EDMA_TCD9_CSR_DONE          (0x0080)
-+#define MCF_EDMA_TCD9_CSR_LINKCH(x)     (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD9_CSR_BWC(x)        (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD10_SADDR */
-+#define MCF_EDMA_TCD10_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD10_ATTR */
-+#define MCF_EDMA_TCD10_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD10_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD10_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD10_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD10_SOFF */
-+#define MCF_EDMA_TCD10_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD10_NBYTES */
-+#define MCF_EDMA_TCD10_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD10_SLAST */
-+#define MCF_EDMA_TCD10_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD10_DADDR */
-+#define MCF_EDMA_TCD10_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD10_CITER_ELINK */
-+#define MCF_EDMA_TCD10_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD10_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD10_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD10_CITER */
-+#define MCF_EDMA_TCD10_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD10_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD10_DOFF */
-+#define MCF_EDMA_TCD10_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD10_DLAST_SGA */
-+#define MCF_EDMA_TCD10_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD10_BITER */
-+#define MCF_EDMA_TCD10_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD10_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD10_BITER_ELINK */
-+#define MCF_EDMA_TCD10_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD10_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD10_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD10_CSR */
-+#define MCF_EDMA_TCD10_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD10_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD10_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD10_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD10_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD10_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD10_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD10_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD10_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD10_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD11_SADDR */
-+#define MCF_EDMA_TCD11_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD11_ATTR */
-+#define MCF_EDMA_TCD11_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD11_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD11_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD11_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD11_SOFF */
-+#define MCF_EDMA_TCD11_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD11_NBYTES */
-+#define MCF_EDMA_TCD11_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD11_SLAST */
-+#define MCF_EDMA_TCD11_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD11_DADDR */
-+#define MCF_EDMA_TCD11_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD11_CITER */
-+#define MCF_EDMA_TCD11_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD11_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD11_CITER_ELINK */
-+#define MCF_EDMA_TCD11_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD11_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD11_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD11_DOFF */
-+#define MCF_EDMA_TCD11_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD11_DLAST_SGA */
-+#define MCF_EDMA_TCD11_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD11_BITER */
-+#define MCF_EDMA_TCD11_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD11_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD11_BITER_ELINK */
-+#define MCF_EDMA_TCD11_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD11_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD11_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD11_CSR */
-+#define MCF_EDMA_TCD11_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD11_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD11_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD11_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD11_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD11_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD11_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD11_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD11_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD11_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD12_SADDR */
-+#define MCF_EDMA_TCD12_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD12_ATTR */
-+#define MCF_EDMA_TCD12_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD12_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD12_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD12_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD12_SOFF */
-+#define MCF_EDMA_TCD12_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD12_NBYTES */
-+#define MCF_EDMA_TCD12_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD12_SLAST */
-+#define MCF_EDMA_TCD12_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD12_DADDR */
-+#define MCF_EDMA_TCD12_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD12_CITER */
-+#define MCF_EDMA_TCD12_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD12_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD12_CITER_ELINK */
-+#define MCF_EDMA_TCD12_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD12_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD12_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD12_DOFF */
-+#define MCF_EDMA_TCD12_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD12_DLAST_SGA */
-+#define MCF_EDMA_TCD12_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD12_BITER */
-+#define MCF_EDMA_TCD12_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD12_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD12_BITER_ELINK */
-+#define MCF_EDMA_TCD12_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD12_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD12_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD12_CSR */
-+#define MCF_EDMA_TCD12_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD12_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD12_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD12_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD12_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD12_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD12_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD12_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD12_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD12_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD13_SADDR */
-+#define MCF_EDMA_TCD13_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD13_ATTR */
-+#define MCF_EDMA_TCD13_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD13_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD13_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD13_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD13_SOFF */
-+#define MCF_EDMA_TCD13_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD13_NBYTES */
-+#define MCF_EDMA_TCD13_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD13_SLAST */
-+#define MCF_EDMA_TCD13_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD13_DADDR */
-+#define MCF_EDMA_TCD13_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD13_CITER_ELINK */
-+#define MCF_EDMA_TCD13_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD13_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD13_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD13_CITER */
-+#define MCF_EDMA_TCD13_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD13_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD13_DOFF */
-+#define MCF_EDMA_TCD13_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD13_DLAST_SGA */
-+#define MCF_EDMA_TCD13_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD13_BITER_ELINK */
-+#define MCF_EDMA_TCD13_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD13_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD13_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD13_BITER */
-+#define MCF_EDMA_TCD13_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD13_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD13_CSR */
-+#define MCF_EDMA_TCD13_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD13_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD13_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD13_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD13_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD13_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD13_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD13_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD13_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD13_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD14_SADDR */
-+#define MCF_EDMA_TCD14_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD14_ATTR */
-+#define MCF_EDMA_TCD14_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD14_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD14_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD14_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD14_SOFF */
-+#define MCF_EDMA_TCD14_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD14_NBYTES */
-+#define MCF_EDMA_TCD14_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD14_SLAST */
-+#define MCF_EDMA_TCD14_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD14_DADDR */
-+#define MCF_EDMA_TCD14_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD14_CITER */
-+#define MCF_EDMA_TCD14_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD14_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD14_CITER_ELINK */
-+#define MCF_EDMA_TCD14_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD14_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD14_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD14_DOFF */
-+#define MCF_EDMA_TCD14_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD14_DLAST_SGA */
-+#define MCF_EDMA_TCD14_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD14_BITER_ELINK */
-+#define MCF_EDMA_TCD14_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD14_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD14_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD14_BITER */
-+#define MCF_EDMA_TCD14_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD14_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD14_CSR */
-+#define MCF_EDMA_TCD14_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD14_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD14_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD14_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD14_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD14_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD14_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD14_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD14_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD14_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+/* Bit definitions and macros for TCD15_SADDR */
-+#define MCF_EDMA_TCD15_SADDR_SADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD15_ATTR */
-+#define MCF_EDMA_TCD15_ATTR_DSIZE(x)    (((x)&0x0007))
-+#define MCF_EDMA_TCD15_ATTR_DMOD(x)     (((x)&0x001F)<<3)
-+#define MCF_EDMA_TCD15_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
-+#define MCF_EDMA_TCD15_ATTR_SMOD(x)     (((x)&0x001F)<<11)
-+
-+/* Bit definitions and macros for TCD15_SOFF */
-+#define MCF_EDMA_TCD15_SOFF_SOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD15_NBYTES */
-+#define MCF_EDMA_TCD15_NBYTES_NBYTES(x)     (x)
-+
-+/* Bit definitions and macros for TCD15_SLAST */
-+#define MCF_EDMA_TCD15_SLAST_SLAST(x)   (x)
-+
-+/* Bit definitions and macros for TCD15_DADDR */
-+#define MCF_EDMA_TCD15_DADDR_DADDR(x)   (x)
-+
-+/* Bit definitions and macros for TCD15_CITER_ELINK */
-+#define MCF_EDMA_TCD15_CITER_ELINK_CITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD15_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD15_CITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD15_CITER */
-+#define MCF_EDMA_TCD15_CITER_CITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD15_CITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD15_DOFF */
-+#define MCF_EDMA_TCD15_DOFF_DOFF(x)     (x)
-+
-+/* Bit definitions and macros for TCD15_DLAST_SGA */
-+#define MCF_EDMA_TCD15_DLAST_SGA_DLAST_SGA(x)   (x)
-+
-+/* Bit definitions and macros for TCD15_BITER */
-+#define MCF_EDMA_TCD15_BITER_BITER(x)   (((x)&0x7FFF))
-+#define MCF_EDMA_TCD15_BITER_E_LINK     (0x8000)
-+
-+/* Bit definitions and macros for TCD15_BITER_ELINK */
-+#define MCF_EDMA_TCD15_BITER_ELINK_BITER(x)     (((x)&0x01FF))
-+#define MCF_EDMA_TCD15_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
-+#define MCF_EDMA_TCD15_BITER_ELINK_E_LINK       (0x8000)
-+
-+/* Bit definitions and macros for TCD15_CSR */
-+#define MCF_EDMA_TCD15_CSR_START        (0x0001)
-+#define MCF_EDMA_TCD15_CSR_INT_MAJOR    (0x0002)
-+#define MCF_EDMA_TCD15_CSR_INT_HALF     (0x0004)
-+#define MCF_EDMA_TCD15_CSR_D_REQ        (0x0008)
-+#define MCF_EDMA_TCD15_CSR_E_SG         (0x0010)
-+#define MCF_EDMA_TCD15_CSR_E_LINK       (0x0020)
-+#define MCF_EDMA_TCD15_CSR_ACTIVE       (0x0040)
-+#define MCF_EDMA_TCD15_CSR_DONE         (0x0080)
-+#define MCF_EDMA_TCD15_CSR_LINKCH(x)    (((x)&0x003F)<<8)
-+#define MCF_EDMA_TCD15_CSR_BWC(x)       (((x)&0x0003)<<14)
-+
-+#endif /* __MCF5445X_EDMA_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_eport.h
-@@ -0,0 +1,117 @@
-+/*
-+ * Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_EPORT_H__
-+#define __MCF5445X_EPORT_H__
-+
-+/*********************************************************************
-+*
-+* Edge Port Module (EPORT)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_EPORT_EPPAR         MCF_REG16(0xFC094000)
-+#define MCF_EPORT_EPDDR         MCF_REG08(0xFC094002)
-+#define MCF_EPORT_EPIER         MCF_REG08(0xFC094003)
-+#define MCF_EPORT_EPDR          MCF_REG08(0xFC094004)
-+#define MCF_EPORT_EPPDR         MCF_REG08(0xFC094005)
-+#define MCF_EPORT_EPFR          MCF_REG08(0xFC094006)
-+
-+/* Bit definitions and macros for EPPAR */
-+#define MCF_EPORT_EPPAR_EPPA1(x)        (((x)&0x0003)<<2)
-+#define MCF_EPORT_EPPAR_EPPA2(x)        (((x)&0x0003)<<4)
-+#define MCF_EPORT_EPPAR_EPPA3(x)        (((x)&0x0003)<<6)
-+#define MCF_EPORT_EPPAR_EPPA4(x)        (((x)&0x0003)<<8)
-+#define MCF_EPORT_EPPAR_EPPA5(x)        (((x)&0x0003)<<10)
-+#define MCF_EPORT_EPPAR_EPPA6(x)        (((x)&0x0003)<<12)
-+#define MCF_EPORT_EPPAR_EPPA7(x)        (((x)&0x0003)<<14)
-+#define MCF_EPORT_EPPAR_LEVEL           (0)
-+#define MCF_EPORT_EPPAR_RISING          (1)
-+#define MCF_EPORT_EPPAR_FALLING         (2)
-+#define MCF_EPORT_EPPAR_BOTH            (3)
-+#define MCF_EPORT_EPPAR_EPPA7_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA7_RISING    (0x4000)
-+#define MCF_EPORT_EPPAR_EPPA7_FALLING   (0x8000)
-+#define MCF_EPORT_EPPAR_EPPA7_BOTH      (0xC000)
-+#define MCF_EPORT_EPPAR_EPPA6_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA6_RISING    (0x1000)
-+#define MCF_EPORT_EPPAR_EPPA6_FALLING   (0x2000)
-+#define MCF_EPORT_EPPAR_EPPA6_BOTH      (0x3000)
-+#define MCF_EPORT_EPPAR_EPPA5_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA5_RISING    (0x0400)
-+#define MCF_EPORT_EPPAR_EPPA5_FALLING   (0x0800)
-+#define MCF_EPORT_EPPAR_EPPA5_BOTH      (0x0C00)
-+#define MCF_EPORT_EPPAR_EPPA4_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA4_RISING    (0x0100)
-+#define MCF_EPORT_EPPAR_EPPA4_FALLING   (0x0200)
-+#define MCF_EPORT_EPPAR_EPPA4_BOTH      (0x0300)
-+#define MCF_EPORT_EPPAR_EPPA3_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA3_RISING    (0x0040)
-+#define MCF_EPORT_EPPAR_EPPA3_FALLING   (0x0080)
-+#define MCF_EPORT_EPPAR_EPPA3_BOTH      (0x00C0)
-+#define MCF_EPORT_EPPAR_EPPA2_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA2_RISING    (0x0010)
-+#define MCF_EPORT_EPPAR_EPPA2_FALLING   (0x0020)
-+#define MCF_EPORT_EPPAR_EPPA2_BOTH      (0x0030)
-+#define MCF_EPORT_EPPAR_EPPA1_LEVEL     (0x0000)
-+#define MCF_EPORT_EPPAR_EPPA1_RISING    (0x0004)
-+#define MCF_EPORT_EPPAR_EPPA1_FALLING   (0x0008)
-+#define MCF_EPORT_EPPAR_EPPA1_BOTH      (0x000C)
-+
-+/* Bit definitions and macros for EPDDR */
-+#define MCF_EPORT_EPDDR_EPDD1   (0x02)
-+#define MCF_EPORT_EPDDR_EPDD2   (0x04)
-+#define MCF_EPORT_EPDDR_EPDD3   (0x08)
-+#define MCF_EPORT_EPDDR_EPDD4   (0x10)
-+#define MCF_EPORT_EPDDR_EPDD5   (0x20)
-+#define MCF_EPORT_EPDDR_EPDD6   (0x40)
-+#define MCF_EPORT_EPDDR_EPDD7   (0x80)
-+
-+/* Bit definitions and macros for EPIER */
-+#define MCF_EPORT_EPIER_EPIE1   (0x02)
-+#define MCF_EPORT_EPIER_EPIE2   (0x04)
-+#define MCF_EPORT_EPIER_EPIE3   (0x08)
-+#define MCF_EPORT_EPIER_EPIE4   (0x10)
-+#define MCF_EPORT_EPIER_EPIE5   (0x20)
-+#define MCF_EPORT_EPIER_EPIE6   (0x40)
-+#define MCF_EPORT_EPIER_EPIE7   (0x80)
-+
-+/* Bit definitions and macros for EPDR */
-+#define MCF_EPORT_EPDR_EPD1     (0x02)
-+#define MCF_EPORT_EPDR_EPD2     (0x04)
-+#define MCF_EPORT_EPDR_EPD3     (0x08)
-+#define MCF_EPORT_EPDR_EPD4     (0x10)
-+#define MCF_EPORT_EPDR_EPD5     (0x20)
-+#define MCF_EPORT_EPDR_EPD6     (0x40)
-+#define MCF_EPORT_EPDR_EPD7     (0x80)
-+
-+/* Bit definitions and macros for EPPDR */
-+#define MCF_EPORT_EPPDR_EPPD1   (0x02)
-+#define MCF_EPORT_EPPDR_EPPD2   (0x04)
-+#define MCF_EPORT_EPPDR_EPPD3   (0x08)
-+#define MCF_EPORT_EPPDR_EPPD4   (0x10)
-+#define MCF_EPORT_EPPDR_EPPD5   (0x20)
-+#define MCF_EPORT_EPPDR_EPPD6   (0x40)
-+#define MCF_EPORT_EPPDR_EPPD7   (0x80)
-+
-+/* Bit definitions and macros for EPFR */
-+#define MCF_EPORT_EPFR_EPF1     (0x02)
-+#define MCF_EPORT_EPFR_EPF2     (0x04)
-+#define MCF_EPORT_EPFR_EPF3     (0x08)
-+#define MCF_EPORT_EPFR_EPF4     (0x10)
-+#define MCF_EPORT_EPFR_EPF5     (0x20)
-+#define MCF_EPORT_EPFR_EPF6     (0x40)
-+#define MCF_EPORT_EPFR_EPF7     (0x80)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_EPORT_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_fbcs.h
-@@ -0,0 +1,182 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_FBCS_H__
-+#define __MCF5445X_FBCS_H__
-+
-+/*********************************************************************
-+*
-+* FlexBus Chip Selects (FBCS)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_FBCS_CSAR0        MCF_REG32(0xFC008000)   /* Chip-select Addr Register */
-+#define MCF_FBCS_CSMR0        MCF_REG32(0xFC008004)   /* Chip-select Mask Register */
-+#define MCF_FBCS_CSCR0        MCF_REG32(0xFC008008)   /* Chip-select Cntl Register */
-+#define MCF_FBCS_CSAR1        MCF_REG32(0xFC00800C)   /* Chip-select Addr Register */
-+#define MCF_FBCS_CSMR1        MCF_REG32(0xFC008010)   /* Chip-select Mask Register */
-+#define MCF_FBCS_CSCR1        MCF_REG32(0xFC008014)   /* Chip-select Cntl Register */
-+#define MCF_FBCS_CSAR2        MCF_REG32(0xFC008018)   /* Chip-select Addr Register */
-+#define MCF_FBCS_CSMR2        MCF_REG32(0xFC00801C)   /* Chip-select Mask Register */
-+#define MCF_FBCS_CSCR2        MCF_REG32(0xFC008020)   /* Chip-select Cntl Register */
-+#define MCF_FBCS_CSAR3        MCF_REG32(0xFC008024)   /* Chip-select Addr Register */
-+#define MCF_FBCS_CSMR3        MCF_REG32(0xFC008028)   /* Chip-select Mask Register */
-+#define MCF_FBCS_CSCR3        MCF_REG32(0xFC00802C)   /* Chip-select Cntl Register */
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_FBCS_CSAR(x)      MCF_REG32(0xFC008000+((x)*0x00C))   /* Chip-select Addr Register */
-+#define MCF_FBCS_CSMR(x)      MCF_REG32(0xFC008004+((x)*0x00C))   /* Chip-select Mask Register */
-+#define MCF_FBCS_CSCR(x)      MCF_REG32(0xFC008008+((x)*0x00C))   /* Chip-select Cntl Register */
-+
-+/* Bit definitions and macros for CSAR group */
-+#define MCF_FBCS_CSAR_BA(x)     ((x)&0xFFFF0000)
-+
-+/* Bit definitions and macros for CSAR0 */
-+#define MCF_FBCS_CSAR0_BA(x)    ((x)&0xFFFF0000)
-+
-+/* Bit definitions and macros for CSMR group */
-+#define MCF_FBCS_CSMR_V             (0x00000001)            /* Valid bit */
-+#define MCF_FBCS_CSMR_WP            (0x00000100)            /* Write protect */
-+#define MCF_FBCS_CSMR_BAM(x)        (((x)&0x0000FFFF)<<16)  /* Base addr mask */
-+#define MCF_FBCS_CSMR_BAM_4G        (0xFFFF0000)
-+#define MCF_FBCS_CSMR_BAM_2G        (0x7FFF0000)
-+#define MCF_FBCS_CSMR_BAM_1G        (0x3FFF0000)
-+#define MCF_FBCS_CSMR_BAM_1024M     (0x3FFF0000)
-+#define MCF_FBCS_CSMR_BAM_512M      (0x1FFF0000)
-+#define MCF_FBCS_CSMR_BAM_256M      (0x0FFF0000)
-+#define MCF_FBCS_CSMR_BAM_128M      (0x07FF0000)
-+#define MCF_FBCS_CSMR_BAM_64M       (0x03FF0000)
-+#define MCF_FBCS_CSMR_BAM_32M       (0x01FF0000)
-+#define MCF_FBCS_CSMR_BAM_16M       (0x00FF0000)
-+#define MCF_FBCS_CSMR_BAM_8M        (0x007F0000)
-+#define MCF_FBCS_CSMR_BAM_4M        (0x003F0000)
-+#define MCF_FBCS_CSMR_BAM_2M        (0x001F0000)
-+#define MCF_FBCS_CSMR_BAM_1M        (0x000F0000)
-+#define MCF_FBCS_CSMR_BAM_1024K     (0x000F0000)
-+#define MCF_FBCS_CSMR_BAM_512K      (0x00070000)
-+#define MCF_FBCS_CSMR_BAM_256K      (0x00030000)
-+#define MCF_FBCS_CSMR_BAM_128K      (0x00010000)
-+#define MCF_FBCS_CSMR_BAM_64K       (0x00000000)
-+
-+/* Bit definitions and macros for CSMR0 */
-+#define MCF_FBCS_CSMR0_V            (0x00000001)            /* Valid bit */
-+#define MCF_FBCS_CSMR0_WP           (0x00000100)            /* Write protect */
-+#define MCF_FBCS_CSMR0_BAM(x)       (((x)&0x0000FFFF)<<16)  /* Base addr mask */
-+#define MCF_FBCS_CSMR0_BAM_4G       (0xFFFF0000)
-+#define MCF_FBCS_CSMR0_BAM_2G       (0x7FFF0000)
-+#define MCF_FBCS_CSMR0_BAM_1G       (0x3FFF0000)
-+#define MCF_FBCS_CSMR0_BAM_1024M    (0x3FFF0000)
-+#define MCF_FBCS_CSMR0_BAM_512M     (0x1FFF0000)
-+#define MCF_FBCS_CSMR0_BAM_256M     (0x0FFF0000)
-+#define MCF_FBCS_CSMR0_BAM_128M     (0x07FF0000)
-+#define MCF_FBCS_CSMR0_BAM_64M      (0x03FF0000)
-+#define MCF_FBCS_CSMR0_BAM_32M      (0x01FF0000)
-+#define MCF_FBCS_CSMR0_BAM_16M      (0x00FF0000)
-+#define MCF_FBCS_CSMR0_BAM_8M       (0x007F0000)
-+#define MCF_FBCS_CSMR0_BAM_4M       (0x003F0000)
-+#define MCF_FBCS_CSMR0_BAM_2M       (0x001F0000)
-+#define MCF_FBCS_CSMR0_BAM_1M       (0x000F0000)
-+#define MCF_FBCS_CSMR0_BAM_1024K    (0x000F0000)
-+#define MCF_FBCS_CSMR0_BAM_512K     (0x00070000)
-+#define MCF_FBCS_CSMR0_BAM_256K     (0x00030000)
-+#define MCF_FBCS_CSMR0_BAM_128K     (0x00010000)
-+#define MCF_FBCS_CSMR0_BAM_64K      (0x00000000)
-+
-+/* Bit definitions and macros for CSCR group */
-+#define MCF_FBCS_CSCR_BSTW      (0x00000008)            /* Burst-write enable */
-+#define MCF_FBCS_CSCR_BSTR      (0x00000010)            /* Burst-read enable */
-+#define MCF_FBCS_CSCR_BEM       (0x00000020)            /* Byte-enable mode */
-+#define MCF_FBCS_CSCR_PS(x)     (((x)&0x00000003)<<6)   /* Port size */
-+#define MCF_FBCS_CSCR_AA        (0x00000100)            /* Auto-acknowledge */
-+#define MCF_FBCS_CSCR_WS(x)     (((x)&0x0000003F)<<10)  /* Wait states */
-+#define MCF_FBCS_CSCR_WRAH(x)   (((x)&0x00000003)<<16)  /* Write address hold or deselect */
-+#define MCF_FBCS_CSCR_RDAH(x)   (((x)&0x00000003)<<18)  /* Read address hold or deselect */
-+#define MCF_FBCS_CSCR_ASET(x)   (((x)&0x00000003)<<20)  /* Address setup */
-+#define MCF_FBCS_CSCR_SWSEN     (0x00800000)            /* Secondary wait state enable */
-+#define MCF_FBCS_CSCR_SWS(x)    (((x)&0x0000003F)<<26)  /* Secondary wait states */
-+#define MCF_FBCS_CSCR_PS_8      (0x00000040)
-+#define MCF_FBCS_CSCR_PS_16     (0x00000080)
-+#define MCF_FBCS_CSCR_PS_32     (0x00000000)
-+
-+/* Bit definitions and macros for CSCR0 */
-+#define MCF_FBCS_CSCR0_BSTW   (0x00000008)            /* Burst-write enable */
-+#define MCF_FBCS_CSCR0_BSTR   (0x00000010)            /* Burst-read enable */
-+#define MCF_FBCS_CSCR0_BEM    (0x00000020)            /* Byte-enable mode */
-+#define MCF_FBCS_CSCR0_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
-+#define MCF_FBCS_CSCR0_AA     (0x00000100)            /* Auto-acknowledge */
-+#define MCF_FBCS_CSCR0_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
-+#define MCF_FBCS_CSCR0_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
-+#define MCF_FBCS_CSCR0_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
-+#define MCF_FBCS_CSCR0_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
-+#define MCF_FBCS_CSCR0_SWSEN  (0x00800000)            /* Secondary wait state enable */
-+#define MCF_FBCS_CSCR0_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
-+#define MCF_FBCS_CSCR0_PS_8   (0x00000040)
-+#define MCF_FBCS_CSCR0_PS_16  (0x00000080)
-+#define MCF_FBCS_CSCR0_PS_32  (0x00000000)
-+
-+/* Bit definitions and macros for CSMR1 */
-+#define MCF_FBCS_CSMR1_V      (0x00000001)            /* Valid bit */
-+#define MCF_FBCS_CSMR1_WP     (0x00000100)            /* Write protect */
-+#define MCF_FBCS_CSMR1_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
-+
-+/* Bit definitions and macros for CSCR1 */
-+#define MCF_FBCS_CSCR1_BSTW   (0x00000008)            /* Burst-write enable */
-+#define MCF_FBCS_CSCR1_BSTR   (0x00000010)            /* Burst-read enable */
-+#define MCF_FBCS_CSCR1_BEM    (0x00000020)            /* Byte-enable mode */
-+#define MCF_FBCS_CSCR1_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
-+#define MCF_FBCS_CSCR1_AA     (0x00000100)            /* Auto-acknowledge */
-+#define MCF_FBCS_CSCR1_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
-+#define MCF_FBCS_CSCR1_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
-+#define MCF_FBCS_CSCR1_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
-+#define MCF_FBCS_CSCR1_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
-+#define MCF_FBCS_CSCR1_SWSEN  (0x00800000)            /* Secondary wait state enable */
-+#define MCF_FBCS_CSCR1_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
-+
-+/* Bit definitions and macros for CSMR2 */
-+#define MCF_FBCS_CSMR2_V      (0x00000001)            /* Valid bit */
-+#define MCF_FBCS_CSMR2_WP     (0x00000100)            /* Write protect */
-+#define MCF_FBCS_CSMR2_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
-+
-+/* Bit definitions and macros for CSCR2 */
-+#define MCF_FBCS_CSCR2_BSTW   (0x00000008)            /* Burst-write enable */
-+#define MCF_FBCS_CSCR2_BSTR   (0x00000010)            /* Burst-read enable */
-+#define MCF_FBCS_CSCR2_BEM    (0x00000020)            /* Byte-enable mode */
-+#define MCF_FBCS_CSCR2_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
-+#define MCF_FBCS_CSCR2_AA     (0x00000100)            /* Auto-acknowledge */
-+#define MCF_FBCS_CSCR2_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
-+#define MCF_FBCS_CSCR2_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
-+#define MCF_FBCS_CSCR2_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
-+#define MCF_FBCS_CSCR2_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
-+#define MCF_FBCS_CSCR2_SWSEN  (0x00800000)            /* Secondary wait state enable */
-+#define MCF_FBCS_CSCR2_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
-+
-+/* Bit definitions and macros for CSMR3 */
-+#define MCF_FBCS_CSMR3_V      (0x00000001)            /* Valid bit */
-+#define MCF_FBCS_CSMR3_WP     (0x00000100)            /* Write protect */
-+#define MCF_FBCS_CSMR3_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
-+
-+/* Bit definitions and macros for CSCR3 */
-+#define MCF_FBCS_CSCR3_BSTW   (0x00000008)            /* Burst-write enable */
-+#define MCF_FBCS_CSCR3_BSTR   (0x00000010)            /* Burst-read enable */
-+#define MCF_FBCS_CSCR3_BEM    (0x00000020)            /* Byte-enable mode */
-+#define MCF_FBCS_CSCR3_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
-+#define MCF_FBCS_CSCR3_AA     (0x00000100)            /* Auto-acknowledge */
-+#define MCF_FBCS_CSCR3_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
-+#define MCF_FBCS_CSCR3_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
-+#define MCF_FBCS_CSCR3_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
-+#define MCF_FBCS_CSCR3_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
-+#define MCF_FBCS_CSCR3_SWSEN  (0x00800000)            /* Secondary wait state enable */
-+#define MCF_FBCS_CSCR3_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_FBCS_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_gpio.h
-@@ -0,0 +1,1257 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_GPIO_H__
-+#define __MCF5445X_GPIO_H__
-+
-+/*********************************************************************
-+*
-+* General Purpose I/O Module (GPIO)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_GPIO_PODR_FEC0H   MCF_REG08(0xFC0A4000)   /* FEC0 High Port Output Data Register */
-+#define MCF_GPIO_PODR_FEC0L   MCF_REG08(0xFC0A4001)   /* FEC0 Low Port Output Data Register */
-+#define MCF_GPIO_PODR_SSI     MCF_REG08(0xFC0A4002)   /* SSI Port Output Data Register */
-+#define MCF_GPIO_PODR_FBCTL   MCF_REG08(0xFC0A4003)   /* Flexbus Control Port Output Data Register */
-+#define MCF_GPIO_PODR_BE      MCF_REG08(0xFC0A4004)   /* Flexbus Byte Enable Port Output Data Register */
-+#define MCF_GPIO_PODR_CS      MCF_REG08(0xFC0A4005)   /* Flexbus Chip-Select Port Output Data Register */
-+#define MCF_GPIO_PODR_DMA     MCF_REG08(0xFC0A4006)   /* DMA Port Output Data Register */
-+#define MCF_GPIO_PODR_FECI2C  MCF_REG08(0xFC0A4007)   /* FEC1 / I2C Port Output Data Register */
-+#define MCF_GPIO_PODR_UART    MCF_REG08(0xFC0A4009)   /* UART Port Output Data Register */
-+#define MCF_GPIO_PODR_DSPI    MCF_REG08(0xFC0A400A)   /* DSPI Port Output Data Register */
-+#define MCF_GPIO_PODR_TIMER   MCF_REG08(0xFC0A400B)   /* Timer Port Output Data Register */
-+#define MCF_GPIO_PODR_PCI     MCF_REG08(0xFC0A400C)   /* PCI Port Output Data Register */
-+#define MCF_GPIO_PODR_USB     MCF_REG08(0xFC0A400D)   /* USB Port Output Data Register */
-+#define MCF_GPIO_PODR_ATAH    MCF_REG08(0xFC0A400E)   /* ATA High Port Output Data Register */
-+#define MCF_GPIO_PODR_ATAL    MCF_REG08(0xFC0A400F)   /* ATA Low Port Output Data Register */
-+#define MCF_GPIO_PODR_FEC1H   MCF_REG08(0xFC0A4010)   /* FEC1 High Port Output Data Register */
-+#define MCF_GPIO_PODR_FEC1L   MCF_REG08(0xFC0A4011)   /* FEC1 Low Port Output Data Register */
-+#define MCF_GPIO_PODR_FBADH   MCF_REG08(0xFC0A4014)   /* Flexbus AD High Port Output Data Register */
-+#define MCF_GPIO_PODR_FBADMH  MCF_REG08(0xFC0A4015)   /* Flexbus AD Med-High Port Output Data Register */
-+#define MCF_GPIO_PODR_FBADML  MCF_REG08(0xFC0A4016)   /* Flexbus AD Med-Low Port Output Data Register */
-+#define MCF_GPIO_PODR_FBADL   MCF_REG08(0xFC0A4017)   /* Flexbus AD Low Port Output Data Register */
-+#define MCF_GPIO_PDDR_FEC0H   MCF_REG08(0xFC0A4018)   /* FEC0 High Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FEC0L   MCF_REG08(0xFC0A4019)   /* FEC0 Low Port Data Direction Register */
-+#define MCF_GPIO_PDDR_SSI     MCF_REG08(0xFC0A401A)   /* SSI Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FBCTL   MCF_REG08(0xFC0A401B)   /* Flexbus Control Port Data Direction Register */
-+#define MCF_GPIO_PDDR_BE      MCF_REG08(0xFC0A401C)   /* Flexbus Byte Enable Port Data Direction Register */
-+#define MCF_GPIO_PDDR_CS      MCF_REG08(0xFC0A401D)   /* Flexbus Chip-Select Port Data Direction Register */
-+#define MCF_GPIO_PDDR_DMA     MCF_REG08(0xFC0A401E)   /* DMA Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FECI2C  MCF_REG08(0xFC0A401F)   /* FEC1 / I2C Port Data Direction Register */
-+#define MCF_GPIO_PDDR_UART    MCF_REG08(0xFC0A4021)   /* UART Port Data Direction Register */
-+#define MCF_GPIO_PDDR_DSPI    MCF_REG08(0xFC0A4022)   /* DSPI Port Data Direction Register */
-+#define MCF_GPIO_PDDR_TIMER   MCF_REG08(0xFC0A4023)   /* Timer Port Data Direction Register */
-+#define MCF_GPIO_PDDR_PCI     MCF_REG08(0xFC0A4024)   /* PCI Port Data Direction Register */
-+#define MCF_GPIO_PDDR_USB     MCF_REG08(0xFC0A4025)   /* USB Port Data Direction Register */
-+#define MCF_GPIO_PDDR_ATAH    MCF_REG08(0xFC0A4026)   /* ATA High Port Data Direction Register */
-+#define MCF_GPIO_PDDR_ATAL    MCF_REG08(0xFC0A4027)   /* ATA Low Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FEC1H   MCF_REG08(0xFC0A4028)   /* FEC1 High Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FEC1L   MCF_REG08(0xFC0A4029)   /* FEC1 Low Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FBADH   MCF_REG08(0xFC0A402C)   /* Flexbus AD High Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FBADMH  MCF_REG08(0xFC0A402D)   /* Flexbus AD Med-High Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FBADML  MCF_REG08(0xFC0A402E)   /* Flexbus AD Med-Low Port Data Direction Register */
-+#define MCF_GPIO_PDDR_FBADL   MCF_REG08(0xFC0A402F)   /* Flexbus AD Low Port Data Direction Register */
-+#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0xFC0A4030)   /* FEC0 High Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0xFC0A4031)   /* FEC0 Low Port Clear Output Data Register */
-+#define MCF_GPIO_PPDSDR_SSI   MCF_REG08(0xFC0A4032)   /* SSI Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0xFC0A4033)   /* Flexbus Control Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_BE    MCF_REG08(0xFC0A4034)   /* Flexbus Byte Enable Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_CS    MCF_REG08(0xFC0A4035)   /* Flexbus Chip-Select Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_DMA   MCF_REG08(0xFC0A4036)   /* DMA Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FECI2C        MCF_REG08(0xFC0A4037)   /* FEC1 / I2C Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_UART  MCF_REG08(0xFC0A4039)   /* UART Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_DSPI  MCF_REG08(0xFC0A403A)   /* DSPI Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_TIMER MCF_REG08(0xFC0A403B)   /* FTimer Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_PCI   MCF_REG08(0xFC0A403C)   /* PCI Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_USB   MCF_REG08(0xFC0A403D)   /* USB Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_ATAH  MCF_REG08(0xFC0A403E)   /* ATA High Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_ATAL  MCF_REG08(0xFC0A403F)   /* ATA Low Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0xFC0A4040)   /* FEC1 High Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0xFC0A4041)   /* FEC1 Low Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FBADH MCF_REG08(0xFC0A4044)   /* Flexbus AD High Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FBADMH        MCF_REG08(0xFC0A4045)   /* Flexbus AD Med-High Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FBADML        MCF_REG08(0xFC0A4046)   /* Flexbus AD Med-Low Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PPDSDR_FBADL MCF_REG08(0xFC0A4047)   /* Flexbus AD Low Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PCLRR_FEC0H  MCF_REG08(0xFC0A4048)   /* FEC0 High Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FEC0L  MCF_REG08(0xFC0A4049)   /* FEC0 Low Port Pin Data/Set Data Register */
-+#define MCF_GPIO_PCLRR_SSI    MCF_REG08(0xFC0A404A)   /* SSI Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FBCTL  MCF_REG08(0xFC0A404B)   /* Flexbus Control Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_BE     MCF_REG08(0xFC0A404C)   /* Flexbus Byte Enable Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_CS     MCF_REG08(0xFC0A404D)   /* Flexbus Chip-Select Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_DMA    MCF_REG08(0xFC0A404E)   /* DMA Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0xFC0A404F)   /* FEC1 / I2C Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_UART   MCF_REG08(0xFC0A4051)   /* UART Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_DSPI   MCF_REG08(0xFC0A4052)   /* DSPI Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_TIMER  MCF_REG08(0xFC0A4053)   /* Timer Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_PCI    MCF_REG08(0xFC0A4054)   /* PCI Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_USB    MCF_REG08(0xFC0A4055)   /* USB Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_ATAH   MCF_REG08(0xFC0A4056)   /* ATA High Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_ATAL   MCF_REG08(0xFC0A4057)   /* ATA Low Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FEC1H  MCF_REG08(0xFC0A4058)   /* FEC1 High Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FEC1L  MCF_REG08(0xFC0A4059)   /* FEC1 Low Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FBADH  MCF_REG08(0xFC0A405C)   /* Flexbus AD High Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FBADMH MCF_REG08(0xFC0A405D)   /* Flexbus AD Med-High Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FBADML MCF_REG08(0xFC0A405E)   /* Flexbus AD Med-Low Port Clear Output Data Register */
-+#define MCF_GPIO_PCLRR_FBADL  MCF_REG08(0xFC0A405F)   /* Flexbus AD Low Port Clear Output Data Register */
-+#define MCF_GPIO_PAR_FEC      MCF_REG08(0xFC0A4060)   /* FEC Pin Assignment Register */
-+#define MCF_GPIO_PAR_DMA      MCF_REG08(0xFC0A4061)   /* DMA Pin Assignment Register */
-+#define MCF_GPIO_PAR_FBCTL    MCF_REG08(0xFC0A4062)   /* Flexbus Control Pin Assignment Register */
-+#define MCF_GPIO_PAR_DSPI     MCF_REG08(0xFC0A4063)   /* DSPI Pin Assignment Register */
-+#define MCF_GPIO_PAR_BE               MCF_REG08(0xFC0A4064)   /* Flexbus Byte-Enable Pin Assignment Register */
-+#define MCF_GPIO_PAR_CS               MCF_REG08(0xFC0A4065)   /* Flexbus Chip-Select Pin Assignment Register */
-+#define MCF_GPIO_PAR_TIMER    MCF_REG08(0xFC0A4066)   /* Time Pin Assignment Register */
-+#define MCF_GPIO_PAR_USB      MCF_REG08(0xFC0A4067)   /* USB Pin Assignment Register */
-+#define MCF_GPIO_PAR_UART     MCF_REG08(0xFC0A4069)   /* UART Pin Assignment Register */
-+#define MCF_GPIO_PAR_FECI2C   MCF_REG16(0xFC0A406A)   /* FEC / I2C Pin Assignment Register */
-+#define MCF_GPIO_PAR_SSI      MCF_REG16(0xFC0A406C)   /* SSI Pin Assignment Register */
-+#define MCF_GPIO_PAR_ATA      MCF_REG16(0xFC0A406E)   /* ATA Pin Assignment Register */
-+#define MCF_GPIO_PAR_IRQ      MCF_REG08(0xFC0A4070)   /* IRQ Pin Assignment Register */
-+#define MCF_GPIO_PAR_PCI      MCF_REG16(0xFC0A4072)   /* PCI Pin Assignment Register */
-+#define MCF_GPIO_MSCR_SDRAM   MCF_REG08(0xFC0A4074)   /* SDRAM Mode Select Control Register */
-+#define MCF_GPIO_MSCR_PCI     MCF_REG08(0xFC0A4075)   /* PCI Mode Select Control Register */
-+#define MCF_GPIO_DSCR_I2C     MCF_REG08(0xFC0A4078)   /* I2C Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_FLEXBUS MCF_REG08(0xFC0A4079)   /* FLEXBUS Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_FEC     MCF_REG08(0xFC0A407A)   /* FEC Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_UART    MCF_REG08(0xFC0A407B)   /* UART Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_DSPI    MCF_REG08(0xFC0A407C)   /* DSPI Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_TIMER   MCF_REG08(0xFC0A407D)   /* TIMER Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_SSI     MCF_REG08(0xFC0A407E)   /* SSI Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_DMA     MCF_REG08(0xFC0A407F)   /* DMA Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_DEBUG   MCF_REG08(0xFC0A4080)   /* DEBUG Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_RESET   MCF_REG08(0xFC0A4081)   /* RESET Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_IRQ     MCF_REG08(0xFC0A4082)   /* IRQ Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_USB     MCF_REG08(0xFC0A4083)   /* USB Drive Strength Control Register */
-+#define MCF_GPIO_DSCR_ATA     MCF_REG08(0xFC0A4084)   /* ATA Drive Strength Control Register */
-+
-+/* Bit definitions and macros for PODR_FEC0H */
-+#define MCF_GPIO_PODR_FEC0H_PODR0     (0x01)  /* FEC0_CRS / ULPI_DATA6 */
-+#define MCF_GPIO_PODR_FEC0H_PODR1     (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
-+#define MCF_GPIO_PODR_FEC0H_PODR2     (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
-+#define MCF_GPIO_PODR_FEC0H_PODR3     (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
-+#define MCF_GPIO_PODR_FEC0H_PODR4     (0x10)  /* FEC0_COL / ULPI_DATA7 */
-+#define MCF_GPIO_PODR_FEC0H_PODR5     (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
-+#define MCF_GPIO_PODR_FEC0H_PODR6     (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
-+#define MCF_GPIO_PODR_FEC0H_PODR7     (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
-+
-+/* Bit definitions and macros for PODR_FEC0L */
-+#define MCF_GPIO_PODR_FEC0L_PODR0     (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
-+#define MCF_GPIO_PODR_FEC0L_PODR1     (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
-+#define MCF_GPIO_PODR_FEC0L_PODR2     (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
-+#define MCF_GPIO_PODR_FEC0L_PODR3     (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
-+#define MCF_GPIO_PODR_FEC0L_PODR4     (0x10)  /* FEC0_TXER / ULPI_DATA0 */
-+#define MCF_GPIO_PODR_FEC0L_PODR5     (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
-+#define MCF_GPIO_PODR_FEC0L_PODR6     (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
-+#define MCF_GPIO_PODR_FEC0L_PODR7     (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
-+
-+/* Bit definitions and macros for PODR_SSI */
-+#define MCF_GPIO_PODR_SSI_PODR0               (0x01)  /* SSI_TXD / U1TXD */
-+#define MCF_GPIO_PODR_SSI_PODR1               (0x02)  /* SSI_RXD / U1RXD */
-+#define MCF_GPIO_PODR_SSI_PODR2               (0x04)  /* SSI_FS / U1RTS */
-+#define MCF_GPIO_PODR_SSI_PODR3               (0x08)  /* SSI_BCLK / U1CTS */
-+#define MCF_GPIO_PODR_SSI_PODR4               (0x10)  /* SSI_MCLK */
-+
-+/* Bit definitions and macros for PODR_FBCTL */
-+#define MCF_GPIO_PODR_FBCTL_PODR0     (0x01)  /* FB_TS / FB_ALE / FB_TBST */
-+#define MCF_GPIO_PODR_FBCTL_PODR1     (0x02)  /* FB_RW */
-+#define MCF_GPIO_PODR_FBCTL_PODR2     (0x04)  /* FB_TA */
-+#define MCF_GPIO_PODR_FBCTL_PODR3     (0x08)  /* FB_OE */
-+
-+/* Bit definitions and macros for PODR_BE */
-+#define MCF_GPIO_PODR_BE_PODR0                (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
-+#define MCF_GPIO_PODR_BE_PODR1                (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
-+#define MCF_GPIO_PODR_BE_PODR2                (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
-+#define MCF_GPIO_PODR_BE_PODR3                (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
-+
-+/* Bit definitions and macros for PODR_CS */
-+#define MCF_GPIO_PODR_CS_PODR1                (0x02)  /* FB_CS1 */
-+#define MCF_GPIO_PODR_CS_PODR2                (0x04)  /* FB_CS2 */
-+#define MCF_GPIO_PODR_CS_PODR3                (0x08)  /* FB_CS3 */
-+
-+/* Bit definitions and macros for PODR_DMA */
-+#define MCF_GPIO_PODR_DMA_PODR0               (0x01)  /* DREQ0 */
-+#define MCF_GPIO_PODR_DMA_PODR1               (0x02)  /* DACK0 / DSPI_PCS3 */
-+#define MCF_GPIO_PODR_DMA_PODR2               (0x04)  /* DREQ1 / USB_CLKIN */
-+#define MCF_GPIO_PODR_DMA_PODR3               (0x08)  /* DACK1 / ULPI_DIR */
-+
-+/* Bit definitions and macros for PODR_FECI2C */
-+#define MCF_GPIO_PODR_FECI2C_PODR0    (0x01)  /* I2C_SDA / U2RXD */
-+#define MCF_GPIO_PODR_FECI2C_PODR1    (0x02)  /* I2C_SCL / U2TXD */
-+#define MCF_GPIO_PODR_FECI2C_PODR2    (0x04)  /* FEC0_MDIO */
-+#define MCF_GPIO_PODR_FECI2C_PODR3    (0x08)  /* FEC0_MDC */
-+#define MCF_GPIO_PODR_FECI2C_PODR4    (0x10)  /* FEC1_MDIO / ATA_DIOW */
-+#define MCF_GPIO_PODR_FECI2C_PODR5    (0x20)  /* FEC1_MDC / ATA_DIOR */
-+
-+/* Bit definitions and macros for PODR_UART */
-+#define MCF_GPIO_PODR_UART_PODR0      (0x01)  /* U1TXD */
-+#define MCF_GPIO_PODR_UART_PODR1      (0x02)  /* U1RXD */
-+#define MCF_GPIO_PODR_UART_PODR2      (0x04)  /* U1RTS */
-+#define MCF_GPIO_PODR_UART_PODR3      (0x08)  /* U0CTS */
-+#define MCF_GPIO_PODR_UART_PODR4      (0x10)  /* U1TXD */
-+#define MCF_GPIO_PODR_UART_PODR5      (0x20)  /* U1RXD */
-+#define MCF_GPIO_PODR_UART_PODR6      (0x40)  /* U1RTS */
-+#define MCF_GPIO_PODR_UART_PODR7      (0x80)  /* U1CTS */
-+
-+/* Bit definitions and macros for PODR_DSPI */
-+#define MCF_GPIO_PODR_DSPI_PODR0      (0x01)  /* DSPI_SOUT / SBF_DO */
-+#define MCF_GPIO_PODR_DSPI_PODR1      (0x02)  /* DSPI_SIN / SBF_DI */
-+#define MCF_GPIO_PODR_DSPI_PODR2      (0x04)  /* DSPI_SCK / SBF_CK */
-+#define MCF_GPIO_PODR_DSPI_PODR3      (0x08)  /* DSPI_PCS0/SS */
-+#define MCF_GPIO_PODR_DSPI_PODR4      (0x10)  /* DSPI_PCS1 / SBF_CS */
-+#define MCF_GPIO_PODR_DSPI_PODR5      (0x20)  /* DSPI_PCS2 */
-+#define MCF_GPIO_PODR_DSPI_PODR6      (0x40)  /* DSPI_PCS5/SS */
-+
-+/* Bit definitions and macros for PODR_TIMER */
-+#define MCF_GPIO_PODR_TIMER_PODR0     (0x01)  /* T0IN / T0OUT / U2RTS */
-+#define MCF_GPIO_PODR_TIMER_PODR1     (0x02)  /* T1IN / T1OUT / U2CTS */
-+#define MCF_GPIO_PODR_TIMER_PODR2     (0x04)  /* T2IN / T2OUT / U2TXD */
-+#define MCF_GPIO_PODR_TIMER_PODR3     (0x08)  /* T3IN / T3OUT / U2RXD */
-+
-+/* Bit definitions and macros for PODR_PCI */
-+#define MCF_GPIO_PODR_PCI_PODR0               (0x01)  /* PCI_REQ0/PCI_EXTGNT */
-+#define MCF_GPIO_PODR_PCI_PODR1               (0x02)  /* PCI_REQ1 */
-+#define MCF_GPIO_PODR_PCI_PODR2               (0x04)  /* PCI_REQ2 */
-+#define MCF_GPIO_PODR_PCI_PODR3               (0x08)  /* PCI_REQ3 / ATA_INTR */
-+#define MCF_GPIO_PODR_PCI_PODR4               (0x10)  /* PCI_GNT0/PCI_EXTREQ */
-+#define MCF_GPIO_PODR_PCI_PODR5               (0x20)  /* PCI_GNT1 /  */
-+#define MCF_GPIO_PODR_PCI_PODR6               (0x40)  /* PCI_GNT2 /  */
-+#define MCF_GPIO_PODR_PCI_PODR7               (0x80)  /* PCI_GNT3 / ATA_DMACK */
-+
-+/* Bit definitions and macros for PODR_USB */
-+#define MCF_GPIO_PODR_USB_PODR0               (0x01)  /* USB_VBUS_OC / ULPI_STP */
-+#define MCF_GPIO_PODR_USB_PODR1               (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
-+
-+/* Bit definitions and macros for PODR_ATAH */
-+#define MCF_GPIO_PODR_ATAH_PODR0      (0x01)  /* ATA_DA0 */
-+#define MCF_GPIO_PODR_ATAH_PODR1      (0x02)  /* ATA_DA1 */
-+#define MCF_GPIO_PODR_ATAH_PODR2      (0x04)  /* ATA_DA2 */
-+#define MCF_GPIO_PODR_ATAH_PODR3      (0x08)  /* ATA_CS0 */
-+#define MCF_GPIO_PODR_ATAH_PODR4      (0x10)  /* ATA_CS1 */
-+#define MCF_GPIO_PODR_ATAH_PODR5      (0x20)  /* ATA_BUFFER_EN */
-+
-+/* Bit definitions and macros for PODR_ATAL */
-+#define MCF_GPIO_PODR_ATAL_PODR0      (0x01)  /* ATA_IORDY */
-+#define MCF_GPIO_PODR_ATAL_PODR1      (0x02)  /* ATA_DMARQ */
-+#define MCF_GPIO_PODR_ATAL_PODR2      (0x04)  /* ATA_RESET */
-+
-+/* Bit definitions and macros for PODR_FEC1H */
-+#define MCF_GPIO_PODR_FEC1H_PODR0     (0x01)  /* FEC1_CRS / ATA_DATA6 */
-+#define MCF_GPIO_PODR_FEC1H_PODR1     (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
-+#define MCF_GPIO_PODR_FEC1H_PODR2     (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
-+#define MCF_GPIO_PODR_FEC1H_PODR3     (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
-+#define MCF_GPIO_PODR_FEC1H_PODR4     (0x10)  /* FEC1_COL / ATA_DATA7 */
-+#define MCF_GPIO_PODR_FEC1H_PODR5     (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
-+#define MCF_GPIO_PODR_FEC1H_PODR6     (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
-+#define MCF_GPIO_PODR_FEC1H_PODR7     (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
-+
-+/* Bit definitions and macros for PODR_FEC1L */
-+#define MCF_GPIO_PODR_FEC1L_PODR0     (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
-+#define MCF_GPIO_PODR_FEC1L_PODR1     (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
-+#define MCF_GPIO_PODR_FEC1L_PODR2     (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
-+#define MCF_GPIO_PODR_FEC1L_PODR3     (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
-+#define MCF_GPIO_PODR_FEC1L_PODR4     (0x10)  /* FEC1_TXER / ATA_DATA0 */
-+#define MCF_GPIO_PODR_FEC1L_PODR5     (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
-+#define MCF_GPIO_PODR_FEC1L_PODR6     (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
-+#define MCF_GPIO_PODR_FEC1L_PODR7     (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
-+
-+/* Bit definitions and macros for PODR_FBADH */
-+#define MCF_GPIO_PODR_FBADH_PODR0     (0x01)  /* FB_AD24 */
-+#define MCF_GPIO_PODR_FBADH_PODR1     (0x02)  /* FB_AD25 */
-+#define MCF_GPIO_PODR_FBADH_PODR2     (0x04)  /* FB_AD26 */
-+#define MCF_GPIO_PODR_FBADH_PODR3     (0x08)  /* FB_AD27 */
-+#define MCF_GPIO_PODR_FBADH_PODR4     (0x10)  /* FB_AD28 */
-+#define MCF_GPIO_PODR_FBADH_PODR5     (0x20)  /* FB_AD29 */
-+#define MCF_GPIO_PODR_FBADH_PODR6     (0x40)  /* FB_AD30 */
-+#define MCF_GPIO_PODR_FBADH_PODR7     (0x80)  /* FB_AD31 */
-+
-+/* Bit definitions and macros for PODR_FBADMH */
-+#define MCF_GPIO_PODR_FBADMH_PODR0    (0x01)  /* FB_AD16 */
-+#define MCF_GPIO_PODR_FBADMH_PODR1    (0x02)  /* FB_AD17 */
-+#define MCF_GPIO_PODR_FBADMH_PODR2    (0x04)  /* FB_AD18 */
-+#define MCF_GPIO_PODR_FBADMH_PODR3    (0x08)  /* FB_AD19 */
-+#define MCF_GPIO_PODR_FBADMH_PODR4    (0x10)  /* FB_AD20 */
-+#define MCF_GPIO_PODR_FBADMH_PODR5    (0x20)  /* FB_AD21 */
-+#define MCF_GPIO_PODR_FBADMH_PODR6    (0x40)  /* FB_AD22 */
-+#define MCF_GPIO_PODR_FBADMH_PODR7    (0x80)  /* FB_AD23 */
-+
-+/* Bit definitions and macros for PODR_FBADML */
-+#define MCF_GPIO_PODR_FBADML_PODR0    (0x01)  /* FB_AD8 */
-+#define MCF_GPIO_PODR_FBADML_PODR1    (0x02)  /* FB_AD9 */
-+#define MCF_GPIO_PODR_FBADML_PODR2    (0x04)  /* FB_AD10 */
-+#define MCF_GPIO_PODR_FBADML_PODR3    (0x08)  /* FB_AD11 */
-+#define MCF_GPIO_PODR_FBADML_PODR4    (0x10)  /* FB_AD12 */
-+#define MCF_GPIO_PODR_FBADML_PODR5    (0x20)  /* FB_AD13 */
-+#define MCF_GPIO_PODR_FBADML_PODR6    (0x40)  /* FB_AD14 */
-+#define MCF_GPIO_PODR_FBADML_PODR7    (0x80)  /* FB_AD15 */
-+
-+/* Bit definitions and macros for PODR_FBADL */
-+#define MCF_GPIO_PODR_FBADL_PODR0     (0x01)  /* FB_AD0 */
-+#define MCF_GPIO_PODR_FBADL_PODR1     (0x02)  /* FB_AD1 */
-+#define MCF_GPIO_PODR_FBADL_PODR2     (0x04)  /* FB_AD2 */
-+#define MCF_GPIO_PODR_FBADL_PODR3     (0x08)  /* FB_AD3 */
-+#define MCF_GPIO_PODR_FBADL_PODR4     (0x10)  /* FB_AD4 */
-+#define MCF_GPIO_PODR_FBADL_PODR5     (0x20)  /* FB_AD5 */
-+#define MCF_GPIO_PODR_FBADL_PODR6     (0x40)  /* FB_AD6 */
-+#define MCF_GPIO_PODR_FBADL_PODR7     (0x80)  /* FB_AD7 */
-+
-+/* Bit definitions and macros for PDDR_FEC0H */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR0     (0x01)  /* FEC0_CRS / ULPI_DATA6 */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR1     (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR2     (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR3     (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR4     (0x10)  /* FEC0_COL / ULPI_DATA7 */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR5     (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR6     (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
-+#define MCF_GPIO_PDDR_FEC0H_PDDR7     (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
-+
-+/* Bit definitions and macros for PDDR_FEC0L */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR0     (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR1     (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR2     (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR3     (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR4     (0x10)  /* FEC0_TXER / ULPI_DATA0 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR5     (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR6     (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
-+#define MCF_GPIO_PDDR_FEC0L_PDDR7     (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
-+
-+/* Bit definitions and macros for PDDR_SSI */
-+#define MCF_GPIO_PDDR_SSI_PDDR0               (0x01)  /* SSI_TXD / U1TXD */
-+#define MCF_GPIO_PDDR_SSI_PDDR1               (0x02)  /* SSI_RXD / U1RXD */
-+#define MCF_GPIO_PDDR_SSI_PDDR2               (0x04)  /* SSI_FS / U1RTS */
-+#define MCF_GPIO_PDDR_SSI_PDDR3               (0x08)  /* SSI_BCLK / U1CTS */
-+#define MCF_GPIO_PDDR_SSI_PDDR4               (0x10)  /* SSI_MCLK */
-+
-+/* Bit definitions and macros for PDDR_FBCTL */
-+#define MCF_GPIO_PDDR_FBCTL_PDDR0     (0x01)  /* FB_TS / FB_ALE / FB_TBST */
-+#define MCF_GPIO_PDDR_FBCTL_PDDR1     (0x02)  /* FB_RW */
-+#define MCF_GPIO_PDDR_FBCTL_PDDR2     (0x04)  /* FB_TA */
-+#define MCF_GPIO_PDDR_FBCTL_PDDR3     (0x08)  /* FB_OE */
-+
-+/* Bit definitions and macros for PDDR_BE */
-+#define MCF_GPIO_PDDR_BE_PDDR0                (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
-+#define MCF_GPIO_PDDR_BE_PDDR1                (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
-+#define MCF_GPIO_PDDR_BE_PDDR2                (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
-+#define MCF_GPIO_PDDR_BE_PDDR3                (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
-+
-+/* Bit definitions and macros for PDDR_CS */
-+#define MCF_GPIO_PDDR_CS_PDDR1                (0x02)  /* FB_CS1 */
-+#define MCF_GPIO_PDDR_CS_PDDR2                (0x04)  /* FB_CS2 */
-+#define MCF_GPIO_PDDR_CS_PDDR3                (0x08)  /* FB_CS3 */
-+
-+/* Bit definitions and macros for PDDR_DMA */
-+#define MCF_GPIO_PDDR_DMA_PDDR0               (0x01)  /* DREQ0 */
-+#define MCF_GPIO_PDDR_DMA_PDDR1               (0x02)  /* DACK0 / DSPI_PCS3 */
-+#define MCF_GPIO_PDDR_DMA_PDDR2               (0x04)  /* DREQ1 / USB_CLKIN */
-+#define MCF_GPIO_PDDR_DMA_PDDR3               (0x08)  /* DACK1 / ULPI_DIR */
-+
-+/* Bit definitions and macros for PDDR_FECI2C */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR0    (0x01)  /* I2C_SDA / U2RXD */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR1    (0x02)  /* I2C_SCL / U2TXD */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR2    (0x04)  /* FEC0_MDIO */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR3    (0x08)  /* FEC0_MDC */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR4    (0x10)  /* FEC1_MDIO / ATA_DIOW */
-+#define MCF_GPIO_PDDR_FECI2C_PDDR5    (0x20)  /* FEC1_MDC / ATA_DIOR */
-+
-+/* Bit definitions and macros for PDDR_UART */
-+#define MCF_GPIO_PDDR_UART_PDDR0      (0x01)  /* U1TXD */
-+#define MCF_GPIO_PDDR_UART_PDDR1      (0x02)  /* U1RXD */
-+#define MCF_GPIO_PDDR_UART_PDDR2      (0x04)  /* U1RTS */
-+#define MCF_GPIO_PDDR_UART_PDDR3      (0x08)  /* U0CTS */
-+#define MCF_GPIO_PDDR_UART_PDDR4      (0x10)  /* U1TXD */
-+#define MCF_GPIO_PDDR_UART_PDDR5      (0x20)  /* U1RXD */
-+#define MCF_GPIO_PDDR_UART_PDDR6      (0x40)  /* U1RTS */
-+#define MCF_GPIO_PDDR_UART_PDDR7      (0x80)  /* U1CTS */
-+
-+/* Bit definitions and macros for PDDR_DSPI */
-+#define MCF_GPIO_PDDR_DSPI_PDDR0      (0x01)  /* DSPI_SOUT / SBF_DO */
-+#define MCF_GPIO_PDDR_DSPI_PDDR1      (0x02)  /* DSPI_SIN / SBF_DI */
-+#define MCF_GPIO_PDDR_DSPI_PDDR2      (0x04)  /* DSPI_SCK / SBF_CK */
-+#define MCF_GPIO_PDDR_DSPI_PDDR3      (0x08)  /* DSPI_PCS0/SS */
-+#define MCF_GPIO_PDDR_DSPI_PDDR4      (0x10)  /* DSPI_PCS1 / SBF_CS */
-+#define MCF_GPIO_PDDR_DSPI_PDDR5      (0x20)  /* DSPI_PCS2 */
-+#define MCF_GPIO_PDDR_DSPI_PDDR6      (0x40)  /* DSPI_PCS5/SS */
-+
-+/* Bit definitions and macros for PDDR_TIMER */
-+#define MCF_GPIO_PDDR_TIMER_PDDR0     (0x01)  /* T0IN / T0OUT / U2RTS */
-+#define MCF_GPIO_PDDR_TIMER_PDDR1     (0x02)  /* T1IN / T1OUT / U2CTS */
-+#define MCF_GPIO_PDDR_TIMER_PDDR2     (0x04)  /* T2IN / T2OUT / U2TXD */
-+#define MCF_GPIO_PDDR_TIMER_PDDR3     (0x08)  /* T3IN / T3OUT / U2RXD */
-+
-+/* Bit definitions and macros for PDDR_PCI */
-+#define MCF_GPIO_PDDR_PCI_PDDR0               (0x01)  /* PCI_REQ0/PCI_EXTGNT */
-+#define MCF_GPIO_PDDR_PCI_PDDR1               (0x02)  /* PCI_REQ1 */
-+#define MCF_GPIO_PDDR_PCI_PDDR2               (0x04)  /* PCI_REQ2 */
-+#define MCF_GPIO_PDDR_PCI_PDDR3               (0x08)  /* PCI_REQ3 / ATA_INTR */
-+#define MCF_GPIO_PDDR_PCI_PDDR4               (0x10)  /* PCI_GNT0/PCI_EXTREQ */
-+#define MCF_GPIO_PDDR_PCI_PDDR5               (0x20)  /* PCI_GNT1 /  */
-+#define MCF_GPIO_PDDR_PCI_PDDR6               (0x40)  /* PCI_GNT2 /  */
-+#define MCF_GPIO_PDDR_PCI_PDDR7               (0x80)  /* PCI_GNT3 / ATA_DMACK */
-+
-+/* Bit definitions and macros for PDDR_USB */
-+#define MCF_GPIO_PDDR_USB_PDDR0               (0x01)  /* USB_VBUS_OC / ULPI_STP */
-+#define MCF_GPIO_PDDR_USB_PDDR1               (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
-+
-+/* Bit definitions and macros for PDDR_ATAH */
-+#define MCF_GPIO_PDDR_ATAH_PDDR0      (0x01)  /* ATA_DA0 */
-+#define MCF_GPIO_PDDR_ATAH_PDDR1      (0x02)  /* ATA_DA1 */
-+#define MCF_GPIO_PDDR_ATAH_PDDR2      (0x04)  /* ATA_DA2 */
-+#define MCF_GPIO_PDDR_ATAH_PDDR3      (0x08)  /* ATA_CS0 */
-+#define MCF_GPIO_PDDR_ATAH_PDDR4      (0x10)  /* ATA_CS1 */
-+#define MCF_GPIO_PDDR_ATAH_PDDR5      (0x20)  /* ATA_BUFFER_EN */
-+
-+/* Bit definitions and macros for PDDR_ATAL */
-+#define MCF_GPIO_PDDR_ATAL_PDDR0      (0x01)  /* ATA_IORDY */
-+#define MCF_GPIO_PDDR_ATAL_PDDR1      (0x02)  /* ATA_DMARQ */
-+#define MCF_GPIO_PDDR_ATAL_PDDR2      (0x04)  /* ATA_RESET */
-+
-+/* Bit definitions and macros for PDDR_FEC1H */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR0     (0x01)  /* FEC1_CRS / ATA_DATA6 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR1     (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR2     (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR3     (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR4     (0x10)  /* FEC1_COL / ATA_DATA7 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR5     (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR6     (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
-+#define MCF_GPIO_PDDR_FEC1H_PDDR7     (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
-+
-+/* Bit definitions and macros for PDDR_FEC1L */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR0     (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR1     (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR2     (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR3     (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR4     (0x10)  /* FEC1_TXER / ATA_DATA0 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR5     (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR6     (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
-+#define MCF_GPIO_PDDR_FEC1L_PDDR7     (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
-+
-+/* Bit definitions and macros for PDDR_FBADH */
-+#define MCF_GPIO_PDDR_FBADH_PDDR0     (0x01)  /* FB_AD24 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR1     (0x02)  /* FB_AD25 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR2     (0x04)  /* FB_AD26 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR3     (0x08)  /* FB_AD27 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR4     (0x10)  /* FB_AD28 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR5     (0x20)  /* FB_AD29 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR6     (0x40)  /* FB_AD30 */
-+#define MCF_GPIO_PDDR_FBADH_PDDR7     (0x80)  /* FB_AD31 */
-+
-+/* Bit definitions and macros for PDDR_FBADMH */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR0    (0x01)  /* FB_AD16 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR1    (0x02)  /* FB_AD17 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR2    (0x04)  /* FB_AD18 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR3    (0x08)  /* FB_AD19 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR4    (0x10)  /* FB_AD20 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR5    (0x20)  /* FB_AD21 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR6    (0x40)  /* FB_AD22 */
-+#define MCF_GPIO_PDDR_FBADMH_PDDR7    (0x80)  /* FB_AD23 */
-+
-+/* Bit definitions and macros for PDDR_FBADML */
-+#define MCF_GPIO_PDDR_FBADML_PDDR0    (0x01)  /* FB_AD8 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR1    (0x02)  /* FB_AD9 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR2    (0x04)  /* FB_AD10 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR3    (0x08)  /* FB_AD11 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR4    (0x10)  /* FB_AD12 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR5    (0x20)  /* FB_AD13 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR6    (0x40)  /* FB_AD14 */
-+#define MCF_GPIO_PDDR_FBADML_PDDR7    (0x80)  /* FB_AD15 */
-+
-+/* Bit definitions and macros for PDDR_FBADL */
-+#define MCF_GPIO_PDDR_FBADL_PDDR0     (0x01)  /* FB_AD0 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR1     (0x02)  /* FB_AD1 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR2     (0x04)  /* FB_AD2 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR3     (0x08)  /* FB_AD3 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR4     (0x10)  /* FB_AD4 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR5     (0x20)  /* FB_AD5 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR6     (0x40)  /* FB_AD6 */
-+#define MCF_GPIO_PDDR_FBADL_PDDR7     (0x80)  /* FB_AD7 */
-+
-+/* Bit definitions and macros for PPDSDR_FEC0H */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR0   (0x01)  /* FEC0_CRS / ULPI_DATA6 */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR1   (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR2   (0x04)  /* FEC0_RXDV / FEC0_RMII_CRS_DV */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR3   (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR4   (0x10)  /* FEC0_COL / ULPI_DATA7 */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR5   (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR6   (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
-+#define MCF_GPIO_PPDSDR_FEC0H_PPDR7   (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
-+
-+/* Bit definitions and macros for PPDSDR_FEC0L */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR0  (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR1  (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR2  (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR3  (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR4  (0x10)  /* FEC0_TXER / ULPI_DATA0 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR5  (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR6  (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
-+#define MCF_GPIO_PPDSDR_FEC0L_PCLRR7  (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
-+
-+/* Bit definitions and macros for PPDSDR_SSI */
-+#define MCF_GPIO_PPDSDR_SSI_PPDR0     (0x01)  /* SSI_TXD / U1TXD */
-+#define MCF_GPIO_PPDSDR_SSI_PPDR1     (0x02)  /* SSI_RXD / U1RXD */
-+#define MCF_GPIO_PPDSDR_SSI_PPDR2     (0x04)  /* SSI_FS / U1RTS */
-+#define MCF_GPIO_PPDSDR_SSI_PPDR3     (0x08)  /* SSI_BCLK / U1CTS */
-+#define MCF_GPIO_PPDSDR_SSI_PPDR4     (0x10)  /* SSI_MCLK */
-+
-+/* Bit definitions and macros for PPDSDR_FBCTL */
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDR0   (0x01)  /* FB_TS / FB_ALE / FB_TBST */
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDR1   (0x02)  /* FB_RW */
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDR2   (0x04)  /* FB_TA */
-+#define MCF_GPIO_PPDSDR_FBCTL_PPDR3   (0x08)  /* FB_OE */
-+
-+/* Bit definitions and macros for PPDSDR_BE */
-+#define MCF_GPIO_PPDSDR_BE_PPDR0      (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
-+#define MCF_GPIO_PPDSDR_BE_PPDR1      (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
-+#define MCF_GPIO_PPDSDR_BE_PPDR2      (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
-+#define MCF_GPIO_PPDSDR_BE_PPDR3      (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
-+
-+/* Bit definitions and macros for PPDSDR_CS */
-+#define MCF_GPIO_PPDSDR_CS_PPDR1      (0x02)  /* FB_CS1 */
-+#define MCF_GPIO_PPDSDR_CS_PPDR2      (0x04)  /* FB_CS2 */
-+#define MCF_GPIO_PPDSDR_CS_PPDR3      (0x08)  /* FB_CS3 */
-+
-+/* Bit definitions and macros for PPDSDR_DMA */
-+#define MCF_GPIO_PPDSDR_DMA_PPDR0     (0x01)  /* DREQ0 */
-+#define MCF_GPIO_PPDSDR_DMA_PPDR1     (0x02)  /* DACK0 / DSPI_PCS3 */
-+#define MCF_GPIO_PPDSDR_DMA_PPDR2     (0x04)  /* DREQ1 / USB_CLKIN */
-+#define MCF_GPIO_PPDSDR_DMA_PPDR3     (0x08)  /* DACK1 / ULPI_DIR */
-+
-+/* Bit definitions and macros for PPDSDR_FECI2C */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR0  (0x01)  /* I2C_SDA / U2RXD */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR1  (0x02)  /* I2C_SCL / U2TXD */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR2  (0x04)  /* FEC0_MDIO */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR3  (0x08)  /* FEC0_MDC */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR4  (0x10)  /* FEC1_MDIO / ATA_DIOW */
-+#define MCF_GPIO_PPDSDR_FECI2C_PPDR5  (0x20)  /* FEC1_MDC / ATA_DIOR */
-+
-+/* Bit definitions and macros for PPDSDR_UART */
-+#define MCF_GPIO_PPDSDR_UART_PPDR0    (0x01)  /* U1TXD */
-+#define MCF_GPIO_PPDSDR_UART_PPDR1    (0x02)  /* U1RXD */
-+#define MCF_GPIO_PPDSDR_UART_PPDR2    (0x04)  /* U1RTS */
-+#define MCF_GPIO_PPDSDR_UART_PPDR3    (0x08)  /* U0CTS */
-+#define MCF_GPIO_PPDSDR_UART_PPDR4    (0x10)  /* U1TXD */
-+#define MCF_GPIO_PPDSDR_UART_PPDR5    (0x20)  /* U1RXD */
-+#define MCF_GPIO_PPDSDR_UART_PPDR6    (0x40)  /* U1RTS */
-+#define MCF_GPIO_PPDSDR_UART_PPDR7    (0x80)  /* U1CTS */
-+
-+/* Bit definitions and macros for PPDSDR_DSPI */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR0    (0x01)  /* DSPI_SOUT / SBF_DO */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR1    (0x02)  /* DSPI_SIN / SBF_DI */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR2    (0x04)  /* DSPI_SCK / SBF_CK */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR3    (0x08)  /* DSPI_PCS0/SS */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR4    (0x10)  /* DSPI_PCS1 / SBF_CS */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR5    (0x20)  /* DSPI_PCS2 */
-+#define MCF_GPIO_PPDSDR_DSPI_PPDR6    (0x40)  /* DSPI_PCS5/SS */
-+
-+/* Bit definitions and macros for PPDSDR_TIMER */
-+#define MCF_GPIO_PPDSDR_TIMER_PPDR0   (0x01)  /* T0IN / T0OUT / U2RTS */
-+#define MCF_GPIO_PPDSDR_TIMER_PPDR1   (0x02)  /* T1IN / T1OUT / U2CTS */
-+#define MCF_GPIO_PPDSDR_TIMER_PPDR2   (0x04)  /* T2IN / T2OUT / U2TXD */
-+#define MCF_GPIO_PPDSDR_TIMER_PPDR3   (0x08)  /* T3IN / T3OUT / U2RXD */
-+
-+/* Bit definitions and macros for PPDSDR_PCI */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR0     (0x01)  /* PCI_REQ0/PCI_EXTGNT */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR1     (0x02)  /* PCI_REQ1 */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR2     (0x04)  /* PCI_REQ2 */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR3     (0x08)  /* PCI_REQ3 / ATA_INTR */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR4     (0x10)  /* PCI_GNT0/PCI_EXTREQ */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR5     (0x20)  /* PCI_GNT1 /  */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR6     (0x40)  /* PCI_GNT2 /  */
-+#define MCF_GPIO_PPDSDR_PCI_PPDR7     (0x80)  /* PCI_GNT3 / ATA_DMACK */
-+
-+/* Bit definitions and macros for PPDSDR_USB */
-+#define MCF_GPIO_PPDSDR_USB_PPDR0     (0x01)  /* USB_VBUS_OC / ULPI_STP */
-+#define MCF_GPIO_PPDSDR_USB_PPDR1     (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
-+
-+/* Bit definitions and macros for PPDSDR_ATAH */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR0    (0x01)  /* ATA_DA0 */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR1    (0x02)  /* ATA_DA1 */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR2    (0x04)  /* ATA_DA2 */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR3    (0x08)  /* ATA_CS0 */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR4    (0x10)  /* ATA_CS1 */
-+#define MCF_GPIO_PPDSDR_ATAH_PPDR5    (0x20)  /* ATA_BUFFER_EN */
-+
-+/* Bit definitions and macros for PPDSDR_ATAL */
-+#define MCF_GPIO_PPDSDR_ATAL_PPDR0    (0x01)  /* ATA_IORDY */
-+#define MCF_GPIO_PPDSDR_ATAL_PPDR1    (0x02)  /* ATA_DMARQ */
-+#define MCF_GPIO_PPDSDR_ATAL_PPDR2    (0x04)  /* ATA_RESET */
-+
-+/* Bit definitions and macros for PPDSDR_FEC1H */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR0   (0x01)  /* FEC1_CRS / ATA_DATA6 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR1   (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR2   (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR3   (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR4   (0x10)  /* FEC1_COL / ATA_DATA7 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR5   (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR6   (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
-+#define MCF_GPIO_PPDSDR_FEC1H_PPDR7   (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
-+
-+/* Bit definitions and macros for PPDSDR_FEC1L */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR0   (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR1   (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR2   (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR3   (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR4   (0x10)  /* FEC1_TXER / ATA_DATA0 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR5   (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR6   (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
-+#define MCF_GPIO_PPDSDR_FEC1L_PPDR7   (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
-+
-+/* Bit definitions and macros for PPDSDR_FBADH */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR0   (0x01)  /* FB_AD24 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR1   (0x02)  /* FB_AD25 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR2   (0x04)  /* FB_AD26 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR3   (0x08)  /* FB_AD27 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR4   (0x10)  /* FB_AD28 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR5   (0x20)  /* FB_AD29 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR6   (0x40)  /* FB_AD30 */
-+#define MCF_GPIO_PPDSDR_FBADH_PPDR7   (0x80)  /* FB_AD31 */
-+
-+/* Bit definitions and macros for PPDSDR_FBADMH */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR0  (0x01)  /* FB_AD16 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR1  (0x02)  /* FB_AD17 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR2  (0x04)  /* FB_AD18 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR3  (0x08)  /* FB_AD19 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR4  (0x10)  /* FB_AD20 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR5  (0x20)  /* FB_AD21 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR6  (0x40)  /* FB_AD22 */
-+#define MCF_GPIO_PPDSDR_FBADMH_PPDR7  (0x80)  /* FB_AD23 */
-+
-+/* Bit definitions and macros for PPDSDR_FBADML */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR0  (0x01)  /* FB_AD8 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR1  (0x02)  /* FB_AD9 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR2  (0x04)  /* FB_AD10 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR3  (0x08)  /* FB_AD11 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR4  (0x10)  /* FB_AD12 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR5  (0x20)  /* FB_AD13 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR6  (0x40)  /* FB_AD14 */
-+#define MCF_GPIO_PPDSDR_FBADML_PPDR7  (0x80)  /* FB_AD15 */
-+
-+/* Bit definitions and macros for PPDSDR_FBADL */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR0   (0x01)  /* FB_AD0 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR1   (0x02)  /* FB_AD1 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR2   (0x04)  /* FB_AD2 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR3   (0x08)  /* FB_AD3 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR4   (0x10)  /* FB_AD4 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR5   (0x20)  /* FB_AD5 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR6   (0x40)  /* FB_AD6 */
-+#define MCF_GPIO_PPDSDR_FBADL_PPDR7   (0x80)  /* FB_AD7 */
-+
-+/* Bit definitions and macros for PCLRR_FEC0H */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR0   (0x01)  /* FEC0_CRS / ULPI_DATA6 */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR1   (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR2   (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR3   (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR4   (0x10)  /* FEC0_COL / ULPI_DATA7 */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR5   (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR6   (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
-+#define MCF_GPIO_PCLRR_FEC0H_PCLRR7   (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
-+
-+/* Bit definitions and macros for PCLRR_FEC0L */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR0    (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR1    (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR2    (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR3    (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR4    (0x10)  /* FEC0_TXER / ULPI_DATA0 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR5    (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR6    (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
-+#define MCF_GPIO_PCLRR_FEC0L_PPDR7    (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
-+
-+/* Bit definitions and macros for PCLRR_SSI */
-+#define MCF_GPIO_PCLRR_SSI_PCLRR0     (0x01)  /* SSI_TXD / U1TXD */
-+#define MCF_GPIO_PCLRR_SSI_PCLRR1     (0x02)  /* SSI_RXD / U1RXD */
-+#define MCF_GPIO_PCLRR_SSI_PCLRR2     (0x04)  /* SSI_FS / U1RTS */
-+#define MCF_GPIO_PCLRR_SSI_PCLRR3     (0x08)  /* SSI_BCLK / U1CTS */
-+#define MCF_GPIO_PCLRR_SSI_PCLRR4     (0x10)  /* SSI_MCLK */
-+
-+/* Bit definitions and macros for PCLRR_FBCTL */
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRR0   (0x01)  /* FB_TS / FB_ALE / FB_TBST */
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRR1   (0x02)  /* FB_RW */
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRR2   (0x04)  /* FB_TA */
-+#define MCF_GPIO_PCLRR_FBCTL_PCLRR3   (0x08)  /* FB_OE */
-+
-+/* Bit definitions and macros for PCLRR_BE */
-+#define MCF_GPIO_PCLRR_BE_PCLRR0      (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
-+#define MCF_GPIO_PCLRR_BE_PCLRR1      (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
-+#define MCF_GPIO_PCLRR_BE_PCLRR2      (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
-+#define MCF_GPIO_PCLRR_BE_PCLRR3      (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
-+
-+/* Bit definitions and macros for PCLRR_CS */
-+#define MCF_GPIO_PCLRR_CS_PCLRR1      (0x02)  /* FB_CS1 */
-+#define MCF_GPIO_PCLRR_CS_PCLRR2      (0x04)  /* FB_CS2 */
-+#define MCF_GPIO_PCLRR_CS_PCLRR3      (0x08)  /* FB_CS3 */
-+
-+/* Bit definitions and macros for PCLRR_DMA */
-+#define MCF_GPIO_PCLRR_DMA_PCLRR0     (0x01)  /* DREQ0 */
-+#define MCF_GPIO_PCLRR_DMA_PCLRR1     (0x02)  /* DACK0 / DSPI_PCS3 */
-+#define MCF_GPIO_PCLRR_DMA_PCLRR2     (0x04)  /* DREQ1 / USB_CLKIN */
-+#define MCF_GPIO_PCLRR_DMA_PCLRR3     (0x08)  /* DACK1 / ULPI_DIR */
-+
-+/* Bit definitions and macros for PCLRR_FECI2C */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR0  (0x01)  /* I2C_SDA / U2RXD */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR1  (0x02)  /* I2C_SCL / U2TXD */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR2  (0x04)  /* FEC0_MDIO */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR3  (0x08)  /* FEC0_MDC */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR4  (0x10)  /* FEC1_MDIO / ATA_DIOW */
-+#define MCF_GPIO_PCLRR_FECI2C_PCLRR5  (0x20)  /* FEC1_MDC / ATA_DIOR */
-+
-+/* Bit definitions and macros for PCLRR_UART */
-+#define MCF_GPIO_PCLRR_UART_PCLRR0    (0x01)  /* U1TXD */
-+#define MCF_GPIO_PCLRR_UART_PCLRR1    (0x02)  /* U1RXD */
-+#define MCF_GPIO_PCLRR_UART_PCLRR2    (0x04)  /* U1RTS */
-+#define MCF_GPIO_PCLRR_UART_PCLRR3    (0x08)  /* U0CTS */
-+#define MCF_GPIO_PCLRR_UART_PCLRR4    (0x10)  /* U1TXD */
-+#define MCF_GPIO_PCLRR_UART_PCLRR5    (0x20)  /* U1RXD */
-+#define MCF_GPIO_PCLRR_UART_PCLRR6    (0x40)  /* U1RTS */
-+#define MCF_GPIO_PCLRR_UART_PCLRR7    (0x80)  /* U1CTS */
-+
-+/* Bit definitions and macros for PCLRR_DSPI */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR0    (0x01)  /* DSPI_SOUT / SBF_DO */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR1    (0x02)  /* DSPI_SIN / SBF_DI */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR2    (0x04)  /* DSPI_SCK / SBF_CK */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR3    (0x08)  /* DSPI_PCS0/SS */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR4    (0x10)  /* DSPI_PCS1 / SBF_CS */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR5    (0x20)  /* DSPI_PCS2 */
-+#define MCF_GPIO_PCLRR_DSPI_PCLRR6    (0x40)  /* DSPI_PCS5/SS */
-+
-+/* Bit definitions and macros for PCLRR_TIMER */
-+#define MCF_GPIO_PCLRR_TIMER_PCLRR0   (0x01)  /* T0IN / T0OUT / U2RTS */
-+#define MCF_GPIO_PCLRR_TIMER_PCLRR1   (0x02)  /* T1IN / T1OUT / U2CTS */
-+#define MCF_GPIO_PCLRR_TIMER_PCLRR2   (0x04)  /* T2IN / T2OUT / U2TXD */
-+#define MCF_GPIO_PCLRR_TIMER_PCLRR3   (0x08)  /* T3IN / T3OUT / U2RXD */
-+
-+/* Bit definitions and macros for PCLRR_PCI */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR0     (0x01)  /* PCI_REQ0/PCI_EXTGNT */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR1     (0x02)  /* PCI_REQ1 */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR2     (0x04)  /* PCI_REQ2 */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR3     (0x08)  /* PCI_REQ3 / ATA_INTR */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR4     (0x10)  /* PCI_GNT0/PCI_EXTREQ */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR5     (0x20)  /* PCI_GNT1 /  */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR6     (0x40)  /* PCI_GNT2 /  */
-+#define MCF_GPIO_PCLRR_PCI_PCLRR7     (0x80)  /* PCI_GNT3 / ATA_DMACK */
-+
-+/* Bit definitions and macros for PCLRR_USB */
-+#define MCF_GPIO_PCLRR_USB_PCLRR0     (0x01)  /* USB_VBUS_OC / ULPI_STP */
-+#define MCF_GPIO_PCLRR_USB_PCLRR1     (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
-+
-+/* Bit definitions and macros for PCLRR_ATAH */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR0    (0x01)  /* ATA_DA0 */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR1    (0x02)  /* ATA_DA1 */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR2    (0x04)  /* ATA_DA2 */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR3    (0x08)  /* ATA_CS0 */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR4    (0x10)  /* ATA_CS1 */
-+#define MCF_GPIO_PCLRR_ATAH_PCLRR5    (0x20)  /* ATA_BUFFER_EN */
-+
-+/* Bit definitions and macros for PCLRR_ATAL */
-+#define MCF_GPIO_PCLRR_ATAL_PCLRR0    (0x01)  /* ATA_IORDY */
-+#define MCF_GPIO_PCLRR_ATAL_PCLRR1    (0x02)  /* ATA_DMARQ */
-+#define MCF_GPIO_PCLRR_ATAL_PCLRR2    (0x04)  /* ATA_RESET */
-+
-+/* Bit definitions and macros for PCLRR_FEC1H */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR0   (0x01)  /* FEC1_CRS / ATA_DATA6 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR1   (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR2   (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR3   (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR4   (0x10)  /* FEC1_COL / ATA_DATA7 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR5   (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR6   (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
-+#define MCF_GPIO_PCLRR_FEC1H_PCLRR7   (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
-+
-+/* Bit definitions and macros for PCLRR_FEC1L */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR0   (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR1   (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR2   (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR3   (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR4   (0x10)  /* FEC1_TXER / ATA_DATA0 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR5   (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR6   (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
-+#define MCF_GPIO_PCLRR_FEC1L_PCLRR7   (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
-+
-+/* Bit definitions and macros for PCLRR_FBADH */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR0   (0x01)  /* FB_AD24 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR1   (0x02)  /* FB_AD25 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR2   (0x04)  /* FB_AD26 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR3   (0x08)  /* FB_AD27 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR4   (0x10)  /* FB_AD28 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR5   (0x20)  /* FB_AD29 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR6   (0x40)  /* FB_AD30 */
-+#define MCF_GPIO_PCLRR_FBADH_PCLRR7   (0x80)  /* FB_AD31 */
-+
-+/* Bit definitions and macros for PCLRR_FBADMH */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR0  (0x01)  /* FB_AD16 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR1  (0x02)  /* FB_AD17 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR2  (0x04)  /* FB_AD18 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR3  (0x08)  /* FB_AD19 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR4  (0x10)  /* FB_AD20 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR5  (0x20)  /* FB_AD21 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR6  (0x40)  /* FB_AD22 */
-+#define MCF_GPIO_PCLRR_FBADMH_PCLRR7  (0x80)  /* FB_AD23 */
-+
-+/* Bit definitions and macros for PCLRR_FBADML */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR0  (0x01)  /* FB_AD8 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR1  (0x02)  /* FB_AD9 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR2  (0x04)  /* FB_AD10 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR3  (0x08)  /* FB_AD11 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR4  (0x10)  /* FB_AD12 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR5  (0x20)  /* FB_AD13 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR6  (0x40)  /* FB_AD14 */
-+#define MCF_GPIO_PCLRR_FBADML_PCLRR7  (0x80)  /* FB_AD15 */
-+
-+/* Bit definitions and macros for PCLRR_FBADL */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR0   (0x01)  /* FB_AD0 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR1   (0x02)  /* FB_AD1 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR2   (0x04)  /* FB_AD2 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR3   (0x08)  /* FB_AD3 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR4   (0x10)  /* FB_AD4 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR5   (0x20)  /* FB_AD5 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR6   (0x40)  /* FB_AD6 */
-+#define MCF_GPIO_PCLRR_FBADL_PCLRR7   (0x80)  /* FB_AD7 */
-+
-+/* Bit definitions and macros for PAR_FEC */
-+#define MCF_GPIO_PAR_FEC_FEC0(x)      (((x)&0x07))
-+#define MCF_GPIO_PAR_FEC_FEC1(x)      (((x)&0x07)<<4)
-+#define MCF_GPIO_PAR_FEC_FEC1_MASK    (0x8F)
-+#define MCF_GPIO_PAR_FEC_FEC1_MII     (0x70)
-+#define MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO       (0x30)
-+#define MCF_GPIO_PAR_FEC_FEC1_RMII_ATA        (0x20)
-+#define MCF_GPIO_PAR_FEC_FEC1_ATA     (0x10)
-+#define MCF_GPIO_PAR_FEC_FEC1_GPIO    (0x00)
-+#define MCF_GPIO_PAR_FEC_FEC0_MASK    (0xF8)
-+#define MCF_GPIO_PAR_FEC_FEC0_MII     (0x07)
-+#define MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO       (0x03)
-+#define MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI       (0x02)
-+#define MCF_GPIO_PAR_FEC_FEC0_ULPI    (0x01)
-+#define MCF_GPIO_PAR_FEC_FEC0_GPIO    (0x00)
-+
-+/* Bit definitions and macros for PAR_DMA */
-+#define MCF_GPIO_PAR_DMA_DREQ0                (0x01)
-+#define MCF_GPIO_PAR_DMA_DACK0(x)     (((x)&0x03)<<2)
-+#define MCF_GPIO_PAR_DMA_DREQ1(x)     (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_DMA_DACK1(x)     (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_DMA_DACK1_MASK   (0x3F)
-+#define MCF_GPIO_PAR_DMA_DACK1_DACK1  (0xC0)
-+#define MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR       (0x40)
-+#define MCF_GPIO_PAR_DMA_DACK1_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DMA_DREQ1_MASK   (0xCF)
-+#define MCF_GPIO_PAR_DMA_DREQ1_DREQ1  (0x30)
-+#define MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN (0x10)
-+#define MCF_GPIO_PAR_DMA_DREQ1_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DMA_DACK0_MASK   (0xF3)
-+#define MCF_GPIO_PAR_DMA_DACK0_DACK1  (0x0C)
-+#define MCF_GPIO_PAR_DMA_DACK0_ULPI_DIR       (0x04)
-+#define MCF_GPIO_PAR_DMA_DACK0_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DMA_DREQ0_DREQ0  (0x01)
-+#define MCF_GPIO_PAR_DMA_DREQ0_GPIO   (0x00)
-+
-+/* Bit definitions and macros for PAR_FBCTL */
-+#define MCF_GPIO_PAR_FBCTL_TS(x)      (((x)&0x03)<<3)
-+#define MCF_GPIO_PAR_FBCTL_RW         (0x20)
-+#define MCF_GPIO_PAR_FBCTL_TA         (0x40)
-+#define MCF_GPIO_PAR_FBCTL_OE         (0x80)
-+#define MCF_GPIO_PAR_FBCTL_OE_OE      (0x80)
-+#define MCF_GPIO_PAR_FBCTL_OE_GPIO    (0x00)
-+#define MCF_GPIO_PAR_FBCTL_TA_TA      (0x40)
-+#define MCF_GPIO_PAR_FBCTL_TA_GPIO    (0x00)
-+#define MCF_GPIO_PAR_FBCTL_RW_RW      (0x20)
-+#define MCF_GPIO_PAR_FBCTL_RW_GPIO    (0x00)
-+#define MCF_GPIO_PAR_FBCTL_TS_MASK    (0xE7)
-+#define MCF_GPIO_PAR_FBCTL_TS_TS      (0x18)
-+#define MCF_GPIO_PAR_FBCTL_TS_ALE     (0x10)
-+#define MCF_GPIO_PAR_FBCTL_TS_TBST    (0x08)
-+#define MCF_GPIO_PAR_FBCTL_TS_GPIO    (0x80)
-+
-+/* Bit definitions and macros for PAR_DSPI */
-+#define MCF_GPIO_PAR_DSPI_SCK         (0x01)
-+#define MCF_GPIO_PAR_DSPI_SOUT                (0x02)
-+#define MCF_GPIO_PAR_DSPI_SIN         (0x04)
-+#define MCF_GPIO_PAR_DSPI_PCS0                (0x08)
-+#define MCF_GPIO_PAR_DSPI_PCS1                (0x10)
-+#define MCF_GPIO_PAR_DSPI_PCS2                (0x20)
-+#define MCF_GPIO_PAR_DSPI_PCS5                (0x40)
-+#define MCF_GPIO_PAR_DSPI_PCS5_PCS5   (0x40)
-+#define MCF_GPIO_PAR_DSPI_PCS5_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DSPI_PCS2_PCS2   (0x20)
-+#define MCF_GPIO_PAR_DSPI_PCS2_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DSPI_PCS1_PCS1   (0x10)
-+#define MCF_GPIO_PAR_DSPI_PCS1_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DSPI_PCS0_PCS0   (0x08)
-+#define MCF_GPIO_PAR_DSPI_PCS0_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DSPI_SIN_SIN     (0x04)
-+#define MCF_GPIO_PAR_DSPI_SIN_GPIO    (0x00)
-+#define MCF_GPIO_PAR_DSPI_SOUT_SOUT   (0x02)
-+#define MCF_GPIO_PAR_DSPI_SOUT_GPIO   (0x00)
-+#define MCF_GPIO_PAR_DSPI_SCK_SCK     (0x01)
-+#define MCF_GPIO_PAR_DSPI_SCK_GPIO    (0x00)
-+
-+/* Bit definitions and macros for PAR_BE */
-+#define MCF_GPIO_PAR_BE_BE0           (0x01)
-+#define MCF_GPIO_PAR_BE_BE1           (0x04)
-+#define MCF_GPIO_PAR_BE_BE2(x)                (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_BE_BE3(x)                (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_BE_BE3_MASK      (0x3F)
-+#define MCF_GPIO_PAR_BE_BE3_BE3               (0xC0)
-+#define MCF_GPIO_PAR_BE_BE3_TSIZ1     (0x80)
-+#define MCF_GPIO_PAR_BE_BE3_GPIO      (0x00)
-+#define MCF_GPIO_PAR_BE_BE2_MASK      (0xCF)
-+#define MCF_GPIO_PAR_BE_BE2_BE2               (0x30)
-+#define MCF_GPIO_PAR_BE_BE2_TSIZ0     (0x20)
-+#define MCF_GPIO_PAR_BE_BE2_GPIO      (0x00)
-+#define MCF_GPIO_PAR_BE_BE1_BE1               (0x04)
-+#define MCF_GPIO_PAR_BE_BE1_GPIO      (0x00)
-+#define MCF_GPIO_PAR_BE_BE0_BE0               (0x01)
-+#define MCF_GPIO_PAR_BE_BE0_GPIO      (0x00)
-+
-+/* Bit definitions and macros for PAR_CS */
-+#define MCF_GPIO_PAR_CS_CS1           (0x02)
-+#define MCF_GPIO_PAR_CS_CS2           (0x04)
-+#define MCF_GPIO_PAR_CS_CS3           (0x08)
-+#define MCF_GPIO_PAR_CS_CS3_CS3               (0x08)
-+#define MCF_GPIO_PAR_CS_CS3_GPIO      (0x00)
-+#define MCF_GPIO_PAR_CS_CS2_CS2               (0x04)
-+#define MCF_GPIO_PAR_CS_CS2_GPIO      (0x00)
-+#define MCF_GPIO_PAR_CS_CS1_CS1               (0x02)
-+#define MCF_GPIO_PAR_CS_CS1_GPIO      (0x00)
-+
-+/* Bit definitions and macros for PAR_TIMER */
-+#define MCF_GPIO_PAR_TIMER_T0IN(x)    (((x)&0x03))
-+#define MCF_GPIO_PAR_TIMER_T1IN(x)    (((x)&0x03)<<2)
-+#define MCF_GPIO_PAR_TIMER_T2IN(x)    (((x)&0x03)<<4)
-+#define MCF_GPIO_PAR_TIMER_T3IN(x)    (((x)&0x03)<<6)
-+#define MCF_GPIO_PAR_TIMER_T3IN_MASK  (0x3F)
-+#define MCF_GPIO_PAR_TIMER_T3IN_T3IN  (0xC0)
-+#define MCF_GPIO_PAR_TIMER_T3IN_T3OUT (0x80)
-+#define MCF_GPIO_PAR_TIMER_T3IN_U2RXD (0x40)
-+#define MCF_GPIO_PAR_TIMER_T3IN_GPIO  (0x00)
-+#define MCF_GPIO_PAR_TIMER_T2IN_MASK  (0xCF)
-+#define MCF_GPIO_PAR_TIMER_T2IN_T2IN  (0x30)
-+#define MCF_GPIO_PAR_TIMER_T2IN_T2OUT (0x20)
-+#define MCF_GPIO_PAR_TIMER_T2IN_U2TXD (0x10)
-+#define MCF_GPIO_PAR_TIMER_T2IN_GPIO  (0x00)
-+#define MCF_GPIO_PAR_TIMER_T1IN_MASK  (0xF3)
-+#define MCF_GPIO_PAR_TIMER_T1IN_T1IN  (0x0C)
-+#define MCF_GPIO_PAR_TIMER_T1IN_T1OUT (0x08)
-+#define MCF_GPIO_PAR_TIMER_T1IN_U2CTS (0x04)
-+#define MCF_GPIO_PAR_TIMER_T1IN_GPIO  (0x00)
-+#define MCF_GPIO_PAR_TIMER_T0IN_MASK  (0xFC)
-+#define MCF_GPIO_PAR_TIMER_T0IN_T0IN  (0x03)
-+#define MCF_GPIO_PAR_TIMER_T0IN_T0OUT (0x02)
-+#define MCF_GPIO_PAR_TIMER_T0IN_U2RTS (0x01)
-+#define MCF_GPIO_PAR_TIMER_T0IN_GPIO  (0x00)
-+
-+/* Bit definitions and macros for PAR_USB */
-+#define MCF_GPIO_PAR_USB_VBUSOC(x)            (((x)&0x03))
-+#define MCF_GPIO_PAR_USB_VBUSEN(x)            (((x)&0x03)<<2)
-+#define MCF_GPIO_PAR_USB_VBUSEN_MASK          (0xF3)
-+#define MCF_GPIO_PAR_USB_VBUSEN_VBUSEN                (0x0C)
-+#define MCF_GPIO_PAR_USB_VBUSEN_USBPULLUP     (0x08)
-+#define MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT      (0x04)
-+#define MCF_GPIO_PAR_USB_VBUSEN_GPIO          (0x00)
-+#define MCF_GPIO_PAR_USB_VBUSOC_MASK          (0xFC)
-+#define MCF_GPIO_PAR_USB_VBUSOC_VBUSOC                (0x03)
-+#define MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP      (0x01)
-+#define MCF_GPIO_PAR_USB_VBUSOC_GPIO          (0x00)
-+
-+/* Bit definitions and macros for PAR_UART */
-+#define MCF_GPIO_PAR_UART_U0TXD               (0x01)
-+#define MCF_GPIO_PAR_UART_U0RXD               (0x02)
-+#define MCF_GPIO_PAR_UART_U0RTS               (0x04)
-+#define MCF_GPIO_PAR_UART_U0CTS               (0x08)
-+#define MCF_GPIO_PAR_UART_U1TXD               (0x10)
-+#define MCF_GPIO_PAR_UART_U1RXD               (0x20)
-+#define MCF_GPIO_PAR_UART_U1RTS               (0x40)
-+#define MCF_GPIO_PAR_UART_U1CTS               (0x80)
-+#define MCF_GPIO_PAR_UART_U1CTS_U1CTS (0x80)
-+#define MCF_GPIO_PAR_UART_U1CTS_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U1RTS_U1RTS (0x40)
-+#define MCF_GPIO_PAR_UART_U1RTS_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U1RXD_U1RXD (0x20)
-+#define MCF_GPIO_PAR_UART_U1RXD_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U1TXD_U1TXD (0x10)
-+#define MCF_GPIO_PAR_UART_U1TXD_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U0CTS_U0CTS (0x08)
-+#define MCF_GPIO_PAR_UART_U0CTS_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U0RTS_U0RTS (0x04)
-+#define MCF_GPIO_PAR_UART_U0RTS_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U0RXD_U0RXD (0x02)
-+#define MCF_GPIO_PAR_UART_U0RXD_GPIO  (0x00)
-+#define MCF_GPIO_PAR_UART_U0TXD_U0TXD (0x01)
-+#define MCF_GPIO_PAR_UART_U0TXD_GPIO  (0x00)
-+
-+/* Bit definitions and macros for PAR_FECI2C */
-+#define MCF_GPIO_PAR_FECI2C_SDA(x)    (((x)&0x0003))
-+#define MCF_GPIO_PAR_FECI2C_SCL(x)    (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_FECI2C_PAR_SDA(x)        (((x)&0x0003))
-+#define MCF_GPIO_PAR_FECI2C_PAR_SCL(x)        (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_FECI2C_MDIO0     (0x0010)
-+#define MCF_GPIO_PAR_FECI2C_MDC0      (0x0040)
-+#define MCF_GPIO_PAR_FECI2C_MDIO1(x)  (((x)&0x0003)<<8)
-+#define MCF_GPIO_PAR_FECI2C_MDC1(x)   (((x)&0x0003)<<10)
-+#define MCF_GPIO_PAR_FECI2C_MDC1_MASK (0xF3FF)
-+#define MCF_GPIO_PAR_FECI2C_MDC1_MDC1 (0x0C00)
-+#define MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR (0x0800)
-+#define MCF_GPIO_PAR_FECI2C_MDC1_GPIO (0x0000)
-+#define MCF_GPIO_PAR_FECI2C_MDIO1_MASK        (0xFCFF)
-+#define MCF_GPIO_PAR_FECI2C_MDIO1_MDIO1       (0x0300)
-+#define MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW (0x0200)
-+#define MCF_GPIO_PAR_FECI2C_MDIO1_GPIO        (0x0000)
-+#define MCF_GPIO_PAR_FECI2C_MDC0_MDC0 (0x0040)
-+#define MCF_GPIO_PAR_FECI2C_MDC0_GPIO (0x0000)
-+#define MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0       (0x0010)
-+#define MCF_GPIO_PAR_FECI2C_MDIO0_GPIO        (0x0000)
-+#define MCF_GPIO_PAR_FECI2C_SCL_MASK  (0xFFF3)
-+#define MCF_GPIO_PAR_FECI2C_SCL_SCL   (0x000C)
-+#define MCF_GPIO_PAR_FECI2C_SCL_U2TXD (0x0004)
-+#define MCF_GPIO_PAR_FECI2C_SCL_GPIO  (0x0000)
-+#define MCF_GPIO_PAR_FECI2C_SDA_MASK  (0xFFFC)
-+#define MCF_GPIO_PAR_FECI2C_SDA_SDA   (0x0003)
-+#define MCF_GPIO_PAR_FECI2C_SDA_U2RXD (0x0001)
-+#define MCF_GPIO_PAR_FECI2C_SDA_GPIO  (0x0000)
-+
-+/* Bit definitions and macros for PAR_SSI */
-+#define MCF_GPIO_PAR_SSI_MCLK         (0x0001)
-+#define MCF_GPIO_PAR_SSI_STXD(x)      (((x)&0x0003)<<2)
-+#define MCF_GPIO_PAR_SSI_SRXD(x)      (((x)&0x0003)<<4)
-+#define MCF_GPIO_PAR_SSI_FS(x)                (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_SSI_BCLK(x)      (((x)&0x0003)<<8)
-+#define MCF_GPIO_PAR_SSI_BCLK_MASK    (0xFCFF)
-+#define MCF_GPIO_PAR_SSI_BCLK_BCLK    (0x0300)
-+#define MCF_GPIO_PAR_SSI_BCLK_U1CTS   (0x0200)
-+#define MCF_GPIO_PAR_SSI_BCLK_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_SSI_FS_MASK      (0xFF3F)
-+#define MCF_GPIO_PAR_SSI_FS_FS                (0x00C0)
-+#define MCF_GPIO_PAR_SSI_FS_U1RTS     (0x0080)
-+#define MCF_GPIO_PAR_SSI_FS_GPIO      (0x0000)
-+#define MCF_GPIO_PAR_SSI_SRXD_MASK    (0xFFCF)
-+#define MCF_GPIO_PAR_SSI_SRXD_SRXD    (0x0030)
-+#define MCF_GPIO_PAR_SSI_SRXD_U1RXD   (0x0020)
-+#define MCF_GPIO_PAR_SSI_SRXD_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_SSI_STXD_MASK    (0xFFF3)
-+#define MCF_GPIO_PAR_SSI_STXD_STXD    (0x000C)
-+#define MCF_GPIO_PAR_SSI_STXD_U1TXD   (0x0008)
-+#define MCF_GPIO_PAR_SSI_STXD_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_SSI_MCLK_MCLK    (0x0001)
-+#define MCF_GPIO_PAR_SSI_MCLK_GPIO    (0x0000)
-+
-+/* Bit definitions and macros for PAR_ATA */
-+#define MCF_GPIO_PAR_ATA_IORDY                (0x0001)
-+#define MCF_GPIO_PAR_ATA_DMARQ                (0x0002)
-+#define MCF_GPIO_PAR_ATA_RESET                (0x0004)
-+#define MCF_GPIO_PAR_ATA_DA0          (0x0020)
-+#define MCF_GPIO_PAR_ATA_DA1          (0x0040)
-+#define MCF_GPIO_PAR_ATA_DA2          (0x0080)
-+#define MCF_GPIO_PAR_ATA_CS0          (0x0100)
-+#define MCF_GPIO_PAR_ATA_CS1          (0x0200)
-+#define MCF_GPIO_PAR_ATA_BUFEN                (0x0400)
-+#define MCF_GPIO_PAR_ATA_BUFEN_BUFEN  (0x0400)
-+#define MCF_GPIO_PAR_ATA_BUFEN_GPIO   (0x0000)
-+#define MCF_GPIO_PAR_ATA_CS1_CS1      (0x0200)
-+#define MCF_GPIO_PAR_ATA_CS1_GPIO     (0x0000)
-+#define MCF_GPIO_PAR_ATA_CS0_CS0      (0x0100)
-+#define MCF_GPIO_PAR_ATA_CS0_GPIO     (0x0000)
-+#define MCF_GPIO_PAR_ATA_DA2_DA2      (0x0080)
-+#define MCF_GPIO_PAR_ATA_DA2_GPIO     (0x0000)
-+#define MCF_GPIO_PAR_ATA_DA1_DA1      (0x0040)
-+#define MCF_GPIO_PAR_ATA_DA1_GPIO     (0x0000)
-+#define MCF_GPIO_PAR_ATA_DA0_DA0      (0x0020)
-+#define MCF_GPIO_PAR_ATA_DA0_GPIO     (0x0000)
-+#define MCF_GPIO_PAR_ATA_RESET_RESET  (0x0004)
-+#define MCF_GPIO_PAR_ATA_RESET_GPIO   (0x0000)
-+#define MCF_GPIO_PAR_ATA_DMARQ_DMARQ  (0x0002)
-+#define MCF_GPIO_PAR_ATA_DMARQ_GPIO   (0x0000)
-+#define MCF_GPIO_PAR_ATA_IORDY_IORDY  (0x0001)
-+#define MCF_GPIO_PAR_ATA_IORDY_GPIO   (0x0000)
-+
-+/* Bit definitions and macros for PAR_IRQ */
-+#define MCF_GPIO_PAR_IRQ_IRQ1         (0x02)
-+#define MCF_GPIO_PAR_IRQ_IRQ4         (0x10)
-+#define MCF_GPIO_PAR_IRQ_IRQ4_IRQ4    (0x10)
-+#define MCF_GPIO_PAR_IRQ_IRQ4_GPIO    (0x00)
-+#define MCF_GPIO_PAR_IRQ_IRQ1_IRQ1    (0x02)
-+#define MCF_GPIO_PAR_IRQ_IRQ1_GPIO    (0x00)
-+
-+/* Bit definitions and macros for PAR_PCI */
-+#define MCF_GPIO_PAR_PCI_REQ0         (0x0001)
-+#define MCF_GPIO_PAR_PCI_REQ1         (0x0004)
-+#define MCF_GPIO_PAR_PCI_REQ2         (0x0010)
-+#define MCF_GPIO_PAR_PCI_REQ3(x)      (((x)&0x0003)<<6)
-+#define MCF_GPIO_PAR_PCI_GNT0         (0x0100)
-+#define MCF_GPIO_PAR_PCI_GNT1         (0x0400)
-+#define MCF_GPIO_PAR_PCI_GNT2         (0x1000)
-+#define MCF_GPIO_PAR_PCI_GNT3(x)      (((x)&0x0003)<<14)
-+#define MCF_GPIO_PAR_PCI_GNT3_MASK    (0x3FFF)
-+#define MCF_GPIO_PAR_PCI_GNT3_GNT3    (0xC000)
-+#define MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK       (0x8000)
-+#define MCF_GPIO_PAR_PCI_GNT3_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_GNT2_GNT2    (0x1000)
-+#define MCF_GPIO_PAR_PCI_GNT2_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_GNT1_GNT1    (0x0400)
-+#define MCF_GPIO_PAR_PCI_GNT1_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_GNT0_GNT0    (0x0100)
-+#define MCF_GPIO_PAR_PCI_GNT0_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_REQ3_MASK    (0xFF3F)
-+#define MCF_GPIO_PAR_PCI_REQ3_REQ3    (0x00C0)
-+#define MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ       (0x0080)
-+#define MCF_GPIO_PAR_PCI_REQ3_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_REQ2_REQ2    (0x0010)
-+#define MCF_GPIO_PAR_PCI_REQ2_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_REQ1_REQ1    (0x0040)
-+#define MCF_GPIO_PAR_PCI_REQ1_GPIO    (0x0000)
-+#define MCF_GPIO_PAR_PCI_REQ0_REQ0    (0x0001)
-+#define MCF_GPIO_PAR_PCI_REQ0_GPIO    (0x0000)
-+
-+/* Bit definitions and macros for MSCR_SDRAM */
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL(x)          (((x)&0x03))
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK(x)          (((x)&0x03)<<2)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS(x)          (((x)&0x03)<<4)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA(x)         (((x)&0x03)<<6)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA_MASK               (0x3F)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR1               (0xC0)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR2               (0x80)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA_FS_LPDDR   (0x40)
-+#define MCF_GPIO_MSCR_SDRAM_SDDATA_HS_LPDDR   (0x00)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS_MASK                (0xCF)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR1                (0x30)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR2                (0x20)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS_FS_LPDDR    (0x10)
-+#define MCF_GPIO_MSCR_SDRAM_SDDQS_HS_LPDDR    (0x00)
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK_MASK                (0xF3)
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR1                (0x0C)
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR2                (0x08)
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK_FS_LPDDR    (0x04)
-+#define MCF_GPIO_MSCR_SDRAM_SDCLK_HS_LPDDR    (0x00)
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL_MASK                (0xFC)
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR1                (0x03)
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR2                (0x02)
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL_FS_LPDDR    (0x01)
-+#define MCF_GPIO_MSCR_SDRAM_SDCTL_HS_LPDDR    (0x00)
-+
-+/* Bit definitions and macros for MSCR_PCI */
-+#define MCF_GPIO_MSCR_PCI_PCI         (0x01)
-+#define MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ        (0x01)
-+#define MCF_GPIO_MSCR_PCI_PCI_LO_33MHZ        (0x00)
-+
-+/* Bit definitions and macros for DSCR_I2C */
-+#define MCF_GPIO_DSCR_I2C_I2C(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_20PF       (0x01)
-+#define MCF_GPIO_DSCR_I2C_I2C_LOAD_10PF       (0x00)
-+
-+/* Bit definitions and macros for DSCR_FLEXBUS */
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADL(x)                (((x)&0x03))
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADH(x)                (((x)&0x03)<<2)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL(x)                (((x)&0x03)<<4)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK(x)                (((x)&0x03)<<6)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_50PF (0xC0)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_30P  (0x80)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_20PF (0x40)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_10PF (0x00)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_50PF (0x30)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_30PF (0x20)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_20PF (0x10)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_10PF (0x00)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_50PF (0x0C)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_30PF (0x08)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_20PF (0x04)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_10PF (0x00)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_50PF (0x03)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_30PF (0x02)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_20PF (0x01)
-+#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_10PF (0x00)
-+
-+/* Bit definitions and macros for DSCR_FEC */
-+#define MCF_GPIO_DSCR_FEC_FEC0(x)             (((x)&0x03))
-+#define MCF_GPIO_DSCR_FEC_FEC1(x)             (((x)&0x03)<<2)
-+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_50PF      (0x0C)
-+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_30PF      (0x08)
-+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_20PF      (0x04)
-+#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_10PF      (0x00)
-+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_50PF      (0x03)
-+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_30PF      (0x02)
-+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_20PF      (0x01)
-+#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_10PF      (0x00)
-+
-+/* Bit definitions and macros for DSCR_UART */
-+#define MCF_GPIO_DSCR_UART_UART0(x)           (((x)&0x03))
-+#define MCF_GPIO_DSCR_UART_UART1(x)           (((x)&0x03)<<2)
-+#define MCF_GPIO_DSCR_UART_UART1_LOAD_50PF    (0x0C)
-+#define MCF_GPIO_DSCR_UART_UART1_LOAD_30PF    (0x08)
-+#define MCF_GPIO_DSCR_UART_UART1_LOAD_20PF    (0x04)
-+#define MCF_GPIO_DSCR_UART_UART1_LOAD_10PF    (0x00)
-+#define MCF_GPIO_DSCR_UART_UART0_LOAD_50PF    (0x03)
-+#define MCF_GPIO_DSCR_UART_UART0_LOAD_30PF    (0x02)
-+#define MCF_GPIO_DSCR_UART_UART0_LOAD_20PF    (0x01)
-+#define MCF_GPIO_DSCR_UART_UART0_LOAD_10PF    (0x00)
-+
-+/* Bit definitions and macros for DSCR_DSPI */
-+#define MCF_GPIO_DSCR_DSPI_DSPI(x)            (((x)&0x03))
-+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_50PF     (0x03)
-+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_30PF     (0x02)
-+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_20PF     (0x01)
-+#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_10PF     (0x00)
-+
-+/* Bit definitions and macros for DSCR_TIMER */
-+#define MCF_GPIO_DSCR_TIMER_TIMER(x)          (((x)&0x03))
-+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_50PF   (0x03)
-+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_30PF   (0x02)
-+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_20PF   (0x01)
-+#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_10PF   (0x00)
-+
-+/* Bit definitions and macros for DSCR_SSI */
-+#define MCF_GPIO_DSCR_SSI_SSI(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_20PF (0x01)
-+#define MCF_GPIO_DSCR_SSI_SSI_LOAD_10PF (0x00)
-+
-+/* Bit definitions and macros for DSCR_DMA */
-+#define MCF_GPIO_DSCR_DMA_DMA(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_20PF       (0x01)
-+#define MCF_GPIO_DSCR_DMA_DMA_LOAD_10PF       (0x00)
-+
-+/* Bit definitions and macros for DSCR_DEBUG */
-+#define MCF_GPIO_DSCR_DEBUG_DEBUG(x)          (((x)&0x03))
-+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_50PF   (0x03)
-+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_30PF   (0x02)
-+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_20PF   (0x01)
-+#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_10PF   (0x00)
-+
-+/* Bit definitions and macros for DSCR_RESET */
-+#define MCF_GPIO_DSCR_RESET_RESET(x)          (((x)&0x03))
-+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_50PF   (0x03)
-+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_30PF   (0x02)
-+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_20PF   (0x01)
-+#define MCF_GPIO_DSCR_RESET_RESET_LOAD_10PF   (0x00)
-+
-+/* Bit definitions and macros for DSCR_IRQ */
-+#define MCF_GPIO_DSCR_IRQ_IRQ(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_20PF       (0x01)
-+#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_10PF       (0x00)
-+
-+/* Bit definitions and macros for DSCR_USB */
-+#define MCF_GPIO_DSCR_USB_USB(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_USB_USB_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_USB_USB_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_USB_USB_LOAD_20PF       (0x01)
-+#define MCF_GPIO_DSCR_USB_USB_LOAD_10PF       (0x00)
-+
-+/* Bit definitions and macros for DSCR_ATA */
-+#define MCF_GPIO_DSCR_ATA_ATA(x)      (((x)&0x03))
-+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_50PF       (0x03)
-+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_30PF       (0x02)
-+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_20PF       (0x01)
-+#define MCF_GPIO_DSCR_ATA_ATA_LOAD_10PF       (0x00)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_GPIO_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_i2c.h
-@@ -0,0 +1,39 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_I2C_H__
-+#define __MCF5445X_I2C_H__
-+
-+/*********************************************************************
-+*
-+* I2C Module (I2C)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_I2C_I2ADR (volatile u8 *)(0xFC058000)
-+#define MCF_I2C_I2FDR (volatile u8 *)(0xFC058004)
-+#define MCF_I2C_I2CR  (volatile u8 *)(0xFC058008)
-+#define MCF_I2C_I2SR  (volatile u8 *)(0xFC05800C)
-+#define MCF_I2C_I2DR  (volatile u8 *)(0xFC058010)
-+
-+/* Bit definitions and macros for I2AR */
-+#define MCF_I2C_I2AR_ADR(x)   (((x)&0x7F)<<1)
-+
-+/* Bit definitions and macros for I2FDR */
-+#define MCF_I2C_I2FDR_IC(x)   (((x)&0x3F))
-+
-+/* Bit definitions and macros for I2DR */
-+#define MCF_I2C_I2DR_DATA(x)  (x)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_I2C_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_intc.h
-@@ -0,0 +1,724 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_INTC_H__
-+#define __MCF5445X_INTC_H__
-+
-+/*********************************************************************
-+*
-+* Interrupt Controller (INTC)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_INTC0_IPRH          MCF_REG32(0xFC048000)
-+#define MCF_INTC0_IPRL          MCF_REG32(0xFC048004)
-+#define MCF_INTC0_IMRH          MCF_REG32(0xFC048008)
-+#define MCF_INTC0_IMRL          MCF_REG32(0xFC04800C)
-+#define MCF_INTC0_INTFRCH       MCF_REG32(0xFC048010)
-+#define MCF_INTC0_INTFRCL       MCF_REG32(0xFC048014)
-+#define MCF_INTC0_ICONFIG       MCF_REG16(0xFC04801A)
-+#define MCF_INTC0_SIMR          MCF_REG08(0xFC04801C)
-+#define MCF_INTC0_CIMR          MCF_REG08(0xFC04801D)
-+#define MCF_INTC0_CLMASK        MCF_REG08(0xFC04801E)
-+#define MCF_INTC0_SLMASK        MCF_REG08(0xFC04801F)
-+#define MCF_INTC0_ICR1          MCF_REG08(0xFC048041)
-+#define MCF_INTC0_ICR2          MCF_REG08(0xFC048042)
-+#define MCF_INTC0_ICR3          MCF_REG08(0xFC048043)
-+#define MCF_INTC0_ICR4          MCF_REG08(0xFC048044)
-+#define MCF_INTC0_ICR5          MCF_REG08(0xFC048045)
-+#define MCF_INTC0_ICR6          MCF_REG08(0xFC048046)
-+#define MCF_INTC0_ICR7          MCF_REG08(0xFC048047)
-+#define MCF_INTC0_ICR8          MCF_REG08(0xFC048048)
-+#define MCF_INTC0_ICR9          MCF_REG08(0xFC048049)
-+#define MCF_INTC0_ICR10         MCF_REG08(0xFC04804A)
-+#define MCF_INTC0_ICR11         MCF_REG08(0xFC04804B)
-+#define MCF_INTC0_ICR12         MCF_REG08(0xFC04804C)
-+#define MCF_INTC0_ICR13         MCF_REG08(0xFC04804D)
-+#define MCF_INTC0_ICR14         MCF_REG08(0xFC04804E)
-+#define MCF_INTC0_ICR15         MCF_REG08(0xFC04804F)
-+#define MCF_INTC0_ICR16         MCF_REG08(0xFC048050)
-+#define MCF_INTC0_ICR17         MCF_REG08(0xFC048051)
-+#define MCF_INTC0_ICR18         MCF_REG08(0xFC048052)
-+#define MCF_INTC0_ICR19         MCF_REG08(0xFC048053)
-+#define MCF_INTC0_ICR20         MCF_REG08(0xFC048054)
-+#define MCF_INTC0_ICR21         MCF_REG08(0xFC048055)
-+#define MCF_INTC0_ICR22         MCF_REG08(0xFC048056)
-+#define MCF_INTC0_ICR23         MCF_REG08(0xFC048057)
-+#define MCF_INTC0_ICR24         MCF_REG08(0xFC048058)
-+#define MCF_INTC0_ICR25         MCF_REG08(0xFC048059)
-+#define MCF_INTC0_ICR26         MCF_REG08(0xFC04805A)
-+#define MCF_INTC0_ICR27         MCF_REG08(0xFC04805B)
-+#define MCF_INTC0_ICR28         MCF_REG08(0xFC04805C)
-+#define MCF_INTC0_ICR29         MCF_REG08(0xFC04805D)
-+#define MCF_INTC0_ICR30         MCF_REG08(0xFC04805E)
-+#define MCF_INTC0_ICR31         MCF_REG08(0xFC04805F)
-+#define MCF_INTC0_ICR32         MCF_REG08(0xFC048060)
-+#define MCF_INTC0_ICR33         MCF_REG08(0xFC048061)
-+#define MCF_INTC0_ICR34         MCF_REG08(0xFC048062)
-+#define MCF_INTC0_ICR35         MCF_REG08(0xFC048063)
-+#define MCF_INTC0_ICR36         MCF_REG08(0xFC048064)
-+#define MCF_INTC0_ICR37         MCF_REG08(0xFC048065)
-+#define MCF_INTC0_ICR38         MCF_REG08(0xFC048066)
-+#define MCF_INTC0_ICR39         MCF_REG08(0xFC048067)
-+#define MCF_INTC0_ICR40         MCF_REG08(0xFC048068)
-+#define MCF_INTC0_ICR41         MCF_REG08(0xFC048069)
-+#define MCF_INTC0_ICR42         MCF_REG08(0xFC04806A)
-+#define MCF_INTC0_ICR43         MCF_REG08(0xFC04806B)
-+#define MCF_INTC0_ICR44         MCF_REG08(0xFC04806C)
-+#define MCF_INTC0_ICR45         MCF_REG08(0xFC04806D)
-+#define MCF_INTC0_ICR46         MCF_REG08(0xFC04806E)
-+#define MCF_INTC0_ICR47         MCF_REG08(0xFC04806F)
-+#define MCF_INTC0_ICR48         MCF_REG08(0xFC048070)
-+#define MCF_INTC0_ICR49         MCF_REG08(0xFC048071)
-+#define MCF_INTC0_ICR50         MCF_REG08(0xFC048072)
-+#define MCF_INTC0_ICR51         MCF_REG08(0xFC048073)
-+#define MCF_INTC0_ICR52         MCF_REG08(0xFC048074)
-+#define MCF_INTC0_ICR53         MCF_REG08(0xFC048075)
-+#define MCF_INTC0_ICR54         MCF_REG08(0xFC048076)
-+#define MCF_INTC0_ICR55         MCF_REG08(0xFC048077)
-+#define MCF_INTC0_ICR56         MCF_REG08(0xFC048078)
-+#define MCF_INTC0_ICR57         MCF_REG08(0xFC048079)
-+#define MCF_INTC0_ICR58         MCF_REG08(0xFC04807A)
-+#define MCF_INTC0_ICR59         MCF_REG08(0xFC04807B)
-+#define MCF_INTC0_ICR60         MCF_REG08(0xFC04807C)
-+#define MCF_INTC0_ICR61         MCF_REG08(0xFC04807D)
-+#define MCF_INTC0_ICR62         MCF_REG08(0xFC04807E)
-+#define MCF_INTC0_ICR63         MCF_REG08(0xFC04807F)
-+#define MCF_INTC0_SWIACK        MCF_REG08(0xFC0480E0)
-+#define MCF_INTC0_L1IACK        MCF_REG08(0xFC0480E4)
-+#define MCF_INTC0_L2IACK        MCF_REG08(0xFC0480E8)
-+#define MCF_INTC0_L3IACK        MCF_REG08(0xFC0480EC)
-+#define MCF_INTC0_L4IACK        MCF_REG08(0xFC0480F0)
-+#define MCF_INTC0_L5IACK        MCF_REG08(0xFC0480F4)
-+#define MCF_INTC0_L6IACK        MCF_REG08(0xFC0480F8)
-+#define MCF_INTC0_L7IACK        MCF_REG08(0xFC0480FC)
-+#define MCF_INTC1_IPRH          MCF_REG32(0xFC04C000)
-+#define MCF_INTC1_IPRL          MCF_REG32(0xFC04C004)
-+#define MCF_INTC1_IMRH          MCF_REG32(0xFC04C008)
-+#define MCF_INTC1_IMRL          MCF_REG32(0xFC04C00C)
-+#define MCF_INTC1_INTFRCH       MCF_REG32(0xFC04C010)
-+#define MCF_INTC1_INTFRCL       MCF_REG32(0xFC04C014)
-+#define MCF_INTC1_ICONFIG       MCF_REG16(0xFC04C01A)
-+#define MCF_INTC1_SIMR          MCF_REG08(0xFC04C01C)
-+#define MCF_INTC1_CIMR          MCF_REG08(0xFC04C01D)
-+#define MCF_INTC1_CLMASK        MCF_REG08(0xFC04C01E)
-+#define MCF_INTC1_SLMASK        MCF_REG08(0xFC04C01F)
-+#define MCF_INTC1_ICR1          MCF_REG08(0xFC04C041)
-+#define MCF_INTC1_ICR2          MCF_REG08(0xFC04C042)
-+#define MCF_INTC1_ICR3          MCF_REG08(0xFC04C043)
-+#define MCF_INTC1_ICR4          MCF_REG08(0xFC04C044)
-+#define MCF_INTC1_ICR5          MCF_REG08(0xFC04C045)
-+#define MCF_INTC1_ICR6          MCF_REG08(0xFC04C046)
-+#define MCF_INTC1_ICR7          MCF_REG08(0xFC04C047)
-+#define MCF_INTC1_ICR8          MCF_REG08(0xFC04C048)
-+#define MCF_INTC1_ICR9          MCF_REG08(0xFC04C049)
-+#define MCF_INTC1_ICR10         MCF_REG08(0xFC04C04A)
-+#define MCF_INTC1_ICR11         MCF_REG08(0xFC04C04B)
-+#define MCF_INTC1_ICR12         MCF_REG08(0xFC04C04C)
-+#define MCF_INTC1_ICR13         MCF_REG08(0xFC04C04D)
-+#define MCF_INTC1_ICR14         MCF_REG08(0xFC04C04E)
-+#define MCF_INTC1_ICR15         MCF_REG08(0xFC04C04F)
-+#define MCF_INTC1_ICR16         MCF_REG08(0xFC04C050)
-+#define MCF_INTC1_ICR17         MCF_REG08(0xFC04C051)
-+#define MCF_INTC1_ICR18         MCF_REG08(0xFC04C052)
-+#define MCF_INTC1_ICR19         MCF_REG08(0xFC04C053)
-+#define MCF_INTC1_ICR20         MCF_REG08(0xFC04C054)
-+#define MCF_INTC1_ICR21         MCF_REG08(0xFC04C055)
-+#define MCF_INTC1_ICR22         MCF_REG08(0xFC04C056)
-+#define MCF_INTC1_ICR23         MCF_REG08(0xFC04C057)
-+#define MCF_INTC1_ICR24         MCF_REG08(0xFC04C058)
-+#define MCF_INTC1_ICR25         MCF_REG08(0xFC04C059)
-+#define MCF_INTC1_ICR26         MCF_REG08(0xFC04C05A)
-+#define MCF_INTC1_ICR27         MCF_REG08(0xFC04C05B)
-+#define MCF_INTC1_ICR28         MCF_REG08(0xFC04C05C)
-+#define MCF_INTC1_ICR29         MCF_REG08(0xFC04C05D)
-+#define MCF_INTC1_ICR30         MCF_REG08(0xFC04C05E)
-+#define MCF_INTC1_ICR31         MCF_REG08(0xFC04C05F)
-+#define MCF_INTC1_ICR32         MCF_REG08(0xFC04C060)
-+#define MCF_INTC1_ICR33         MCF_REG08(0xFC04C061)
-+#define MCF_INTC1_ICR34         MCF_REG08(0xFC04C062)
-+#define MCF_INTC1_ICR35         MCF_REG08(0xFC04C063)
-+#define MCF_INTC1_ICR36         MCF_REG08(0xFC04C064)
-+#define MCF_INTC1_ICR37         MCF_REG08(0xFC04C065)
-+#define MCF_INTC1_ICR38         MCF_REG08(0xFC04C066)
-+#define MCF_INTC1_ICR39         MCF_REG08(0xFC04C067)
-+#define MCF_INTC1_ICR40         MCF_REG08(0xFC04C068)
-+#define MCF_INTC1_ICR41         MCF_REG08(0xFC04C069)
-+#define MCF_INTC1_ICR42         MCF_REG08(0xFC04C06A)
-+#define MCF_INTC1_ICR43         MCF_REG08(0xFC04C06B)
-+#define MCF_INTC1_ICR44         MCF_REG08(0xFC04C06C)
-+#define MCF_INTC1_ICR45         MCF_REG08(0xFC04C06D)
-+#define MCF_INTC1_ICR46         MCF_REG08(0xFC04C06E)
-+#define MCF_INTC1_ICR47         MCF_REG08(0xFC04C06F)
-+#define MCF_INTC1_ICR48         MCF_REG08(0xFC04C070)
-+#define MCF_INTC1_ICR49         MCF_REG08(0xFC04C071)
-+#define MCF_INTC1_ICR50         MCF_REG08(0xFC04C072)
-+#define MCF_INTC1_ICR51         MCF_REG08(0xFC04C073)
-+#define MCF_INTC1_ICR52         MCF_REG08(0xFC04C074)
-+#define MCF_INTC1_ICR53         MCF_REG08(0xFC04C075)
-+#define MCF_INTC1_ICR54         MCF_REG08(0xFC04C076)
-+#define MCF_INTC1_ICR55         MCF_REG08(0xFC04C077)
-+#define MCF_INTC1_ICR56         MCF_REG08(0xFC04C078)
-+#define MCF_INTC1_ICR57         MCF_REG08(0xFC04C079)
-+#define MCF_INTC1_ICR58         MCF_REG08(0xFC04C07A)
-+#define MCF_INTC1_ICR59         MCF_REG08(0xFC04C07B)
-+#define MCF_INTC1_ICR60         MCF_REG08(0xFC04C07C)
-+#define MCF_INTC1_ICR61         MCF_REG08(0xFC04C07D)
-+#define MCF_INTC1_ICR62         MCF_REG08(0xFC04C07E)
-+#define MCF_INTC1_ICR63         MCF_REG08(0xFC04C07F)
-+#define MCF_INTC1_SWIACK        MCF_REG08(0xFC04C0E0)
-+#define MCF_INTC1_L1IACK        MCF_REG08(0xFC04C0E4)
-+#define MCF_INTC1_L2IACK        MCF_REG08(0xFC04C0E8)
-+#define MCF_INTC1_L3IACK        MCF_REG08(0xFC04C0EC)
-+#define MCF_INTC1_L4IACK        MCF_REG08(0xFC04C0F0)
-+#define MCF_INTC1_L5IACK        MCF_REG08(0xFC04C0F4)
-+#define MCF_INTC1_L6IACK        MCF_REG08(0xFC04C0F8
-+#define MCF_INTC1_L7IACK        MCF_REG08(0xFC04C0FC)
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_INTC0_ICR(x)        MCF_REG08(0xFC048041+((x-1)*0x001))
-+#define MCF_INTC0_LIACK(x)      MCF_REG08(0xFC0480E4+((x-1)*0x004))
-+#define MCF_INTC1_ICR(x)        MCF_REG08(0xFC04C041+((x-1)*0x001))
-+#define MCF_INTC1_LIACK(x)      MCF_REG08(0xFC04C0E4+((x-1)*0x004))
-+
-+/* Parameterized register read/write macros for multiple modules */
-+#define MCF_INTC_IPRH(x)        MCF_REG32(0xFC048000+((x)*0x4000))
-+#define MCF_INTC_IPRL(x)        MCF_REG32(0xFC048004+((x)*0x4000))
-+#define MCF_INTC_IMRH(x)        MCF_REG32(0xFC048008+((x)*0x4000))
-+#define MCF_INTC_IMRL(x)        MCF_REG32(0xFC04800C+((x)*0x4000))
-+#define MCF_INTC_INTFRCH(x)     MCF_REG32(0xFC048010+((x)*0x4000))
-+#define MCF_INTC_INTFRCL(x)     MCF_REG32(0xFC048014+((x)*0x4000))
-+#define MCF_INTC_ICONFIG(x)     MCF_REG16(0xFC04801A+((x)*0x4000))
-+#define MCF_INTC_SIMR(x)        MCF_REG08(0xFC04801C+((x)*0x4000))
-+#define MCF_INTC_CIMR(x)        MCF_REG08(0xFC04801D+((x)*0x4000))
-+#define MCF_INTC_CLMASK(x)      MCF_REG08(0xFC04801E+((x)*0x4000))
-+#define MCF_INTC_SLMASK(x)      MCF_REG08(0xFC04801F+((x)*0x4000))
-+#define MCF_INTC_ICR1(x)        MCF_REG08(0xFC048041+((x)*0x4000))
-+#define MCF_INTC_ICR2(x)        MCF_REG08(0xFC048042+((x)*0x4000))
-+#define MCF_INTC_ICR3(x)        MCF_REG08(0xFC048043+((x)*0x4000))
-+#define MCF_INTC_ICR4(x)        MCF_REG08(0xFC048044+((x)*0x4000))
-+#define MCF_INTC_ICR5(x)        MCF_REG08(0xFC048045+((x)*0x4000))
-+#define MCF_INTC_ICR6(x)        MCF_REG08(0xFC048046+((x)*0x4000))
-+#define MCF_INTC_ICR7(x)        MCF_REG08(0xFC048047+((x)*0x4000))
-+#define MCF_INTC_ICR8(x)        MCF_REG08(0xFC048048+((x)*0x4000))
-+#define MCF_INTC_ICR9(x)        MCF_REG08(0xFC048049+((x)*0x4000))
-+#define MCF_INTC_ICR10(x)       MCF_REG08(0xFC04804A+((x)*0x4000))
-+#define MCF_INTC_ICR11(x)       MCF_REG08(0xFC04804B+((x)*0x4000))
-+#define MCF_INTC_ICR12(x)       MCF_REG08(0xFC04804C+((x)*0x4000))
-+#define MCF_INTC_ICR13(x)       MCF_REG08(0xFC04804D+((x)*0x4000))
-+#define MCF_INTC_ICR14(x)       MCF_REG08(0xFC04804E+((x)*0x4000))
-+#define MCF_INTC_ICR15(x)       MCF_REG08(0xFC04804F+((x)*0x4000))
-+#define MCF_INTC_ICR16(x)       MCF_REG08(0xFC048050+((x)*0x4000))
-+#define MCF_INTC_ICR17(x)       MCF_REG08(0xFC048051+((x)*0x4000))
-+#define MCF_INTC_ICR18(x)       MCF_REG08(0xFC048052+((x)*0x4000))
-+#define MCF_INTC_ICR19(x)       MCF_REG08(0xFC048053+((x)*0x4000))
-+#define MCF_INTC_ICR20(x)       MCF_REG08(0xFC048054+((x)*0x4000))
-+#define MCF_INTC_ICR21(x)       MCF_REG08(0xFC048055+((x)*0x4000))
-+#define MCF_INTC_ICR22(x)       MCF_REG08(0xFC048056+((x)*0x4000))
-+#define MCF_INTC_ICR23(x)       MCF_REG08(0xFC048057+((x)*0x4000))
-+#define MCF_INTC_ICR24(x)       MCF_REG08(0xFC048058+((x)*0x4000))
-+#define MCF_INTC_ICR25(x)       MCF_REG08(0xFC048059+((x)*0x4000))
-+#define MCF_INTC_ICR26(x)       MCF_REG08(0xFC04805A+((x)*0x4000))
-+#define MCF_INTC_ICR27(x)       MCF_REG08(0xFC04805B+((x)*0x4000))
-+#define MCF_INTC_ICR28(x)       MCF_REG08(0xFC04805C+((x)*0x4000))
-+#define MCF_INTC_ICR29(x)       MCF_REG08(0xFC04805D+((x)*0x4000))
-+#define MCF_INTC_ICR30(x)       MCF_REG08(0xFC04805E+((x)*0x4000))
-+#define MCF_INTC_ICR31(x)       MCF_REG08(0xFC04805F+((x)*0x4000))
-+#define MCF_INTC_ICR32(x)       MCF_REG08(0xFC048060+((x)*0x4000))
-+#define MCF_INTC_ICR33(x)       MCF_REG08(0xFC048061+((x)*0x4000))
-+#define MCF_INTC_ICR34(x)       MCF_REG08(0xFC048062+((x)*0x4000))
-+#define MCF_INTC_ICR35(x)       MCF_REG08(0xFC048063+((x)*0x4000))
-+#define MCF_INTC_ICR36(x)       MCF_REG08(0xFC048064+((x)*0x4000))
-+#define MCF_INTC_ICR37(x)       MCF_REG08(0xFC048065+((x)*0x4000))
-+#define MCF_INTC_ICR38(x)       MCF_REG08(0xFC048066+((x)*0x4000))
-+#define MCF_INTC_ICR39(x)       MCF_REG08(0xFC048067+((x)*0x4000))
-+#define MCF_INTC_ICR40(x)       MCF_REG08(0xFC048068+((x)*0x4000))
-+#define MCF_INTC_ICR41(x)       MCF_REG08(0xFC048069+((x)*0x4000))
-+#define MCF_INTC_ICR42(x)       MCF_REG08(0xFC04806A+((x)*0x4000))
-+#define MCF_INTC_ICR43(x)       MCF_REG08(0xFC04806B+((x)*0x4000))
-+#define MCF_INTC_ICR44(x)       MCF_REG08(0xFC04806C+((x)*0x4000))
-+#define MCF_INTC_ICR45(x)       MCF_REG08(0xFC04806D+((x)*0x4000))
-+#define MCF_INTC_ICR46(x)       MCF_REG08(0xFC04806E+((x)*0x4000))
-+#define MCF_INTC_ICR47(x)       MCF_REG08(0xFC04806F+((x)*0x4000))
-+#define MCF_INTC_ICR48(x)       MCF_REG08(0xFC048070+((x)*0x4000))
-+#define MCF_INTC_ICR49(x)       MCF_REG08(0xFC048071+((x)*0x4000))
-+#define MCF_INTC_ICR50(x)       MCF_REG08(0xFC048072+((x)*0x4000))
-+#define MCF_INTC_ICR51(x)       MCF_REG08(0xFC048073+((x)*0x4000))
-+#define MCF_INTC_ICR52(x)       MCF_REG08(0xFC048074+((x)*0x4000))
-+#define MCF_INTC_ICR53(x)       MCF_REG08(0xFC048075+((x)*0x4000))
-+#define MCF_INTC_ICR54(x)       MCF_REG08(0xFC048076+((x)*0x4000))
-+#define MCF_INTC_ICR55(x)       MCF_REG08(0xFC048077+((x)*0x4000))
-+#define MCF_INTC_ICR56(x)       MCF_REG08(0xFC048078+((x)*0x4000))
-+#define MCF_INTC_ICR57(x)       MCF_REG08(0xFC048079+((x)*0x4000))
-+#define MCF_INTC_ICR58(x)       MCF_REG08(0xFC04807A+((x)*0x4000))
-+#define MCF_INTC_ICR59(x)       MCF_REG08(0xFC04807B+((x)*0x4000))
-+#define MCF_INTC_ICR60(x)       MCF_REG08(0xFC04807C+((x)*0x4000))
-+#define MCF_INTC_ICR61(x)       MCF_REG08(0xFC04807D+((x)*0x4000))
-+#define MCF_INTC_ICR62(x)       MCF_REG08(0xFC04807E+((x)*0x4000))
-+#define MCF_INTC_ICR63(x)       MCF_REG08(0xFC04807F+((x)*0x4000))
-+#define MCF_INTC_SWIACK(x)      MCF_REG08(0xFC0480E0+((x)*0x4000))
-+#define MCF_INTC_L1IACK(x)      MCF_REG08(0xFC0480E4+((x)*0x4000))
-+#define MCF_INTC_L2IACK(x)      MCF_REG08(0xFC0480E8+((x)*0x4000))
-+#define MCF_INTC_L3IACK(x)      MCF_REG08(0xFC0480EC+((x)*0x4000))
-+#define MCF_INTC_L4IACK(x)      MCF_REG08(0xFC0480F0+((x)*0x4000))
-+#define MCF_INTC_L5IACK(x)      MCF_REG08(0xFC0480F4+((x)*0x4000))
-+#define MCF_INTC_L6IACK(x)      MCF_REG08(0xFC0480F8+((x)*0x4000))
-+#define MCF_INTC_L7IACK(x)      MCF_REG08(0xFC0480FC+((x)*0x4000))
-+
-+/* Bit definitions and macros for IPRH */
-+#define MCF_INTC_IPRH_INT32     (0x00000001)
-+#define MCF_INTC_IPRH_INT33     (0x00000002)
-+#define MCF_INTC_IPRH_INT34     (0x00000004)
-+#define MCF_INTC_IPRH_INT35     (0x00000008)
-+#define MCF_INTC_IPRH_INT36     (0x00000010)
-+#define MCF_INTC_IPRH_INT37     (0x00000020)
-+#define MCF_INTC_IPRH_INT38     (0x00000040)
-+#define MCF_INTC_IPRH_INT39     (0x00000080)
-+#define MCF_INTC_IPRH_INT40     (0x00000100)
-+#define MCF_INTC_IPRH_INT41     (0x00000200)
-+#define MCF_INTC_IPRH_INT42     (0x00000400)
-+#define MCF_INTC_IPRH_INT43     (0x00000800)
-+#define MCF_INTC_IPRH_INT44     (0x00001000)
-+#define MCF_INTC_IPRH_INT45     (0x00002000)
-+#define MCF_INTC_IPRH_INT46     (0x00004000)
-+#define MCF_INTC_IPRH_INT47     (0x00008000)
-+#define MCF_INTC_IPRH_INT48     (0x00010000)
-+#define MCF_INTC_IPRH_INT49     (0x00020000)
-+#define MCF_INTC_IPRH_INT50     (0x00040000)
-+#define MCF_INTC_IPRH_INT51     (0x00080000)
-+#define MCF_INTC_IPRH_INT52     (0x00100000)
-+#define MCF_INTC_IPRH_INT53     (0x00200000)
-+#define MCF_INTC_IPRH_INT54     (0x00400000)
-+#define MCF_INTC_IPRH_INT55     (0x00800000)
-+#define MCF_INTC_IPRH_INT56     (0x01000000)
-+#define MCF_INTC_IPRH_INT57     (0x02000000)
-+#define MCF_INTC_IPRH_INT58     (0x04000000)
-+#define MCF_INTC_IPRH_INT59     (0x08000000)
-+#define MCF_INTC_IPRH_INT60     (0x10000000)
-+#define MCF_INTC_IPRH_INT61     (0x20000000)
-+#define MCF_INTC_IPRH_INT62     (0x40000000)
-+#define MCF_INTC_IPRH_INT63     (0x80000000)
-+
-+/* Bit definitions and macros for IPRL */
-+#define MCF_INTC_IPRL_INT0      (0x00000001)
-+#define MCF_INTC_IPRL_INT1      (0x00000002)
-+#define MCF_INTC_IPRL_INT2      (0x00000004)
-+#define MCF_INTC_IPRL_INT3      (0x00000008)
-+#define MCF_INTC_IPRL_INT4      (0x00000010)
-+#define MCF_INTC_IPRL_INT5      (0x00000020)
-+#define MCF_INTC_IPRL_INT6      (0x00000040)
-+#define MCF_INTC_IPRL_INT7      (0x00000080)
-+#define MCF_INTC_IPRL_INT8      (0x00000100)
-+#define MCF_INTC_IPRL_INT9      (0x00000200)
-+#define MCF_INTC_IPRL_INT10     (0x00000400)
-+#define MCF_INTC_IPRL_INT11     (0x00000800)
-+#define MCF_INTC_IPRL_INT12     (0x00001000)
-+#define MCF_INTC_IPRL_INT13     (0x00002000)
-+#define MCF_INTC_IPRL_INT14     (0x00004000)
-+#define MCF_INTC_IPRL_INT15     (0x00008000)
-+#define MCF_INTC_IPRL_INT16     (0x00010000)
-+#define MCF_INTC_IPRL_INT17     (0x00020000)
-+#define MCF_INTC_IPRL_INT18     (0x00040000)
-+#define MCF_INTC_IPRL_INT19     (0x00080000)
-+#define MCF_INTC_IPRL_INT20     (0x00100000)
-+#define MCF_INTC_IPRL_INT21     (0x00200000)
-+#define MCF_INTC_IPRL_INT22     (0x00400000)
-+#define MCF_INTC_IPRL_INT23     (0x00800000)
-+#define MCF_INTC_IPRL_INT24     (0x01000000)
-+#define MCF_INTC_IPRL_INT25     (0x02000000)
-+#define MCF_INTC_IPRL_INT26     (0x04000000)
-+#define MCF_INTC_IPRL_INT27     (0x08000000)
-+#define MCF_INTC_IPRL_INT28     (0x10000000)
-+#define MCF_INTC_IPRL_INT29     (0x20000000)
-+#define MCF_INTC_IPRL_INT30     (0x40000000)
-+#define MCF_INTC_IPRL_INT31     (0x80000000)
-+
-+/* Bit definitions and macros for IMRH */
-+#define MCF_INTC_IMRH_INT_MASK32    (0x00000001)
-+#define MCF_INTC_IMRH_INT_MASK33    (0x00000002)
-+#define MCF_INTC_IMRH_INT_MASK34    (0x00000004)
-+#define MCF_INTC_IMRH_INT_MASK35    (0x00000008)
-+#define MCF_INTC_IMRH_INT_MASK36    (0x00000010)
-+#define MCF_INTC_IMRH_INT_MASK37    (0x00000020)
-+#define MCF_INTC_IMRH_INT_MASK38    (0x00000040)
-+#define MCF_INTC_IMRH_INT_MASK39    (0x00000080)
-+#define MCF_INTC_IMRH_INT_MASK40    (0x00000100)
-+#define MCF_INTC_IMRH_INT_MASK41    (0x00000200)
-+#define MCF_INTC_IMRH_INT_MASK42    (0x00000400)
-+#define MCF_INTC_IMRH_INT_MASK43    (0x00000800)
-+#define MCF_INTC_IMRH_INT_MASK44    (0x00001000)
-+#define MCF_INTC_IMRH_INT_MASK45    (0x00002000)
-+#define MCF_INTC_IMRH_INT_MASK46    (0x00004000)
-+#define MCF_INTC_IMRH_INT_MASK47    (0x00008000)
-+#define MCF_INTC_IMRH_INT_MASK48    (0x00010000)
-+#define MCF_INTC_IMRH_INT_MASK49    (0x00020000)
-+#define MCF_INTC_IMRH_INT_MASK50    (0x00040000)
-+#define MCF_INTC_IMRH_INT_MASK51    (0x00080000)
-+#define MCF_INTC_IMRH_INT_MASK52    (0x00100000)
-+#define MCF_INTC_IMRH_INT_MASK53    (0x00200000)
-+#define MCF_INTC_IMRH_INT_MASK54    (0x00400000)
-+#define MCF_INTC_IMRH_INT_MASK55    (0x00800000)
-+#define MCF_INTC_IMRH_INT_MASK56    (0x01000000)
-+#define MCF_INTC_IMRH_INT_MASK57    (0x02000000)
-+#define MCF_INTC_IMRH_INT_MASK58    (0x04000000)
-+#define MCF_INTC_IMRH_INT_MASK59    (0x08000000)
-+#define MCF_INTC_IMRH_INT_MASK60    (0x10000000)
-+#define MCF_INTC_IMRH_INT_MASK61    (0x20000000)
-+#define MCF_INTC_IMRH_INT_MASK62    (0x40000000)
-+#define MCF_INTC_IMRH_INT_MASK63    (0x80000000)
-+
-+/* Bit definitions and macros for IMRL */
-+#define MCF_INTC_IMRL_INT_MASK0     (0x00000001)
-+#define MCF_INTC_IMRL_INT_MASK1     (0x00000002)
-+#define MCF_INTC_IMRL_INT_MASK2     (0x00000004)
-+#define MCF_INTC_IMRL_INT_MASK3     (0x00000008)
-+#define MCF_INTC_IMRL_INT_MASK4     (0x00000010)
-+#define MCF_INTC_IMRL_INT_MASK5     (0x00000020)
-+#define MCF_INTC_IMRL_INT_MASK6     (0x00000040)
-+#define MCF_INTC_IMRL_INT_MASK7     (0x00000080)
-+#define MCF_INTC_IMRL_INT_MASK8     (0x00000100)
-+#define MCF_INTC_IMRL_INT_MASK9     (0x00000200)
-+#define MCF_INTC_IMRL_INT_MASK10    (0x00000400)
-+#define MCF_INTC_IMRL_INT_MASK11    (0x00000800)
-+#define MCF_INTC_IMRL_INT_MASK12    (0x00001000)
-+#define MCF_INTC_IMRL_INT_MASK13    (0x00002000)
-+#define MCF_INTC_IMRL_INT_MASK14    (0x00004000)
-+#define MCF_INTC_IMRL_INT_MASK15    (0x00008000)
-+#define MCF_INTC_IMRL_INT_MASK16    (0x00010000)
-+#define MCF_INTC_IMRL_INT_MASK17    (0x00020000)
-+#define MCF_INTC_IMRL_INT_MASK18    (0x00040000)
-+#define MCF_INTC_IMRL_INT_MASK19    (0x00080000)
-+#define MCF_INTC_IMRL_INT_MASK20    (0x00100000)
-+#define MCF_INTC_IMRL_INT_MASK21    (0x00200000)
-+#define MCF_INTC_IMRL_INT_MASK22    (0x00400000)
-+#define MCF_INTC_IMRL_INT_MASK23    (0x00800000)
-+#define MCF_INTC_IMRL_INT_MASK24    (0x01000000)
-+#define MCF_INTC_IMRL_INT_MASK25    (0x02000000)
-+#define MCF_INTC_IMRL_INT_MASK26    (0x04000000)
-+#define MCF_INTC_IMRL_INT_MASK27    (0x08000000)
-+#define MCF_INTC_IMRL_INT_MASK28    (0x10000000)
-+#define MCF_INTC_IMRL_INT_MASK29    (0x20000000)
-+#define MCF_INTC_IMRL_INT_MASK30    (0x40000000)
-+#define MCF_INTC_IMRL_INT_MASK31    (0x80000000)
-+
-+/* Bit definitions and macros for INTFRCH */
-+#define MCF_INTC_INTFRCH_INTFRC32   (0x00000001)
-+#define MCF_INTC_INTFRCH_INTFRC33   (0x00000002)
-+#define MCF_INTC_INTFRCH_INTFRC34   (0x00000004)
-+#define MCF_INTC_INTFRCH_INTFRC35   (0x00000008)
-+#define MCF_INTC_INTFRCH_INTFRC36   (0x00000010)
-+#define MCF_INTC_INTFRCH_INTFRC37   (0x00000020)
-+#define MCF_INTC_INTFRCH_INTFRC38   (0x00000040)
-+#define MCF_INTC_INTFRCH_INTFRC39   (0x00000080)
-+#define MCF_INTC_INTFRCH_INTFRC40   (0x00000100)
-+#define MCF_INTC_INTFRCH_INTFRC41   (0x00000200)
-+#define MCF_INTC_INTFRCH_INTFRC42   (0x00000400)
-+#define MCF_INTC_INTFRCH_INTFRC43   (0x00000800)
-+#define MCF_INTC_INTFRCH_INTFRC44   (0x00001000)
-+#define MCF_INTC_INTFRCH_INTFRC45   (0x00002000)
-+#define MCF_INTC_INTFRCH_INTFRC46   (0x00004000)
-+#define MCF_INTC_INTFRCH_INTFRC47   (0x00008000)
-+#define MCF_INTC_INTFRCH_INTFRC48   (0x00010000)
-+#define MCF_INTC_INTFRCH_INTFRC49   (0x00020000)
-+#define MCF_INTC_INTFRCH_INTFRC50   (0x00040000)
-+#define MCF_INTC_INTFRCH_INTFRC51   (0x00080000)
-+#define MCF_INTC_INTFRCH_INTFRC52   (0x00100000)
-+#define MCF_INTC_INTFRCH_INTFRC53   (0x00200000)
-+#define MCF_INTC_INTFRCH_INTFRC54   (0x00400000)
-+#define MCF_INTC_INTFRCH_INTFRC55   (0x00800000)
-+#define MCF_INTC_INTFRCH_INTFRC56   (0x01000000)
-+#define MCF_INTC_INTFRCH_INTFRC57   (0x02000000)
-+#define MCF_INTC_INTFRCH_INTFRC58   (0x04000000)
-+#define MCF_INTC_INTFRCH_INTFRC59   (0x08000000)
-+#define MCF_INTC_INTFRCH_INTFRC60   (0x10000000)
-+#define MCF_INTC_INTFRCH_INTFRC61   (0x20000000)
-+#define MCF_INTC_INTFRCH_INTFRC62   (0x40000000)
-+#define MCF_INTC_INTFRCH_INTFRC63   (0x80000000)
-+
-+/* Bit definitions and macros for INTFRCL */
-+#define MCF_INTC_INTFRCL_INTFRC0    (0x00000001)
-+#define MCF_INTC_INTFRCL_INTFRC1    (0x00000002)
-+#define MCF_INTC_INTFRCL_INTFRC2    (0x00000004)
-+#define MCF_INTC_INTFRCL_INTFRC3    (0x00000008)
-+#define MCF_INTC_INTFRCL_INTFRC4    (0x00000010)
-+#define MCF_INTC_INTFRCL_INTFRC5    (0x00000020)
-+#define MCF_INTC_INTFRCL_INTFRC6    (0x00000040)
-+#define MCF_INTC_INTFRCL_INTFRC7    (0x00000080)
-+#define MCF_INTC_INTFRCL_INTFRC8    (0x00000100)
-+#define MCF_INTC_INTFRCL_INTFRC9    (0x00000200)
-+#define MCF_INTC_INTFRCL_INTFRC10   (0x00000400)
-+#define MCF_INTC_INTFRCL_INTFRC11   (0x00000800)
-+#define MCF_INTC_INTFRCL_INTFRC12   (0x00001000)
-+#define MCF_INTC_INTFRCL_INTFRC13   (0x00002000)
-+#define MCF_INTC_INTFRCL_INTFRC14   (0x00004000)
-+#define MCF_INTC_INTFRCL_INTFRC15   (0x00008000)
-+#define MCF_INTC_INTFRCL_INTFRC16   (0x00010000)
-+#define MCF_INTC_INTFRCL_INTFRC17   (0x00020000)
-+#define MCF_INTC_INTFRCL_INTFRC18   (0x00040000)
-+#define MCF_INTC_INTFRCL_INTFRC19   (0x00080000)
-+#define MCF_INTC_INTFRCL_INTFRC20   (0x00100000)
-+#define MCF_INTC_INTFRCL_INTFRC21   (0x00200000)
-+#define MCF_INTC_INTFRCL_INTFRC22   (0x00400000)
-+#define MCF_INTC_INTFRCL_INTFRC23   (0x00800000)
-+#define MCF_INTC_INTFRCL_INTFRC24   (0x01000000)
-+#define MCF_INTC_INTFRCL_INTFRC25   (0x02000000)
-+#define MCF_INTC_INTFRCL_INTFRC26   (0x04000000)
-+#define MCF_INTC_INTFRCL_INTFRC27   (0x08000000)
-+#define MCF_INTC_INTFRCL_INTFRC28   (0x10000000)
-+#define MCF_INTC_INTFRCL_INTFRC29   (0x20000000)
-+#define MCF_INTC_INTFRCL_INTFRC30   (0x40000000)
-+#define MCF_INTC_INTFRCL_INTFRC31   (0x80000000)
-+
-+/* Bit definitions and macros for ICONFIG */
-+#define MCF_INTC_ICONFIG_EMASK      (0x0020)
-+#define MCF_INTC_ICONFIG_ELVLPRI1   (0x0200)
-+#define MCF_INTC_ICONFIG_ELVLPRI2   (0x0400)
-+#define MCF_INTC_ICONFIG_ELVLPRI3   (0x0800)
-+#define MCF_INTC_ICONFIG_ELVLPRI4   (0x1000)
-+#define MCF_INTC_ICONFIG_ELVLPRI5   (0x2000)
-+#define MCF_INTC_ICONFIG_ELVLPRI6   (0x4000)
-+#define MCF_INTC_ICONFIG_ELVLPRI7   (0x8000)
-+
-+/* Bit definitions and macros for SIMR */
-+#define MCF_INTC_SIMR_SIMR(x)   (((x)&0x7F))
-+
-+/* Bit definitions and macros for CIMR */
-+#define MCF_INTC_CIMR_CIMR(x)   (((x)&0x7F))
-+
-+/* Bit definitions and macros for CLMASK */
-+#define MCF_INTC_CLMASK_CLMASK(x)   (((x)&0x0F))
-+
-+/* Bit definitions and macros for SLMASK */
-+#define MCF_INTC_SLMASK_SLMASK(x)   (((x)&0x0F))
-+
-+/* Bit definitions and macros for ICR group */
-+#define MCF_INTC_ICR_IL(x)      (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR1 */
-+#define MCF_INTC_ICR1_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR2 */
-+#define MCF_INTC_ICR2_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR3 */
-+#define MCF_INTC_ICR3_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR4 */
-+#define MCF_INTC_ICR4_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR5 */
-+#define MCF_INTC_ICR5_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR6 */
-+#define MCF_INTC_ICR6_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR7 */
-+#define MCF_INTC_ICR7_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR8 */
-+#define MCF_INTC_ICR8_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR9 */
-+#define MCF_INTC_ICR9_IL(x)     (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR10 */
-+#define MCF_INTC_ICR10_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR11 */
-+#define MCF_INTC_ICR11_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR12 */
-+#define MCF_INTC_ICR12_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR13 */
-+#define MCF_INTC_ICR13_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR14 */
-+#define MCF_INTC_ICR14_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR15 */
-+#define MCF_INTC_ICR15_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR16 */
-+#define MCF_INTC_ICR16_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR17 */
-+#define MCF_INTC_ICR17_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR18 */
-+#define MCF_INTC_ICR18_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR19 */
-+#define MCF_INTC_ICR19_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR20 */
-+#define MCF_INTC_ICR20_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR21 */
-+#define MCF_INTC_ICR21_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR22 */
-+#define MCF_INTC_ICR22_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR23 */
-+#define MCF_INTC_ICR23_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR24 */
-+#define MCF_INTC_ICR24_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR25 */
-+#define MCF_INTC_ICR25_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR26 */
-+#define MCF_INTC_ICR26_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR27 */
-+#define MCF_INTC_ICR27_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR28 */
-+#define MCF_INTC_ICR28_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR29 */
-+#define MCF_INTC_ICR29_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR30 */
-+#define MCF_INTC_ICR30_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR31 */
-+#define MCF_INTC_ICR31_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR32 */
-+#define MCF_INTC_ICR32_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR33 */
-+#define MCF_INTC_ICR33_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR34 */
-+#define MCF_INTC_ICR34_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR35 */
-+#define MCF_INTC_ICR35_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR36 */
-+#define MCF_INTC_ICR36_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR37 */
-+#define MCF_INTC_ICR37_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR38 */
-+#define MCF_INTC_ICR38_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR39 */
-+#define MCF_INTC_ICR39_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR40 */
-+#define MCF_INTC_ICR40_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR41 */
-+#define MCF_INTC_ICR41_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR42 */
-+#define MCF_INTC_ICR42_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR43 */
-+#define MCF_INTC_ICR43_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR44 */
-+#define MCF_INTC_ICR44_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR45 */
-+#define MCF_INTC_ICR45_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR46 */
-+#define MCF_INTC_ICR46_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR47 */
-+#define MCF_INTC_ICR47_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR48 */
-+#define MCF_INTC_ICR48_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR49 */
-+#define MCF_INTC_ICR49_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR50 */
-+#define MCF_INTC_ICR50_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR51 */
-+#define MCF_INTC_ICR51_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR52 */
-+#define MCF_INTC_ICR52_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR53 */
-+#define MCF_INTC_ICR53_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR54 */
-+#define MCF_INTC_ICR54_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR55 */
-+#define MCF_INTC_ICR55_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR56 */
-+#define MCF_INTC_ICR56_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR57 */
-+#define MCF_INTC_ICR57_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR58 */
-+#define MCF_INTC_ICR58_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR59 */
-+#define MCF_INTC_ICR59_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR60 */
-+#define MCF_INTC_ICR60_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR61 */
-+#define MCF_INTC_ICR61_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR62 */
-+#define MCF_INTC_ICR62_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for ICR63 */
-+#define MCF_INTC_ICR63_IL(x)    (((x)&0x07))
-+
-+/* Bit definitions and macros for SWIACK */
-+#define MCF_INTC_SWIACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for LIACK group */
-+#define MCF_INTC_LIACK_VECTOR(x)    (x)
-+
-+/* Bit definitions and macros for L1IACK */
-+#define MCF_INTC_L1IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L2IACK */
-+#define MCF_INTC_L2IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L3IACK */
-+#define MCF_INTC_L3IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L4IACK */
-+#define MCF_INTC_L4IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L5IACK */
-+#define MCF_INTC_L5IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L6IACK */
-+#define MCF_INTC_L6IACK_VECTOR(x)   (x)
-+
-+/* Bit definitions and macros for L7IACK */
-+#define MCF_INTC_L7IACK_VECTOR(x)   (x)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_INTC_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_pciarb.h
-@@ -0,0 +1,40 @@
-+/*
-+ * Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_PCIARB_H__
-+#define __MCF5445X_PCIARB_H__
-+
-+/*********************************************************************
-+*
-+* PCI Arbiter Module (PCIARB)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_PCIARB_PACR               MCF_REG32(0xFC0AC000)
-+#define MCF_PCIARB_PASR               MCF_REG32(0xFC0AC004)
-+
-+/* Bit definitions and macros for PACR */
-+#define MCF_PCIARB_PACR_INTMPRI         (0x00000001)
-+#define MCF_PCIARB_PACR_EXTMPRI(x)      (((x)&0x0000001F)<<1)
-+#define MCF_PCIARB_PACR_RA              (0x00008000)
-+#define MCF_PCIARB_PACR_INTMINTEN       (0x00010000)
-+#define MCF_PCIARB_PACR_EXTMINTEN(x)    (((x)&0x0000001F)<<17)
-+#define MCF_PCIARB_PACR_PKMD            (0x40000000)
-+#define MCF_PCIARB_PACR_DS              (0x80000000)
-+
-+/* Bit definitions and macros for PASR */
-+#define MCF_PCIARB_PASR_ITLMBK        (0x00010000)
-+#define MCF_PCIARB_PASR_EXTMBK(x)     (((x)&0x0000001F)<<17)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_PCIARB_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_pci.h
-@@ -0,0 +1,238 @@
-+/*
-+ * Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_PCI_H__
-+#define __MCF5445X_PCI_H__
-+
-+/*********************************************************************
-+*
-+* PCI Bus Controller (PCI)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_PCI_PCIIDR          MCF_REG32(0xFC0A8000)
-+#define MCF_PCI_PCISCR          MCF_REG32(0xFC0A8004)
-+#define MCF_PCI_PCICCRIR        MCF_REG32(0xFC0A8008)
-+#define MCF_PCI_PCICR1          MCF_REG32(0xFC0A800C)
-+#define MCF_PCI_PCIBAR0         MCF_REG32(0xFC0A8010)
-+#define MCF_PCI_PCIBAR1         MCF_REG32(0xFC0A8014)
-+#define MCF_PCI_PCIBAR2         MCF_REG32(0xFC0A8018)
-+#define MCF_PCI_PCIBAR3         MCF_REG32(0xFC0A801C)
-+#define MCF_PCI_PCIBAR4         MCF_REG32(0xFC0A8020)
-+#define MCF_PCI_PCIBAR5         MCF_REG32(0xFC0A8024)
-+#define MCF_PCI_PCISID          MCF_REG32(0xFC0A802C)
-+#define MCF_PCI_PCICR2          MCF_REG32(0xFC0A803C)
-+#define MCF_PCI_PCIGSCR         MCF_REG32(0xFC0A8060)
-+#define MCF_PCI_PCITBATR0A      MCF_REG32(0xFC0A8064)
-+#define MCF_PCI_PCITBATR1A      MCF_REG32(0xFC0A8068)
-+#define MCF_PCI_PCITCR          MCF_REG32(0xFC0A806C)
-+#define MCF_PCI_PCIIW0BTAR      MCF_REG32(0xFC0A8070)
-+#define MCF_PCI_PCIIW1BTAR      MCF_REG32(0xFC0A8074)
-+#define MCF_PCI_PCIIW2BTAR      MCF_REG32(0xFC0A8078)
-+#define MCF_PCI_PCIIWCR         MCF_REG32(0xFC0A8080)
-+#define MCF_PCI_PCIICR          MCF_REG32(0xFC0A8084)
-+#define MCF_PCI_PCIISR          MCF_REG32(0xFC0A8088)
-+#define MCF_PCI_PCITCR2         MCF_REG32(0xFC0A808C)
-+#define MCF_PCI_PCITBATR0       MCF_REG32(0xFC0A8090)
-+#define MCF_PCI_PCITBATR1       MCF_REG32(0xFC0A8094)
-+#define MCF_PCI_PCITBATR2       MCF_REG32(0xFC0A8098)
-+#define MCF_PCI_PCITBATR3       MCF_REG32(0xFC0A809C)
-+#define MCF_PCI_PCITBATR4       MCF_REG32(0xFC0A80A0)
-+#define MCF_PCI_PCITBATR5       MCF_REG32(0xFC0A80A4)
-+#define MCF_PCI_PCICAR          MCF_REG32(0xFC0A80F8)
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_PCI_PCIIWBTAR(x)    MCF_REG32(0xFC0A8070+((x)*0x004))
-+
-+/* Bit definitions and macros for PCIIDR */
-+#define MCF_PCI_PCIIDR_VENDORID(x)      (((x)&0x0000FFFF))
-+#define MCF_PCI_PCIIDR_DEVICEID(x)      (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for PCISCR */
-+#define MCF_PCI_PCISCR_M        (0x00000002)
-+#define MCF_PCI_PCISCR_B        (0x00000004)
-+#define MCF_PCI_PCISCR_SP       (0x00000008)
-+#define MCF_PCI_PCISCR_MW       (0x00000010)
-+#define MCF_PCI_PCISCR_PER      (0x00000040)
-+#define MCF_PCI_PCISCR_S        (0x00000100)
-+#define MCF_PCI_PCISCR_F        (0x00000200)
-+#define MCF_PCI_PCISCR_C        (0x00100000)
-+#define MCF_PCI_PCISCR_66M      (0x00200000)
-+#define MCF_PCI_PCISCR_R        (0x00400000)
-+#define MCF_PCI_PCISCR_FC       (0x00800000)
-+#define MCF_PCI_PCISCR_DP       (0x01000000)
-+#define MCF_PCI_PCISCR_DT(x)    (((x)&0x00000003)<<25)
-+#define MCF_PCI_PCISCR_TS       (0x08000000)
-+#define MCF_PCI_PCISCR_TR       (0x10000000)
-+#define MCF_PCI_PCISCR_MA       (0x20000000)
-+#define MCF_PCI_PCISCR_SE       (0x40000000)
-+#define MCF_PCI_PCISCR_PE       (0x80000000)
-+
-+/* Bit definitions and macros for PCICCRIR */
-+#define MCF_PCI_PCICCRIR_REVID(x)       (((x)&0x000000FF))
-+#define MCF_PCI_PCICCRIR_CLASSCODE(x)   (((x)&0x00FFFFFF)<<8)
-+
-+/* Bit definitions and macros for PCICR1 */
-+#define MCF_PCI_PCICR1_CACHELINESIZE(x)     (((x)&0x0000000F))
-+#define MCF_PCI_PCICR1_LATTIMER(x)          (((x)&0x000000FF)<<8)
-+#define MCF_PCI_PCICR1_HEADERTYPE(x)        (((x)&0x000000FF)<<16)
-+#define MCF_PCI_PCICR1_BIST(x)              (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for PCIBAR0 */
-+#define MCF_PCI_PCIBAR0_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR0_RANGE(x)    (((x)&0x00000003)<<1)
-+#define MCF_PCI_PCIBAR0_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR0_BAR0(x)     (((x)&0x00003FFF)<<18)
-+
-+/* Bit definitions and macros for PCIBAR1 */
-+#define MCF_PCI_PCIBAR1_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR1_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR1_BAR1(x)     (((x)&0x00000FFF)<<20)
-+
-+/* Bit definitions and macros for PCIBAR2 */
-+#define MCF_PCI_PCIBAR2_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR2_RANGE(x)    (((x)&0x00000003)<<1)
-+#define MCF_PCI_PCIBAR2_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR2_BAR2(x)     (((x)&0x000003FF)<<22)
-+
-+/* Bit definitions and macros for PCIBAR3 */
-+#define MCF_PCI_PCIBAR3_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR3_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR3_BAR3(x)     (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for PCIBAR4 */
-+#define MCF_PCI_PCIBAR4_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR4_RANGE(x)    (((x)&0x00000003)<<1)
-+#define MCF_PCI_PCIBAR4_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR4_BAR4(x)     (((x)&0x0000001F)<<27)
-+
-+/* Bit definitions and macros for PCIBAR5 */
-+#define MCF_PCI_PCIBAR5_IO          (0x00000001)
-+#define MCF_PCI_PCIBAR5_PREF        (0x00000008)
-+#define MCF_PCI_PCIBAR5_BAR5(x)     (((x)&0x0000000F)<<28)
-+
-+/* Bit definitions and macros for PCISID */
-+#define MCF_PCI_PCISID_VENDORID(x)      (((x)&0x0000FFFF))
-+#define MCF_PCI_PCISID_ID(x)            (((x)&0x0000FFFF)<<16)
-+
-+/* Bit definitions and macros for PCICR2 */
-+#define MCF_PCI_PCICR2_INTLINE(x)   (((x)&0x000000FF))
-+#define MCF_PCI_PCICR2_INTPIN(x)    (((x)&0x000000FF)<<8)
-+#define MCF_PCI_PCICR2_MINGNT(x)    (((x)&0x000000FF)<<16)
-+#define MCF_PCI_PCICR2_MAXLAT(x)    (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for PCIGSCR */
-+#define MCF_PCI_PCIGSCR_PR      (0x00000001)
-+#define MCF_PCI_PCIGSCR_SEE     (0x00001000)
-+#define MCF_PCI_PCIGSCR_PEE     (0x00002000)
-+#define MCF_PCI_PCIGSCR_SE      (0x10000000)
-+#define MCF_PCI_PCIGSCR_PE      (0x20000000)
-+
-+/* Bit definitions and macros for PCITBATR0A */
-+#define MCF_PCI_PCITBATR0A_EN           (0x00000001)
-+#define MCF_PCI_PCITBATR0A_BAT0(x)      (((x)&0x00003FFF)<<18)
-+
-+/* Bit definitions and macros for PCITBATR1A */
-+#define MCF_PCI_PCITBATR1A_EN           (0x00000001)
-+#define MCF_PCI_PCITBATR1A_BAT1(x)      (((x)&0x00000FFF)<<20)
-+
-+/* Bit definitions and macros for PCITCR */
-+#define MCF_PCI_PCITCR_WCT(x)   (((x)&0x000000FF))
-+#define MCF_PCI_PCITCR_WCD      (0x00000100)
-+#define MCF_PCI_PCITCR_P        (0x00010000)
-+#define MCF_PCI_PCITCR_PID      (0x00020000)
-+#define MCF_PCI_PCITCR_LD       (0x01000000)
-+
-+/* Bit definitions and macros for PCIIWBTAR group */
-+#define MCF_PCI_PCIIWBTAR_WBA(x)    ((((x)&0xFF000000)))
-+#define MCF_PCI_PCIIWBTAR_WAM(x)    ((((x)&0xFF000000)
-+#define MCF_PCI_PCIIWBTAR_WTA(x)    ((((x)&0xFF000000)
-+
-+/* Bit definitions and macros for PCIIW0BTAR */
-+#define MCF_PCI_PCIIW0BTAR_WBA(x)   ((((x)&0xFF000000)))
-+#define MCF_PCI_PCIIW0BTAR_WAM(x)   ((((x)&0xFF000000)
-+#define MCF_PCI_PCIIW0BTAR_WTA(x)   ((((x)&0xFF000000)
-+
-+/* Bit definitions and macros for PCIIWCR */
-+#define MCF_PCI_PCIIWCR_WINCTRL2(x)             (((x)&0x0000000F)<<8)
-+#define MCF_PCI_PCIIWCR_WINCTRL1(x)             (((x)&0x0000000F)<<16)
-+#define MCF_PCI_PCIIWCR_WINCTRL0(x)             (((x)&0x0000000F)<<24)
-+#define MCF_PCI_PCIIWCR_WINCTRL0_ENABLE         (0x01000000)
-+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD        (0x01000000)
-+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDLINE      (0x03000000)
-+#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDMUL       (0x05000000)
-+#define MCF_PCI_PCIIWCR_WINCTRL0_IO             (0x09000000)
-+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD        (0x00010000)
-+#define MCF_PCI_PCIIWCR_WINCTRL1_ENABLE         (0x00010000)
-+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDLINE      (0x00030000)
-+#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDMUL       (0x00050000)
-+#define MCF_PCI_PCIIWCR_WINCTRL1_IO             (0x00090000)
-+#define MCF_PCI_PCIIWCR_WINCTRL2_ENABLE         (0x00000100)
-+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMREAD        (0x00000100)
-+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDLINE      (0x00000300)
-+#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDMUL       (0x00000500)
-+#define MCF_PCI_PCIIWCR_WINCTRL2_IO             (0x00000900)
-+
-+/* Bit definitions and macros for PCIICR */
-+#define MCF_PCI_PCIICR_MAXRETRY(x)      (((x)&0x000000FF))
-+#define MCF_PCI_PCIICR_TAE              (0x01000000)
-+#define MCF_PCI_PCIICR_IAE              (0x02000000)
-+#define MCF_PCI_PCIICR_REE              (0x04000000)
-+
-+/* Bit definitions and macros for PCIISR */
-+#define MCF_PCI_PCIISR_TA       (0x01000000)
-+#define MCF_PCI_PCIISR_IA       (0x02000000)
-+#define MCF_PCI_PCIISR_RE       (0x04000000)
-+
-+/* Bit definitions and macros for PCITCR2 */
-+#define MCF_PCI_PCITCR2_CR      (0x00000001)
-+#define MCF_PCI_PCITCR2_B0E     (0x00000100)
-+#define MCF_PCI_PCITCR2_B1E     (0x00000200)
-+#define MCF_PCI_PCITCR2_B2E     (0x00000400)
-+#define MCF_PCI_PCITCR2_B3E     (0x00000800)
-+#define MCF_PCI_PCITCR2_B4E     (0x00001000)
-+#define MCF_PCI_PCITCR2_B5E     (0x00002000)
-+
-+/* Bit definitions and macros for PCITBATR0 */
-+#define MCF_PCI_PCITBATR0_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR0_BAT0(x)   (((x)&0x00003FFF)<<18)
-+
-+/* Bit definitions and macros for PCITBATR1 */
-+#define MCF_PCI_PCITBATR1_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR1_BAT1(x)   (((x)&0x00000FFF)<<20)
-+
-+/* Bit definitions and macros for PCITBATR2 */
-+#define MCF_PCI_PCITBATR2_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR2_BAT2(x)   (((x)&0x000003FF)<<22)
-+
-+/* Bit definitions and macros for PCITBATR3 */
-+#define MCF_PCI_PCITBATR3_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR3_BAT3(x)   (((x)&0x000000FF)<<24)
-+
-+/* Bit definitions and macros for PCITBATR4 */
-+#define MCF_PCI_PCITBATR4_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR4_BAT4(x)   (((x)&0x0000001F)<<27)
-+
-+/* Bit definitions and macros for PCITBATR5 */
-+#define MCF_PCI_PCITBATR5_EN        (0x00000001)
-+#define MCF_PCI_PCITBATR5_BAT5(x)   (((x)&0x0000000F)<<28)
-+
-+/* Bit definitions and macros for PCICAR */
-+#define MCF_PCI_PCICAR_DWORD(x)     ((x)&0x000000FC)
-+#define MCF_PCI_PCICAR_FUNCNUM(x)   (((x)&0x00000007)<<8)
-+#define MCF_PCI_PCICAR_DEVNUM(x)    (((x)&0x0000001F)<<11)
-+#define MCF_PCI_PCICAR_BUSNUM(x)    (((x)&0x000000FF)<<16)
-+#define MCF_PCI_PCICAR_E            (0x80000000)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_PCI_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_sdramc.h
-@@ -0,0 +1,115 @@
-+/*
-+ * Matt Waddel Matt.Waddel@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_SDRAMC_H__
-+#define __MCF5445X_SDRAMC_H__
-+
-+/*********************************************************************
-+*
-+* SDRAM Controller (SDRAMC)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_SDRAMC_SDMR         (*(vuint32 *)(0xFC0B8000))   /* SDRAM Mode/Extended Mode Register */
-+#define MCF_SDRAMC_SDCR         (*(vuint32 *)(0xFC0B8004))   /* SDRAM Control Register */
-+#define MCF_SDRAMC_SDCFG1       (*(vuint32 *)(0xFC0B8008))   /* SDRAM Configuration Register 1 */
-+#define MCF_SDRAMC_SDCFG2       (*(vuint32 *)(0xFC0B800C))   /* SDRAM Configuration Register 2 */
-+#define MCF_SDRAMC_SDCS0        (*(vuint32 *)(0xFC0B8110))   /* SDRAM Chip Select Register */
-+#define MCF_SDRAMC_SDCS1        (*(vuint32 *)(0xFC0B8114))   /* SDRAM Chip Select Register */
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_SDRAMC_SDCS(x)      (*(vuint32 *)(0xFC0B8110+((x)*0x004)))   /* SDRAM Chip Select Register */
-+
-+/* Bit definitions and macros for SDMR */
-+#define MCF_SDRAMC_SDMR_DDR2_AD(x)      (((x)&0x00003FFF))      /* Address for DDR2 */
-+#define MCF_SDRAMC_SDMR_CMD             (0x00010000)            /* Command */
-+#define MCF_SDRAMC_SDMR_AD(x)           (((x)&0x00000FFF)<<18)  /* Address */
-+#define MCF_SDRAMC_SDMR_BK(x)           (((x)&0x00000003)<<30)  /* Bank Address */
-+#define MCF_SDRAMC_SDMR_BK_LMR          (0x00000000)
-+#define MCF_SDRAMC_SDMR_BK_LEMR         (0x40000000)
-+
-+/* Bit definitions and macros for SDCR */
-+#define MCF_SDRAMC_SDCR_DPD             (0x00000001)            /* Deep Power-Down Mode */
-+#define MCF_SDRAMC_SDCR_IPALL           (0x00000002)            /* Initiate Precharge All */
-+#define MCF_SDRAMC_SDCR_IREF            (0x00000004)            /* Initiate Refresh */
-+#define MCF_SDRAMC_SDCR_DQS_OE(x)       (((x)&0x00000003)<<10)  /* DQS Output Enable */
-+#define MCF_SDRAMC_SDCR_MEM_PS          (0x00002000)            /* Data Port Size */
-+#define MCF_SDRAMC_SDCR_REF_CNT(x)      (((x)&0x0000003F)<<16)  /* Periodic Refresh Counter */
-+#define MCF_SDRAMC_SDCR_OE_RULE         (0x00400000)            /* Drive Rule Selection */
-+#define MCF_SDRAMC_SDCR_ADDR_MUX(x)     (((x)&0x00000003)<<24)  /* Internal Address Mux Select */
-+#define MCF_SDRAMC_SDCR_DDR2_MODE       (0x08000000)            /* DDR2 Mode Select */
-+#define MCF_SDRAMC_SDCR_REF_EN          (0x10000000)            /* Refresh Enable */
-+#define MCF_SDRAMC_SDCR_DDR_MODE        (0x20000000)            /* DDR Mode Select */
-+#define MCF_SDRAMC_SDCR_CKE             (0x40000000)            /* Clock Enable */
-+#define MCF_SDRAMC_SDCR_MODE_EN         (0x80000000)            /* SDRAM Mode Register Programming Enable */
-+#define MCF_SDRAMC_SDCR_DQS_OE_BOTH     (0x00000C00)
-+
-+/* Bit definitions and macros for SDCFG1 */
-+#define MCF_SDRAMC_SDCFG1_WT_LAT(x)     (((x)&0x00000007)<<4)   /* Write Latency */
-+#define MCF_SDRAMC_SDCFG1_REF2ACT(x)    (((x)&0x0000000F)<<8)   /* Refresh to active delay */
-+#define MCF_SDRAMC_SDCFG1_PRE2ACT(x)    (((x)&0x00000007)<<12)  /* Precharge to active delay */
-+#define MCF_SDRAMC_SDCFG1_ACT2RW(x)     (((x)&0x00000007)<<16)  /* Active to read/write delay */
-+#define MCF_SDRAMC_SDCFG1_RD_LAT(x)     (((x)&0x0000000F)<<20)  /* Read CAS Latency */
-+#define MCF_SDRAMC_SDCFG1_SWT2RWP(x)    (((x)&0x00000007)<<24)  /* Single write to read/write/precharge delay */
-+#define MCF_SDRAMC_SDCFG1_SRD2RWP(x)    (((x)&0x0000000F)<<28)  /* Single read to read/write/precharge delay */
-+
-+/* Bit definitions and macros for SDCFG2 */
-+#define MCF_SDRAMC_SDCFG2_BL(x)         (((x)&0x0000000F)<<16)  /* Burst Length */
-+#define MCF_SDRAMC_SDCFG2_BRD2W(x)      (((x)&0x0000000F)<<20)  /* Burst read to write delay */
-+#define MCF_SDRAMC_SDCFG2_BWT2RWP(x)    (((x)&0x0000000F)<<24)  /* Burst write to read/write/precharge delay */
-+#define MCF_SDRAMC_SDCFG2_BRD2RP(x)     (((x)&0x0000000F)<<28)  /* Burst read to read/precharge delay */
-+
-+/* Bit definitions and macros for SDCS group */
-+#define MCF_SDRAMC_SDCS_CSSZ(x)         (((x)&0x0000001F))      /* Chip-Select Size */
-+#define MCF_SDRAMC_SDCS_CSBA(x)         (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
-+#define MCF_SDRAMC_SDCS_BA(x)           ((x)&0xFFF00000)
-+#define MCF_SDRAMC_SDCS_CSSZ_DISABLE    (0x00000000)
-+#define MCF_SDRAMC_SDCS_CSSZ_1MBYTE     (0x00000013)
-+#define MCF_SDRAMC_SDCS_CSSZ_2MBYTE     (0x00000014)
-+#define MCF_SDRAMC_SDCS_CSSZ_4MBYTE     (0x00000015)
-+#define MCF_SDRAMC_SDCS_CSSZ_8MBYTE     (0x00000016)
-+#define MCF_SDRAMC_SDCS_CSSZ_16MBYTE    (0x00000017)
-+#define MCF_SDRAMC_SDCS_CSSZ_32MBYTE    (0x00000018)
-+#define MCF_SDRAMC_SDCS_CSSZ_64MBYTE    (0x00000019)
-+#define MCF_SDRAMC_SDCS_CSSZ_128MBYTE   (0x0000001A)
-+#define MCF_SDRAMC_SDCS_CSSZ_256MBYTE   (0x0000001B)
-+#define MCF_SDRAMC_SDCS_CSSZ_512MBYTE   (0x0000001C)
-+#define MCF_SDRAMC_SDCS_CSSZ_1GBYTE     (0x0000001D)
-+#define MCF_SDRAMC_SDCS_CSSZ_2GBYTE     (0x0000001E)
-+#define MCF_SDRAMC_SDCS_CSSZ_4GBYTE     (0x0000001F)
-+
-+/* Bit definitions and macros for SDCS0 */
-+#define MCF_SDRAMC_SDCS0_CSSZ(x)            (((x)&0x0000001F))      /* Chip-Select Size */
-+#define MCF_SDRAMC_SDCS0_CSBA(x)            (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
-+#define MCF_SDRAMC_SDCS0_BA(x)              ((x)&0xFFF00000)
-+#define MCF_SDRAMC_SDCS0_CSSZ_DISABLE       (0x00000000)
-+#define MCF_SDRAMC_SDCS0_CSSZ_1MBYTE        (0x00000013)
-+#define MCF_SDRAMC_SDCS0_CSSZ_2MBYTE        (0x00000014)
-+#define MCF_SDRAMC_SDCS0_CSSZ_4MBYTE        (0x00000015)
-+#define MCF_SDRAMC_SDCS0_CSSZ_8MBYTE        (0x00000016)
-+#define MCF_SDRAMC_SDCS0_CSSZ_16MBYTE       (0x00000017)
-+#define MCF_SDRAMC_SDCS0_CSSZ_32MBYTE       (0x00000018)
-+#define MCF_SDRAMC_SDCS0_CSSZ_64MBYTE       (0x00000019)
-+#define MCF_SDRAMC_SDCS0_CSSZ_128MBYTE      (0x0000001A)
-+#define MCF_SDRAMC_SDCS0_CSSZ_256MBYTE      (0x0000001B)
-+#define MCF_SDRAMC_SDCS0_CSSZ_512MBYTE      (0x0000001C)
-+#define MCF_SDRAMC_SDCS0_CSSZ_1GBYTE        (0x0000001D)
-+#define MCF_SDRAMC_SDCS0_CSSZ_2GBYTE        (0x0000001E)
-+#define MCF_SDRAMC_SDCS0_CSSZ_4GBYTE        (0x0000001F)
-+
-+/* Bit definitions and macros for SDCS1 */
-+#define MCF_SDRAMC_SDCS1_CSSZ(x)    (((x)&0x0000001F))      /* Chip-Select Size */
-+#define MCF_SDRAMC_SDCS1_CSBA(x)    (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_SDRAMC_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_ssi.h
-@@ -0,0 +1,187 @@
-+/*
-+ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_SSI_H__
-+#define __MCF5445X_SSI_H__
-+
-+/*********************************************************************
-+*
-+* Synchronous Serial Interface (SSI)
-+*
-+*********************************************************************/
-+
-+/* Register read/write macros */
-+#define MCF_SSI_TX0             MCF_REG32(0xFC0BC000)
-+#define MCF_SSI_TX1             MCF_REG32(0xFC0BC004)
-+#define MCF_SSI_RX0             MCF_REG32(0xFC0BC008)
-+#define MCF_SSI_RX1             MCF_REG32(0xFC0BC00C)
-+#define MCF_SSI_CR              MCF_REG32(0xFC0BC010)
-+#define MCF_SSI_ISR             MCF_REG32(0xFC0BC014)
-+#define MCF_SSI_IER             MCF_REG32(0xFC0BC018)
-+#define MCF_SSI_TCR             MCF_REG32(0xFC0BC01C)
-+#define MCF_SSI_RCR             MCF_REG32(0xFC0BC020)
-+#define MCF_SSI_CCR             MCF_REG32(0xFC0BC024)
-+#define MCF_SSI_FCSR            MCF_REG32(0xFC0BC02C)
-+#define MCF_SSI_ACR             MCF_REG32(0xFC0BC038)
-+#define MCF_SSI_ACADD           MCF_REG32(0xFC0BC03C)
-+#define MCF_SSI_ACDAT           MCF_REG32(0xFC0BC040)
-+#define MCF_SSI_ATAG            MCF_REG32(0xFC0BC044)
-+#define MCF_SSI_TMASK           MCF_REG32(0xFC0BC048)
-+#define MCF_SSI_RMASK           MCF_REG32(0xFC0BC04C)
-+
-+/* Parameterized register read/write macros for multiple registers */
-+#define MCF_SSI_TX(x)           MCF_REG32(0xFC0BC000+((x)*0x004))
-+#define MCF_SSI_RX(x)           MCF_REG32(0xFC0BC008+((x)*0x004))
-+
-+/* Bit definitions and macros for TX group */
-+#define MCF_SSI_TX_SSI_TX(x)    (x)
-+
-+/* Bit definitions and macros for TX0 */
-+#define MCF_SSI_TX0_SSI_TX(x)   (x)
-+
-+/* Bit definitions and macros for TX1 */
-+#define MCF_SSI_TX1_SSI_TX(x)   (x)
-+
-+/* Bit definitions and macros for RX group */
-+#define MCF_SSI_RX_SSI_RX(x)    (x)
-+
-+/* Bit definitions and macros for RX0 */
-+#define MCF_SSI_RX0_SSI_RX(x)   (x)
-+
-+/* Bit definitions and macros for RX1 */
-+#define MCF_SSI_RX1_SSI_RX(x)   (x)
-+
-+/* Bit definitions and macros for CR */
-+#define MCF_SSI_CR_SSI_EN       (0x00000001)
-+#define MCF_SSI_CR_TE           (0x00000002)
-+#define MCF_SSI_CR_RE           (0x00000004)
-+#define MCF_SSI_CR_NET          (0x00000008)
-+#define MCF_SSI_CR_SYN          (0x00000010)
-+#define MCF_SSI_CR_I2S(x)       (((x)&0x00000003)<<5)
-+#define MCF_SSI_CR_MCE          (0x00000080)
-+#define MCF_SSI_CR_TCH          (0x00000100)
-+#define MCF_SSI_CR_CIS          (0x00000200)
-+#define MCF_SSI_CR_I2S_NORMAL   (0x00000000)
-+#define MCF_SSI_CR_I2S_MASTER   (0x00000020)
-+#define MCF_SSI_CR_I2S_SLAVE    (0x00000040)
-+
-+/* Bit definitions and macros for ISR */
-+#define MCF_SSI_ISR_TFE0        (0x00000001)
-+#define MCF_SSI_ISR_TFE1        (0x00000002)
-+#define MCF_SSI_ISR_RFF0        (0x00000004)
-+#define MCF_SSI_ISR_RFF1        (0x00000008)
-+#define MCF_SSI_ISR_RLS         (0x00000010)
-+#define MCF_SSI_ISR_TLS         (0x00000020)
-+#define MCF_SSI_ISR_RFS         (0x00000040)
-+#define MCF_SSI_ISR_TFS         (0x00000080)
-+#define MCF_SSI_ISR_TUE0        (0x00000100)
-+#define MCF_SSI_ISR_TUE1        (0x00000200)
-+#define MCF_SSI_ISR_ROE0        (0x00000400)
-+#define MCF_SSI_ISR_ROE1        (0x00000800)
-+#define MCF_SSI_ISR_TDE0        (0x00001000)
-+#define MCF_SSI_ISR_TDE1        (0x00002000)
-+#define MCF_SSI_ISR_RDR0        (0x00004000)
-+#define MCF_SSI_ISR_RDR1        (0x00008000)
-+#define MCF_SSI_ISR_RXT         (0x00010000)
-+#define MCF_SSI_ISR_CMDDU       (0x00020000)
-+#define MCF_SSI_ISR_CMDAU       (0x00040000)
-+
-+/* Bit definitions and macros for IER */
-+#define MCF_SSI_IER_TFE0        (0x00000001)
-+#define MCF_SSI_IER_TFE1        (0x00000002)
-+#define MCF_SSI_IER_RFF0        (0x00000004)
-+#define MCF_SSI_IER_RFF1        (0x00000008)
-+#define MCF_SSI_IER_RLS         (0x00000010)
-+#define MCF_SSI_IER_TLS         (0x00000020)
-+#define MCF_SSI_IER_RFS         (0x00000040)
-+#define MCF_SSI_IER_TFS         (0x00000080)
-+#define MCF_SSI_IER_TUE0        (0x00000100)
-+#define MCF_SSI_IER_TUE1        (0x00000200)
-+#define MCF_SSI_IER_ROE0        (0x00000400)
-+#define MCF_SSI_IER_ROE1        (0x00000800)
-+#define MCF_SSI_IER_TDE0        (0x00001000)
-+#define MCF_SSI_IER_TDE1        (0x00002000)
-+#define MCF_SSI_IER_RDR0        (0x00004000)
-+#define MCF_SSI_IER_RDR1        (0x00008000)
-+#define MCF_SSI_IER_RXT         (0x00010000)
-+#define MCF_SSI_IER_CMDU        (0x00020000)
-+#define MCF_SSI_IER_CMDAU       (0x00040000)
-+#define MCF_SSI_IER_TIE         (0x00080000)
-+#define MCF_SSI_IER_TDMAE       (0x00100000)
-+#define MCF_SSI_IER_RIE         (0x00200000)
-+#define MCF_SSI_IER_RDMAE       (0x00400000)
-+
-+/* Bit definitions and macros for TCR */
-+#define MCF_SSI_TCR_TEFS        (0x00000001)
-+#define MCF_SSI_TCR_TFSL        (0x00000002)
-+#define MCF_SSI_TCR_TFSI        (0x00000004)
-+#define MCF_SSI_TCR_TSCKP       (0x00000008)
-+#define MCF_SSI_TCR_TSHFD       (0x00000010)
-+#define MCF_SSI_TCR_TXDIR       (0x00000020)
-+#define MCF_SSI_TCR_TFDIR       (0x00000040)
-+#define MCF_SSI_TCR_TFEN0       (0x00000080)
-+#define MCF_SSI_TCR_TFEN1       (0x00000100)
-+#define MCF_SSI_TCR_TXBIT0      (0x00000200)
-+
-+/* Bit definitions and macros for RCR */
-+#define MCF_SSI_RCR_REFS        (0x00000001)
-+#define MCF_SSI_RCR_RFSL        (0x00000002)
-+#define MCF_SSI_RCR_RFSI        (0x00000004)
-+#define MCF_SSI_RCR_RSCKP       (0x00000008)
-+#define MCF_SSI_RCR_RSHFD       (0x00000010)
-+#define MCF_SSI_RCR_RFEN0       (0x00000080)
-+#define MCF_SSI_RCR_RFEN1       (0x00000100)
-+#define MCF_SSI_RCR_RXBIT0      (0x00000200)
-+#define MCF_SSI_RCR_RXEXT       (0x00000400)
-+
-+/* Bit definitions and macros for CCR */
-+#define MCF_SSI_CCR_PM(x)       (((x)&0x000000FF))
-+#define MCF_SSI_CCR_DC(x)       (((x)&0x0000001F)<<8)
-+#define MCF_SSI_CCR_WL(x)       (((x)&0x0000000F)<<13)
-+#define MCF_SSI_CCR_PSR         (0x00020000)
-+#define MCF_SSI_CCR_DIV2        (0x00040000)
-+
-+/* Bit definitions and macros for FCSR */
-+#define MCF_SSI_FCSR_TFWM0(x)       (((x)&0x0000000F))
-+#define MCF_SSI_FCSR_RFWM0(x)       (((x)&0x0000000F)<<4)
-+#define MCF_SSI_FCSR_TFCNT0(x)      (((x)&0x0000000F)<<8)
-+#define MCF_SSI_FCSR_RFCNT0(x)      (((x)&0x0000000F)<<12)
-+#define MCF_SSI_FCSR_TFWM1(x)       (((x)&0x0000000F)<<16)
-+#define MCF_SSI_FCSR_RFWM1(x)       (((x)&0x0000000F)<<20)
-+#define MCF_SSI_FCSR_TFCNT1(x)      (((x)&0x0000000F)<<24)
-+#define MCF_SSI_FCSR_RFCNT1(x)      (((x)&0x0000000F)<<28)
-+
-+/* Bit definitions and macros for ACR */
-+#define MCF_SSI_ACR_AC97EN      (0x00000001)
-+#define MCF_SSI_ACR_FV          (0x00000002)
-+#define MCF_SSI_ACR_TIF         (0x00000004)
-+#define MCF_SSI_ACR_RD          (0x00000008)
-+#define MCF_SSI_ACR_WR          (0x00000010)
-+#define MCF_SSI_ACR_FRDIV(x)    (((x)&0x0000003F)<<5)
-+
-+/* Bit definitions and macros for ACADD */
-+#define MCF_SSI_ACADD_SSI_ACADD(x)      (((x)&0x0007FFFF))
-+
-+/* Bit definitions and macros for ACDAT */
-+#define MCF_SSI_ACDAT_SSI_ACDAT(x)      (((x)&0x0007FFFF))
-+
-+/* Bit definitions and macros for ATAG */
-+#define MCF_SSI_ATAG_DDI_ATAG(x)    (((x)&0x0000FFFF))
-+
-+/* Bit definitions and macros for TMASK */
-+#define MCF_SSI_TMASK_SSI_TMASK(x)      (x)
-+
-+/* Bit definitions and macros for RMASK */
-+#define MCF_SSI_RMASK_SSI_RMASK(x)      (x)
-+
-+/********************************************************************/
-+
-+#endif /* __MCF5445X_SSI_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_usb.h
-@@ -0,0 +1,50 @@
-+/*
-+ * Duck Schmid duck@freescale.com
-+ *
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#include <asm/mcfsim.h>
-+
-+/* ehci_arc_hc_driver.flags value */
-+#define FSL_PLATFORM_HC_FLAGS (HCD_USB2 | HCD_MEMORY)
-+
-+static inline int fsl_platform_verify(struct platform_device *pdev)
-+{
-+      return 0;
-+}
-+
-+static inline void fsl_platform_usb_setup(struct usb_hcd *hcd)
-+{
-+}
-+
-+static inline void fsl_platform_set_host_mode(struct usb_hcd *hcd)
-+{
-+      unsigned int temp;
-+      struct fsl_usb2_platform_data *pdata;
-+      struct fsl_usb_host_regs *regs;
-+
-+      pdata = hcd->self.controller->platform_data;
-+      regs = pdata->regs;
-+
-+      if (pdata->xcvr_ops && pdata->xcvr_ops->set_host)
-+              pdata->xcvr_ops->set_host();
-+
-+      /* set host mode and select "big endian" */
-+      temp = fsl_readl(&regs->usbmode);
-+      temp |= USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
-+      fsl_writel(temp, &regs->usbmode);
-+
-+      pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__,
-+              fsl_readl(&regs->usbmode));
-+
-+}
---- /dev/null
-+++ b/include/asm-m68k/mcf5445x_xbs.h
-@@ -0,0 +1,81 @@
-+/*
-+ * Kurt Mahan kmahan@freescale.com
-+ *
-+ * Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ * 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.
-+ */
-+
-+#ifndef __MCF5445X_XBS_H__
-+#define __MCF5445X_XBS_H__
-+
-+/*
-+ * Crossbar Switch (XBS)
-+ */
-+
-+/* Register read/write macros */
-+#define MCF_XBS_PRS1          MCF_REG32(0xFC004100) /* Flexbus Priority */
-+#define MCF_XBS_CRS1          MCF_REG32(0xFC004110) /* Flexbus Control */
-+#define MCF_XBS_PRS2          MCF_REG32(0xFC004200) /* SDRam Priority */
-+#define MCF_XBS_CRS2          MCF_REG32(0xFC004210) /* SDRam Control */
-+#define MCF_XBS_PRS3          MCF_REG32(0xFC004300) /* ATA Priority */
-+#define MCF_XBS_CRS3          MCF_REG32(0xFC004310) /* ATA Control */
-+#define MCF_XBS_PRS4          MCF_REG32(0xFC004400) /* SRAM Priority */
-+#define MCF_XBS_CRS4          MCF_REG32(0xFC004410) /* SRAM Control */
-+#define MCF_XBS_PRS5          MCF_REG32(0xFC004500) /* PCI Priority */
-+#define MCF_XBS_CRS5          MCF_REG32(0xFC004510) /* PCI Control */
-+#define MCF_XBS_PRS6          MCF_REG32(0xFC004600) /* Slave6 Priority */
-+#define MCF_XBS_CRS6          MCF_REG32(0xFC004610) /* Slave6 Control */
-+#define MCF_XBS_PRS7          MCF_REG32(0xFC004700) /* Other Priority */
-+#define MCF_XBS_CRS7          MCF_REG32(0xFC004710) /* Other Control */
-+
-+/* Priorities */
-+#define MCF_XBS_PRI_1         0       /* Level 1 (highest) */
-+#define MCF_XBS_PRI_2         1       /* Level 2 */
-+#define MCF_XBS_PRI_3         2       /* Level 3 */
-+#define MCF_XBS_PRI_4         3       /* Level 4 */
-+#define MCF_XBS_PRI_5         4       /* Level 5 */
-+#define MCF_XBS_PRI_6         5       /* Level 6 */
-+#define MCF_XBS_PRI_7         6       /* Level 7 (lowest) */
-+#define MCF_XBS_PRI_MASK      7       /* Mask (Not a valid level) */
-+
-+/* Priority Register (PRSn) Defs */
-+#define       MCF_XBS_PRS_MACRO(m,p)  ((p)<<((m)<<2))
-+#define       MCF_XBS_PRS_M0(p)       MCF_XBS_PRS_MACRO(0, p) /* Coldfire Core */
-+#define       MCF_XBS_PRS_M1(p)       MCF_XBS_PRS_MACRO(1, p) /* eDMA */
-+#define       MCF_XBS_PRS_M2(p)       MCF_XBS_PRS_MACRO(2, p) /* FEC0 */
-+#define       MCF_XBS_PRS_M3(p)       MCF_XBS_PRS_MACRO(3, p) /* FEC1 */
-+#define       MCF_XBS_PRS_M4(p)       MCF_XBS_PRS_MACRO(4, p) /* Master 4 */
-+#define       MCF_XBS_PRS_M5(p)       MCF_XBS_PRS_MACRO(5, p) /* PCI */
-+#define       MCF_XBS_PRS_M6(p)       MCF_XBS_PRS_MACRO(6, p) /* USB OTG */
-+#define       MCF_XBS_PRS_M7(p)       MCF_XBS_PRS_MACRO(7, p) /* Serial Boot */
-+
-+/* Control Register (CRSn) Defs */
-+#define MCF_XBS_CRS_RO                0x80000000      /* Read Only */
-+#define       MCF_XBS_CRS_ARB         0x00000100      /* Arbitration Mode */
-+#define       MCF_XBS_CRS_PCTL        0x00000030      /* Parking Control */
-+#define       MCF_XBS_CRS_PARK        0x00000007      /* Park Location */
-+
-+/* MCF_XBS_CRS_ARB Defs */
-+#define MCF_ABS_CRS_ARB_FIXED 0x00000000      /* Fixed priority */
-+#define MCF_ABS_CRS_ARB_ROUND 0x00000100      /* Round Robin priority */
-+
-+/* MCF_XBS_CRS_PCTL Defs */
-+#define MCF_ABS_CRS_PCTL_PARK 0x00000000      /* Park on the defined PARK */
-+#define MCF_ABS_CRS_PCTL_LAST         0x00000010      /* Park on the last master */
-+#define MCF_ABS_CRS_PCTL_NONE         0x00000020      /* Don't park */
-+
-+/* MCF_XBS_CRS_PARK Defs */
-+#define MCF_ABS_CRS_PARK_M0   0x00000000      /* Park on Coldfire Core */
-+#define MCF_ABS_CRS_PARK_M1   0x00000001      /* Park on eDMA */
-+#define MCF_ABS_CRS_PARK_M2   0x00000002      /* Park on FEC0 */
-+#define MCF_ABS_CRS_PARK_M3   0x00000003      /* Park on FEC1 */
-+#define MCF_ABS_CRS_PARK_M4   0x00000004      /* Park on Reserved */
-+#define MCF_ABS_CRS_PARK_M5   0x00000005      /* Park on PCI */
-+#define MCF_ABS_CRS_PARK_M6   0x00000006      /* Park on USB OTG */
-+#define MCF_ABS_CRS_PARK_M7   0x00000007      /* Park on Serial Boot */
-+
-+#endif /* __MCF5445X_XBS_H__ */
---- /dev/null
-+++ b/include/asm-m68k/mcfdspi.h
-@@ -0,0 +1,48 @@
-+/*
-+ * mcfdspi.h-DSPI controller for the ColdFire processors.
-+ *
-+ * Andrey Butok
-+ * Copyright Freescale Semiconductor, Inc. 2008
-+ *
-+ *    This file is based on mcfqspi.h
-+ *
-+ * 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.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ ***************************************************************************
-+ * Changes:
-+ *   v0.001   25 March 2008           Andrey Butok
-+ *            Initial Release - developed on uClinux with 2.6.23 kernel.
-+ *
-+ */
-+
-+#ifndef MCFDSPI_H_
-+#define MCFDSPI_H_
-+
-+struct coldfire_dspi_chip {
-+      u8 mode;
-+      u8 bits_per_word;
-+      u16 void_write_data;
-+      /* Only used in master mode */
-+      u8 dbr;         /* Double baud rate */
-+      u8 pbr;         /* Baud rate prescaler */
-+      u8 br;          /* Baud rate scaler */
-+      u8 pcssck;      /* PCS to SCK delay prescaler */
-+      u8 pasc;        /* After SCK delay prescaler */
-+      u8 pdt;         /* Delay after transfer prescaler */
-+      u8 cssck;       /* PCS to SCK delay scaler */
-+      u8 asc;         /* After SCK delay scaler */
-+      u8 dt;          /* Delay after transfer scaler */
-+};
-+#endif /*MCFDSPI_H_*/
---- /dev/null
-+++ b/include/asm-m68k/mcfqspi.h
-@@ -0,0 +1,51 @@
-+/****************************************************************************/
-+/*
-+ *    mcfqspi.h - Master QSPI controller for the ColdFire processors
-+ *
-+ *    (C) Copyright 2005, Intec Automation,
-+ *                        Mike Lavender (mike@steroidmicros)
-+ *
-+
-+     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.
-+
-+     This program is distributed in the hope that it will be useful,
-+     but WITHOUT ANY WARRANTY; without even the implied warranty of
-+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+     GNU General Public License for more details.
-+
-+     You should have received a copy of the GNU General Public License
-+     along with this program; if not, write to the Free Software
-+     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
-+/* ------------------------------------------------------------------------- */
-+
-+#ifndef MCFQSPI_H_
-+#define MCFQSPI_H_
-+
-+#define QSPI_CS_INIT     0x01
-+#define QSPI_CS_ASSERT         0x02
-+#define QSPI_CS_DROP   0x04
-+
-+struct coldfire_spi_master {
-+      u16 bus_num;
-+      u16 num_chipselect;
-+      u8  irq_source;
-+      u32 irq_vector;
-+      u32 irq_mask;
-+      u8  irq_lp;
-+      u8  par_val;
-+      u32 *irq_list;
-+      void (*cs_control)(u8 cs, u8 command);
-+};
-+
-+
-+struct coldfire_spi_chip {
-+      u8 mode;
-+      u8 bits_per_word;
-+      u8 del_cs_to_clk;
-+      u8 del_after_trans;
-+      u16 void_write_data;
-+};
-+#endif /*MCFQSPI_H_*/
---- /dev/null
-+++ b/include/asm-m68k/mcfsim.h
-@@ -0,0 +1,102 @@
-+/*
-+ *    mcfsim.h -- ColdFire System Integration Module support.
-+ *
-+ *    (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com)
-+ *    (C) Copyright 2000, Lineo Inc. (www.lineo.com)
-+ */
-+
-+#ifndef       mcfsim_h
-+#define       mcfsim_h
-+
-+#if defined(CONFIG_COLDFIRE)
-+#include <asm/coldfire.h>
-+#endif
-+
-+#if defined(CONFIG_M5445X)
-+#include <asm/mcf5445x_intc.h>
-+#include <asm/mcf5445x_gpio.h>
-+#include <asm/mcf5445x_i2c.h>
-+#include <asm/mcf5445x_ccm.h>
-+#include <asm/mcf5445x_pci.h>
-+#include <asm/mcf5445x_pciarb.h>
-+#include <asm/mcf5445x_eport.h>
-+#include <asm/mcf5445x_fbcs.h>
-+#include <asm/mcf5445x_xbs.h>
-+#include <asm/mcf5445x_dtim.h>
-+#elif defined(CONFIG_M547X_8X)
-+#include <asm/m5485sim.h>
-+#include <asm/m5485gpio.h>
-+#endif
-+
-+/*
-+ *    Define the base address of the SIM within the MBAR address space.
-+ */
-+#define       MCFSIM_BASE             0x0             /* Base address of SIM */
-+
-+/*
-+ *    Bit definitions for the ICR family of registers.
-+ */
-+#define       MCFSIM_ICR_AUTOVEC      0x80            /* Auto-vectored intr */
-+#define       MCFSIM_ICR_LEVEL0       0x00            /* Level 0 intr */
-+#define       MCFSIM_ICR_LEVEL1       0x04            /* Level 1 intr */
-+#define       MCFSIM_ICR_LEVEL2       0x08            /* Level 2 intr */
-+#define       MCFSIM_ICR_LEVEL3       0x0c            /* Level 3 intr */
-+#define       MCFSIM_ICR_LEVEL4       0x10            /* Level 4 intr */
-+#define       MCFSIM_ICR_LEVEL5       0x14            /* Level 5 intr */
-+#define       MCFSIM_ICR_LEVEL6       0x18            /* Level 6 intr */
-+#define       MCFSIM_ICR_LEVEL7       0x1c            /* Level 7 intr */
-+
-+#define       MCFSIM_ICR_PRI0         0x00            /* Priority 0 intr */
-+#define       MCFSIM_ICR_PRI1         0x01            /* Priority 1 intr */
-+#define       MCFSIM_ICR_PRI2         0x02            /* Priority 2 intr */
-+#define       MCFSIM_ICR_PRI3         0x03            /* Priority 3 intr */
-+
-+/*
-+ *    Bit definitions for the Interrupt Mask register (IMR).
-+ */
-+#define       MCFSIM_IMR_EINT1        0x0002          /* External intr # 1 */
-+#define       MCFSIM_IMR_EINT2        0x0004          /* External intr # 2 */
-+#define       MCFSIM_IMR_EINT3        0x0008          /* External intr # 3 */
-+#define       MCFSIM_IMR_EINT4        0x0010          /* External intr # 4 */
-+#define       MCFSIM_IMR_EINT5        0x0020          /* External intr # 5 */
-+#define       MCFSIM_IMR_EINT6        0x0040          /* External intr # 6 */
-+#define       MCFSIM_IMR_EINT7        0x0080          /* External intr # 7 */
-+
-+#define       MCFSIM_IMR_SWD          0x0100          /* Software Watchdog intr */
-+#define       MCFSIM_IMR_TIMER1       0x0200          /* TIMER 1 intr */
-+#define       MCFSIM_IMR_TIMER2       0x0400          /* TIMER 2 intr */
-+#define MCFSIM_IMR_MBUS               0x0800          /* MBUS intr    */
-+#define       MCFSIM_IMR_UART1        0x1000          /* UART 1 intr */
-+#define       MCFSIM_IMR_UART2        0x2000          /* UART 2 intr */
-+
-+/*
-+ *    Mask for all of the SIM devices. Some parts have more or less
-+ *    SIM devices. This is a catchall for the sandard set.
-+ */
-+#ifndef MCFSIM_IMR_MASKALL
-+#define       MCFSIM_IMR_MASKALL      0x3ffe          /* All intr sources */
-+#endif
-+
-+
-+/*
-+ *    PIT interrupt settings, if not found in mXXXXsim.h file.
-+ */
-+#ifndef       ICR_INTRCONF
-+#define       ICR_INTRCONF            0x2b            /* PIT1 level 5, priority 3 */
-+#endif
-+#ifndef       MCFPIT_IMR
-+#define       MCFPIT_IMR              MCFINTC_IMRH
-+#endif
-+#ifndef       MCFPIT_IMR_IBIT
-+#define       MCFPIT_IMR_IBIT         (1 << (MCFINT_PIT1 - 32))
-+#endif
-+
-+
-+#ifndef __ASSEMBLY__
-+/*
-+ *    Definition for the interrupt auto-vectoring support.
-+ */
-+extern void   mcf_autovector(unsigned int vec);
-+#endif /* __ASSEMBLY__ */
-+
-+#endif        /* mcfsim_h */
---- /dev/null
-+++ b/include/asm-m68k/mcfuart.h
-@@ -0,0 +1,194 @@
-+/*
-+ *    mcfuart.h -- ColdFire internal UART support defines.
-+ *
-+ *    Matt Waddel Matt.Waddel@freescale.com
-+ *    Copyright Freescale Semiconductor, Inc. 2007
-+ *
-+ *    Derived from m68knommu version of this same file (Greg Ungerer & Lineo).
-+ *
-+ */
-+
-+#ifndef       mcfuart_h
-+#define       mcfuart_h
-+
-+/*
-+ *    Define the base address of the UARTS within the MBAR address
-+ *    space.
-+ */
-+#if defined(CONFIG_M5445X)
-+#include <asm/mcf5445x_intc.h>
-+#define MCFUART_BASE1         0xfc060000      /* Base address of UART1 */
-+#define MCFUART_BASE2         0xfc064000      /* Base address of UART2 */
-+#define MCFUART_BASE3         0xfc068000      /* Base address of UART3 */
-+#define MCFINT_VECBASE                64
-+#define MCFINT_UART0          26
-+
-+#elif defined(CONFIG_M547X_8X)
-+
-+#define MCFUART_BASE1         0x8600          /* Base address of UART1 */
-+#define MCFUART_BASE2         0x8700          /* Base address of UART2 */
-+#define MCFUART_BASE3         0x8800          /* Base address of UART3 */
-+#define MCFUART_BASE4         0x8900          /* Base address of UART4 */
-+#define MCFINT_VECBASE                64
-+#define MCFINT_UART0          35
-+#endif
-+
-+
-+/*
-+ *    Define the ColdFire UART register set addresses.
-+ */
-+#define       MCFUART_UMR             0x00            /* Mode register (r/w) */
-+#define       MCFUART_USR             0x04            /* Status register (r) */
-+#define       MCFUART_UCSR            0x04            /* Clock Select (w) */
-+#define       MCFUART_UCR             0x08            /* Command register (w) */
-+#define       MCFUART_URB             0x0c            /* Receiver Buffer (r) */
-+#define       MCFUART_UTB             0x0c            /* Transmit Buffer (w) */
-+#define       MCFUART_UIPCR           0x10            /* Input Port Change (r) */
-+#define       MCFUART_UACR            0x10            /* Auxiliary Control (w) */
-+#define       MCFUART_UISR            0x14            /* Interrup Status (r) */
-+#define       MCFUART_UIMR            0x14            /* Interrupt Mask (w) */
-+#define       MCFUART_UBG1            0x18            /* Baud Rate MSB (r/w) */
-+#define       MCFUART_UBG2            0x1c            /* Baud Rate LSB (r/w) */
-+#ifdef        CONFIG_M5272
-+#define       MCFUART_UTF             0x28            /* Transmitter FIFO (r/w) */
-+#define       MCFUART_URF             0x2c            /* Receiver FIFO (r/w) */
-+#define       MCFUART_UFPD            0x30            /* Frac Prec. Divider (r/w) */
-+#else
-+#define       MCFUART_UIVR            0x30            /* Interrupt Vector (r/w) */
-+#endif
-+#define       MCFUART_UIPR            0x34            /* Input Port (r) */
-+#define       MCFUART_UOP1            0x38            /* Output Port Bit Set (w) */
-+#define       MCFUART_UOP0            0x3c            /* Output Port Bit Reset (w) */
-+
-+
-+/*
-+ *    Define bit flags in Mode Register 1 (MR1).
-+ */
-+#define       MCFUART_MR1_RXRTS       0x80            /* Auto RTS flow control */
-+#define       MCFUART_MR1_RXIRQFULL   0x40            /* RX IRQ type FULL */
-+#define       MCFUART_MR1_RXIRQRDY    0x00            /* RX IRQ type RDY */
-+#define       MCFUART_MR1_RXERRBLOCK  0x20            /* RX block error mode */
-+#define       MCFUART_MR1_RXERRCHAR   0x00            /* RX char error mode */
-+
-+#define       MCFUART_MR1_PARITYNONE  0x10            /* No parity */
-+#define       MCFUART_MR1_PARITYEVEN  0x00            /* Even parity */
-+#define       MCFUART_MR1_PARITYODD   0x04            /* Odd parity */
-+#define       MCFUART_MR1_PARITYSPACE 0x08            /* Space parity */
-+#define       MCFUART_MR1_PARITYMARK  0x0c            /* Mark parity */
-+
-+#define       MCFUART_MR1_CS5         0x00            /* 5 bits per char */
-+#define       MCFUART_MR1_CS6         0x01            /* 6 bits per char */
-+#define       MCFUART_MR1_CS7         0x02            /* 7 bits per char */
-+#define       MCFUART_MR1_CS8         0x03            /* 8 bits per char */
-+
-+/*
-+ *    Define bit flags in Mode Register 2 (MR2).
-+ */
-+#define       MCFUART_MR2_LOOPBACK    0x80            /* Loopback mode */
-+#define       MCFUART_MR2_REMOTELOOP  0xc0            /* Remote loopback mode */
-+#define       MCFUART_MR2_AUTOECHO    0x40            /* Automatic echo */
-+#define       MCFUART_MR2_TXRTS       0x20            /* Assert RTS on TX */
-+#define       MCFUART_MR2_TXCTS       0x10            /* Auto CTS flow control */
-+
-+#define       MCFUART_MR2_STOP1       0x07            /* 1 stop bit */
-+#define       MCFUART_MR2_STOP15      0x08            /* 1.5 stop bits */
-+#define       MCFUART_MR2_STOP2       0x0f            /* 2 stop bits */
-+
-+/*
-+ *    Define bit flags in Status Register (USR).
-+ */
-+#define       MCFUART_USR_RXBREAK     0x80            /* Received BREAK */
-+#define       MCFUART_USR_RXFRAMING   0x40            /* Received framing error */
-+#define       MCFUART_USR_RXPARITY    0x20            /* Received parity error */
-+#define       MCFUART_USR_RXOVERRUN   0x10            /* Received overrun error */
-+#define       MCFUART_USR_TXEMPTY     0x08            /* Transmitter empty */
-+#define       MCFUART_USR_TXREADY     0x04            /* Transmitter ready */
-+#define       MCFUART_USR_RXFULL      0x02            /* Receiver full */
-+#define       MCFUART_USR_RXREADY     0x01            /* Receiver ready */
-+
-+#if defined(CONFIG_M547X_8X)
-+#define       MCFUART_USR_TXREADY_BN  0x0a
-+#define       MCFUART_USR_TXEMPTY_BN  0x0b
-+#endif
-+
-+#define       MCFUART_USR_RXERR       (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \
-+                              MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN)
-+
-+/*
-+ *    Define bit flags in Clock Select Register (UCSR).
-+ */
-+#define       MCFUART_UCSR_RXCLKTIMER 0xd0            /* RX clock is timer */
-+#define       MCFUART_UCSR_RXCLKEXT16 0xe0            /* RX clock is external x16 */
-+#define       MCFUART_UCSR_RXCLKEXT1  0xf0            /* RX clock is external x1 */
-+
-+#define       MCFUART_UCSR_TXCLKTIMER 0x0d            /* TX clock is timer */
-+#define       MCFUART_UCSR_TXCLKEXT16 0x0e            /* TX clock is external x16 */
-+#define       MCFUART_UCSR_TXCLKEXT1  0x0f            /* TX clock is external x1 */
-+
-+/*
-+ *    Define bit flags in Command Register (UCR).
-+ */
-+#define       MCFUART_UCR_CMDNULL             0x00    /* No command */
-+#define       MCFUART_UCR_CMDRESETMRPTR       0x10    /* Reset MR pointer */
-+#define       MCFUART_UCR_CMDRESETRX          0x20    /* Reset receiver */
-+#define       MCFUART_UCR_CMDRESETTX          0x30    /* Reset transmitter */
-+#define       MCFUART_UCR_CMDRESETERR         0x40    /* Reset error status */
-+#define       MCFUART_UCR_CMDRESETBREAK       0x50    /* Reset BREAK change */
-+#define       MCFUART_UCR_CMDBREAKSTART       0x60    /* Start BREAK */
-+#define       MCFUART_UCR_CMDBREAKSTOP        0x70    /* Stop BREAK */
-+
-+#define       MCFUART_UCR_TXNULL      0x00            /* No TX command */
-+#define       MCFUART_UCR_TXENABLE    0x04            /* Enable TX */
-+#define       MCFUART_UCR_TXDISABLE   0x08            /* Disable TX */
-+#define       MCFUART_UCR_RXNULL      0x00            /* No RX command */
-+#define       MCFUART_UCR_RXENABLE    0x01            /* Enable RX */
-+#define       MCFUART_UCR_RXDISABLE   0x02            /* Disable RX */
-+
-+/*
-+ *    Define bit flags in Input Port Change Register (UIPCR).
-+ */
-+#define       MCFUART_UIPCR_CTSCOS    0x10            /* CTS change of state */
-+#define       MCFUART_UIPCR_CTS       0x01            /* CTS value */
-+
-+/*
-+ *    Define bit flags in Input Port Register (UIP).
-+ */
-+#define       MCFUART_UIPR_CTS        0x01            /* CTS value */
-+
-+/*
-+ *    Define bit flags in Output Port Registers (UOP).
-+ *    Clear bit by writing to UOP0, set by writing to UOP1.
-+ */
-+#define       MCFUART_UOP_RTS         0x01            /* RTS set or clear */
-+
-+/*
-+ *    Define bit flags in the Auxiliary Control Register (UACR).
-+ */
-+#define       MCFUART_UACR_IEC        0x01            /* Input enable control */
-+
-+/*
-+ *    Define bit flags in Interrupt Status Register (UISR).
-+ *    These same bits are used for the Interrupt Mask Register (UIMR).
-+ */
-+#define       MCFUART_UIR_COS         0x80            /* Change of state (CTS) */
-+#define       MCFUART_UIR_DELTABREAK  0x04            /* Break start or stop */
-+#define       MCFUART_UIR_RXREADY     0x02            /* Receiver ready */
-+#define       MCFUART_UIR_TXREADY     0x01            /* Transmitter ready */
-+
-+#ifdef        CONFIG_M5272
-+/*
-+ *    Define bit flags in the Transmitter FIFO Register (UTF).
-+ */
-+#define       MCFUART_UTF_TXB         0x1f            /* Transmitter data level */
-+#define       MCFUART_UTF_FULL        0x20            /* Transmitter fifo full */
-+#define       MCFUART_UTF_TXS         0xc0            /* Transmitter status */
-+
-+/*
-+ *    Define bit flags in the Receiver FIFO Register (URF).
-+ */
-+#define       MCFUART_URF_RXB         0x1f            /* Receiver data level */
-+#define       MCFUART_URF_FULL        0x20            /* Receiver fifo full */
-+#define       MCFUART_URF_RXS         0xc0            /* Receiver status */
-+#endif
-+
-+#endif        /* mcfuart_h */
---- a/include/asm-m68k/mmu_context.h
-+++ b/include/asm-m68k/mmu_context.h
-@@ -7,7 +7,7 @@ static inline void enter_lazy_tlb(struct
- {
- }
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- #include <asm/setup.h>
- #include <asm/page.h>
-@@ -102,7 +102,7 @@ static inline void activate_mm(struct mm
-               switch_mm_0460(next_mm);
- }
--#else  /* CONFIG_SUN3 */
-+#elif defined(CONFIG_SUN3)
- #include <asm/sun3mmu.h>
- #include <linux/sched.h>
-@@ -150,5 +150,155 @@ static inline void activate_mm(struct mm
-       activate_context(next_mm);
- }
--#endif
-+#else /* CONFIG_COLDFIRE */
-+
-+#include <asm/coldfire.h>
-+#include <asm/atomic.h>
-+#include <asm/bitops.h>
-+#include <asm/mmu.h>
-+
-+#define NO_CONTEXT            256
-+#define LAST_CONTEXT          255
-+#define FIRST_CONTEXT         1
-+
-+extern void set_context(mm_context_t context, pgd_t *pgd);
-+extern unsigned long context_map[];
-+extern mm_context_t next_mmu_context;
-+
-+extern atomic_t nr_free_contexts;
-+extern struct mm_struct *context_mm[LAST_CONTEXT+1];
-+extern void steal_context(void);
-+
-+static inline void get_mmu_context(struct mm_struct *mm)
-+{
-+      mm_context_t ctx;
-+
-+      if (mm->context != NO_CONTEXT)
-+              return;
-+      while (atomic_dec_and_test_lt(&nr_free_contexts)) {
-+              atomic_inc(&nr_free_contexts);
-+              steal_context();
-+      }
-+      ctx = next_mmu_context;
-+      while (test_and_set_bit(ctx, context_map)) {
-+              ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
-+              if (ctx > LAST_CONTEXT)
-+                      ctx = 0;
-+      }
-+      next_mmu_context = (ctx + 1) & LAST_CONTEXT;
-+      mm->context = ctx;
-+      context_mm[ctx] = mm;
-+}
-+
-+/*
-+ * Set up the context for a new address space.
-+ */
-+#define init_new_context(tsk, mm)     (((mm)->context = NO_CONTEXT), 0)
-+
-+/*
-+ * We're finished using the context for an address space.
-+ */
-+static inline void destroy_context(struct mm_struct *mm)
-+{
-+      if (mm->context != NO_CONTEXT) {
-+              clear_bit(mm->context, context_map);
-+              mm->context = NO_CONTEXT;
-+              atomic_inc(&nr_free_contexts);
-+      }
-+}
-+
-+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
-+      struct task_struct *tsk)
-+{
-+      get_mmu_context(tsk->mm);
-+      set_context(tsk->mm->context, next->pgd);
-+}
-+
-+/*
-+ * After we have set current->mm to a new value, this activates
-+ * the context for the new mm so we see the new mappings.
-+ */
-+static inline void activate_mm(struct mm_struct *active_mm,
-+      struct mm_struct *mm)
-+{
-+      get_mmu_context(mm);
-+      set_context(mm->context, mm->pgd);
-+}
-+
-+#define deactivate_mm(tsk, mm) do { } while (0)
-+
-+extern void mmu_context_init(void);
-+#if defined(CONFIG_M547X_8X)
-+#define prepare_arch_switch(next) load_ksp_mmu(next)
-+
-+static inline void load_ksp_mmu(struct task_struct *task)
-+{
-+      int flags;
-+      struct mm_struct *mm;
-+      int asid;
-+      pgd_t *pgd;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+      unsigned long mmuar;
-+
-+      local_irq_save(flags);
-+      mmuar = task->thread.ksp;
-+
-+      /* Search for a valid TLB entry, if one is found, don't remap */
-+      *MMUAR = mmuar;
-+      *MMUOR = MMUOR_STLB | MMUOR_ADR;
-+      if ((*MMUSR) & MMUSR_HIT)
-+              goto end;
-+
-+      if (mmuar >= PAGE_OFFSET) {
-+              mm = &init_mm;
-+      } else {
-+              printk ("load_ksp_mmu: non-kernel mm found: 0x%08x\n", (unsigned int) task->mm);
-+              mm = task->mm;
-+      }
-+
-+        if (!mm)
-+          goto bug;
-+
-+        pgd = pgd_offset(mm, mmuar);
-+        if (pgd_none(*pgd))
-+          goto bug;
-+          
-+      pmd = pmd_offset(pgd, mmuar);
-+      if (pmd_none(*pmd))
-+          goto bug;
-+      
-+      pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
-+                                   : pte_offset_map(pmd, mmuar);
-+      if (pte_none(*pte) || !pte_present(*pte))
-+          goto bug;
-+
-+        set_pte(pte, pte_mkyoung(*pte));
-+        asid = mm->context & 0xff;
-+        if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET)
-+          set_pte(pte, pte_wrprotect(*pte));
-+
-+        *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
-+               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT)
-+               | MMUTR_V;
-+
-+        *MMUDR = (pte_val(*pte) & PAGE_MASK) 
-+             | ((pte->pte) & CF_PAGE_MMUDR_MASK)
-+               | MMUDR_SZ8K | MMUDR_X;
-+          
-+      *MMUOR = MMUOR_ACC | MMUOR_UAA;
-+      asm ("nop");
-+
-+      goto end;
-+
-+bug:
-+      printk ("ksp load failed: mm=0x%08x ksp=0x%08x\n", (unsigned int) mm, (unsigned int) mmuar);
-+
-+end:
-+      local_irq_restore(flags);
-+}
-+
-+#endif /* CONFIG_M547X_8X */
-+
-+#endif /* CONFIG_COLDFIRE */
- #endif
---- a/include/asm-m68k/page.h
-+++ b/include/asm-m68k/page.h
-@@ -4,7 +4,7 @@
- #include <linux/const.h>
- /* PAGE_SHIFT determines the page size */
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- #define PAGE_SHIFT    (12)
- #else
- #define PAGE_SHIFT    (13)
-@@ -116,10 +116,31 @@ typedef struct page *pgtable_t;
- extern unsigned long m68k_memoffset;
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3)
- #define WANT_PAGE_VIRTUAL
-+#if defined(CONFIG_COLDFIRE)
-+static inline unsigned long ___pa(void *vaddr)
-+{
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+      return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
-+#else
-+      return (unsigned long)vaddr;
-+#endif
-+}
-+#define __pa(vaddr)   ___pa((void *)(vaddr))
-+
-+static inline void *__va(unsigned long paddr)
-+{
-+#if CONFIG_SDRAM_BASE != PAGE_OFFSET
-+      return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
-+#else
-+      return (void *)paddr;
-+#endif
-+}
-+
-+#else
- static inline unsigned long ___pa(void *vaddr)
- {
-       unsigned long paddr;
-@@ -141,6 +162,7 @@ static inline void *__va(unsigned long p
-               : "0" (paddr), "i" (m68k_fixup_memoffset));
-       return vaddr;
- }
-+#endif
- #else /* !CONFIG_SUN3 */
- /* This #define is a horrible hack to suppress lots of warnings. --m */
-@@ -172,6 +194,8 @@ static inline void *__va(unsigned long x
-  * memory node, but we have no highmem, so that works for now.
-  * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
-  * of the shifts unnecessary.
-+ *
-+ * PFNs are used to map physical pages.  So PFN[0] maps to the base phys addr.
-  */
- #define virt_to_pfn(kaddr)    (__pa(kaddr) >> PAGE_SHIFT)
- #define pfn_to_virt(pfn)      __va((pfn) << PAGE_SHIFT)
-@@ -228,4 +252,9 @@ static inline __attribute_const__ int __
- #include <asm-generic/page.h>
-+#ifdef CONFIG_VSYSCALL
-+/* vDSO support */
-+#define __HAVE_ARCH_GATE_AREA
-+#endif
-+
- #endif /* _M68K_PAGE_H */
---- a/include/asm-m68k/page_offset.h
-+++ b/include/asm-m68k/page_offset.h
-@@ -1,8 +1,15 @@
-+/*
-+ * Page and physical memory maps.
-+ */
-+#if defined(CONFIG_SUN3)
-+#define PAGE_OFFSET_RAW               0x0E000000
-+
-+#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
-+#define       PHYS_OFFSET             CONFIG_SDRAM_BASE
-+#define PAGE_OFFSET_RAW               (PHYS_OFFSET)
-+/* #define PAGE_OFFSET_RAW            0xC0000000 */
--/* This handles the memory map.. */
--#ifndef CONFIG_SUN3
--#define PAGE_OFFSET_RAW               0x00000000
- #else
--#define PAGE_OFFSET_RAW               0x0E000000
-+/* default */
-+#define PAGE_OFFSET_RAW               0x00000000
- #endif
--
---- a/include/asm-m68k/pci.h
-+++ b/include/asm-m68k/pci.h
-@@ -1,57 +1,10 @@
--#ifndef _ASM_M68K_PCI_H
--#define _ASM_M68K_PCI_H
-+#ifndef M68K_PCI_H
-+#define M68K_PCI_H
--/*
-- * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
-- *
-- * Written by Wout Klaren.
-- */
-+#ifdef CONFIG_M5445X
-+#include "5445x_pci.h"
-+#else
-+#include "548x_pci.h"
-+#endif
--#include <asm/scatterlist.h>
--
--struct pci_ops;
--
--/*
-- * Structure with hardware dependent information and functions of the
-- * PCI bus.
-- */
--
--struct pci_bus_info
--{
--      /*
--       * Resources of the PCI bus.
--       */
--
--      struct resource mem_space;
--      struct resource io_space;
--
--      /*
--       * System dependent functions.
--       */
--
--      struct pci_ops *m68k_pci_ops;
--
--      void (*fixup)(int pci_modify);
--      void (*conf_device)(struct pci_dev *dev);
--};
--
--#define pcibios_assign_all_busses()   0
--#define pcibios_scan_all_fns(a, b)    0
--
--static inline void pcibios_set_master(struct pci_dev *dev)
--{
--      /* No special bus mastering setup handling */
--}
--
--static inline void pcibios_penalize_isa_irq(int irq, int active)
--{
--      /* We don't do dynamic PCI IRQ allocation */
--}
--
--/* The PCI address space does equal the physical memory
-- * address space.  The networking and block device layers use
-- * this boolean for bounce buffer decisions.
-- */
--#define PCI_DMA_BUS_IS_PHYS   (1)
--
--#endif /* _ASM_M68K_PCI_H */
-+#endif /* M68K_PCI_H */
---- a/include/asm-m68k/pgalloc.h
-+++ b/include/asm-m68k/pgalloc.h
-@@ -8,8 +8,10 @@
- #include <asm/virtconvert.h>
--#ifdef CONFIG_SUN3
-+#if defined(CONFIG_SUN3)
- #include <asm/sun3_pgalloc.h>
-+#elif defined(CONFIG_COLDFIRE)
-+#include <asm/cf_pgalloc.h>
- #else
- #include <asm/motorola_pgalloc.h>
- #endif
---- a/include/asm-m68k/pgtable.h
-+++ b/include/asm-m68k/pgtable.h
-@@ -40,6 +40,8 @@
- /* PGDIR_SHIFT determines what a third-level page table entry can map */
- #ifdef CONFIG_SUN3
- #define PGDIR_SHIFT     17
-+#elif defined(CONFIG_COLDFIRE)
-+#define PGDIR_SHIFT   22
- #else
- #define PGDIR_SHIFT   25
- #endif
-@@ -54,6 +56,10 @@
- #define PTRS_PER_PTE   16
- #define PTRS_PER_PMD   1
- #define PTRS_PER_PGD   2048
-+#elif defined(CONFIG_COLDFIRE)
-+#define PTRS_PER_PTE    512
-+#define PTRS_PER_PMD    1
-+#define PTRS_PER_PGD    1024
- #else
- #define PTRS_PER_PTE  1024
- #define PTRS_PER_PMD  8
-@@ -66,6 +72,11 @@
- #ifdef CONFIG_SUN3
- #define KMAP_START     0x0DC00000
- #define KMAP_END       0x0E000000
-+#elif defined(CONFIG_COLDFIRE)
-+#define       VMALLOC_START   0xc0000000
-+#define VMALLOC_END   0xcfffffff
-+#define KMAP_START    (VMALLOC_END + 1)
-+#define KMAP_END      0xe0000000
- #else
- #define       KMAP_START      0xd0000000
- #define       KMAP_END        0xf0000000
-@@ -79,9 +90,11 @@
-  * The vmalloc() routines leaves a hole of 4kB between each vmalloced
-  * area for the same reason. ;)
-  */
-+#if !defined(CONFIG_COLDFIRE)
- #define VMALLOC_OFFSET        (8*1024*1024)
- #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
- #define VMALLOC_END KMAP_START
-+#endif
- #else
- extern unsigned long vmalloc_end;
- #define VMALLOC_START 0x0f800000
-@@ -130,6 +143,8 @@ static inline void update_mmu_cache(stru
- #ifdef CONFIG_SUN3
- #include <asm/sun3_pgtable.h>
-+#elif defined(CONFIG_COLDFIRE)
-+#include <asm/cf_pgtable.h>
- #else
- #include <asm/motorola_pgtable.h>
- #endif
-@@ -140,6 +155,9 @@ static inline void update_mmu_cache(stru
- /*
-  * Macro to mark a page protection value as "uncacheable".
-  */
-+#ifdef CONFIG_COLDFIRE
-+# define pgprot_noncached(prot)       (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE))
-+#else /* CONFIG_COLDFIRE */
- #ifdef SUN3_PAGE_NOCACHE
- # define __SUN3_PAGE_NOCACHE  SUN3_PAGE_NOCACHE
- #else
-@@ -154,6 +172,7 @@ static inline void update_mmu_cache(stru
-           ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S))  \
-           : (prot)))
-+#endif /* CONFIG_COLDFIRE */
- #endif /* !__ASSEMBLY__ */
- /*
---- a/include/asm-m68k/processor.h
-+++ b/include/asm-m68k/processor.h
-@@ -22,24 +22,38 @@ static inline unsigned long rdusp(void)
- {
-       unsigned long usp;
-+#ifndef CONFIG_COLDFIRE
-       __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
-+#else
-+      __asm__ __volatile__("movel %/usp,%0" : "=a" (usp));
-+#endif
-       return usp;
- }
- static inline void wrusp(unsigned long usp)
- {
-+#ifndef CONFIG_COLDFIRE
-       __asm__ __volatile__("move %0,%/usp" : : "a" (usp));
-+#else
-+      __asm__ __volatile__("movel %0,%/usp" : : "a" (usp));
-+#endif
- }
- /*
-  * User space process size: 3.75GB. This is hardcoded into a few places,
-  * so don't change it unless you know what you are doing.
-  */
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- #define TASK_SIZE     (0xF0000000UL)
-+#elif defined(CONFIG_COLDFIRE)
-+#define TASK_SIZE       (0xC0000000UL)
-+#else /* CONFIG_SUN3 */
-+#ifdef __ASSEMBLY__
-+#define TASK_SIZE     (0x0E000000)
- #else
- #define TASK_SIZE     (0x0E000000UL)
- #endif
-+#endif
- #ifdef __KERNEL__
- #define STACK_TOP     TASK_SIZE
-@@ -49,9 +63,11 @@ static inline void wrusp(unsigned long u
- /* This decides where the kernel will search for a free chunk of vm
-  * space during mmap's.
-  */
--#ifndef CONFIG_SUN3
--#define TASK_UNMAPPED_BASE    0xC0000000UL
--#else
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
-+#define TASK_UNMAPPED_BASE     0xC0000000UL
-+#elif defined(CONFIG_COLDFIRE)
-+#define TASK_UNMAPPED_BASE     0x80000000UL
-+#else /* CONFIG_SUN3 */
- #define TASK_UNMAPPED_BASE    0x0A000000UL
- #endif
- #define TASK_UNMAPPED_ALIGN(addr, off)        PAGE_ALIGN(addr)
-@@ -60,7 +76,11 @@ struct thread_struct {
-       unsigned long  ksp;             /* kernel stack pointer */
-       unsigned long  usp;             /* user stack pointer */
-       unsigned short sr;              /* saved status register */
-+#ifndef CONFIG_COLDFIRE
-       unsigned short fs;              /* saved fs (sfc, dfc) */
-+#else
-+      mm_segment_t   fs;
-+#endif
-       unsigned long  crp[2];          /* cpu root pointer */
-       unsigned long  esp0;            /* points to SR of stack frame */
-       unsigned long  faddr;           /* info about last fault */
-@@ -81,6 +101,7 @@ struct thread_struct {
- /*
-  * Do necessary setup to start up a newly executed thread.
-  */
-+#ifndef CONFIG_COLDFIRE
- static inline void start_thread(struct pt_regs * regs, unsigned long pc,
-                               unsigned long usp)
- {
-@@ -91,6 +112,23 @@ static inline void start_thread(struct p
-       regs->sr &= ~0x2000;
-       wrusp(usp);
- }
-+#else
-+/*
-+ * Do necessary setup to start up a newly executed thread.
-+ *
-+ * pass the data segment into user programs if it exists,
-+ * it can't hurt anything as far as I can tell
-+ */
-+#define start_thread(_regs, _pc, _usp)                        \
-+do {                                                  \
-+      set_fs(USER_DS); /* reads from user space */    \
-+      (_regs)->pc = (_pc);                            \
-+      if (current->mm)                                \
-+              (_regs)->d5 = current->mm->start_data;  \
-+      (_regs)->sr &= ~0x2000;                         \
-+      wrusp(_usp);                                    \
-+} while (0)
-+#endif
- /* Forward declaration, a strange C thing */
- struct task_struct;
---- a/include/asm-m68k/ptrace.h
-+++ b/include/asm-m68k/ptrace.h
-@@ -38,10 +38,21 @@ struct pt_regs {
-   long     d0;
-   long     orig_d0;
-   long     stkadj;
-+#ifndef CONFIG_COLDFIRE
-   unsigned short sr;
-   unsigned long  pc;
-   unsigned format :  4; /* frame format specifier */
-   unsigned vector : 12; /* vector offset */
-+#else
-+  unsigned long mmuar;
-+  unsigned long mmusr;
-+  unsigned format : 4;  /* frame format specifier */
-+  unsigned fs2 : 2;
-+  unsigned vector: 8;
-+  unsigned fs1 : 2;
-+  unsigned short sr;
-+  unsigned long pc;
-+#endif
- };
- /*
---- a/include/asm-m68k/raw_io.h
-+++ b/include/asm-m68k/raw_io.h
-@@ -46,6 +46,29 @@ extern void __iounmap(void *addr, unsign
- #define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w))
- #define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l))
-+#if (defined CONFIG_COLDFIRE) && (defined CONFIG_PCI)
-+unsigned char  pci_inb(long addr);
-+unsigned short pci_inw(long addr);
-+unsigned long  pci_inl(long addr);
-+void pci_outb(unsigned char  val, long addr);
-+void pci_outw(unsigned short val, long addr);
-+void pci_outl(unsigned long  val, long addr);
-+unsigned short pci_raw_inw(long addr);
-+unsigned long  pci_raw_inl(long addr);
-+void pci_raw_outw(unsigned short val, long addr);
-+void pci_raw_outl(unsigned long  val, long addr);
-+#define raw_inb(port) pci_inb((long)((volatile unsigned char *)(port)))
-+#define raw_inw(port) pci_raw_inw((long)((volatile unsigned short *)(port)))
-+#define raw_inl(port) pci_raw_inl((long)((volatile unsigned long *)(port)))
-+
-+#define raw_outb(val,port) pci_outb((val),(long)((volatile unsigned char *)(port)))
-+#define raw_outw(val,port) pci_raw_outw((val),(long)((volatile unsigned short *)(port)))
-+#define raw_outl(val,port) pci_raw_outl((val),(long)((volatile unsigned long *)(port)))
-+
-+#define swap_inw(port) pci_inw((long)((volatile unsigned short *)(port)))
-+#define swap_outw(val,port) pci_outw((val),(long)((volatile unsigned short *)(port)))
-+
-+#else
- #define raw_inb in_8
- #define raw_inw in_be16
- #define raw_inl in_be32
-@@ -60,6 +83,9 @@ extern void __iounmap(void *addr, unsign
- #define __raw_writew(val,addr) out_be16((addr),(val))
- #define __raw_writel(val,addr) out_be32((addr),(val))
-+#define swap_inw(port) in_le16((port))
-+#define swap_outw(val,port) out_le16((port),(val))
-+#endif
- static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
- {
-       unsigned int i;
-@@ -77,6 +103,7 @@ static inline void raw_outsb(volatile u8
-               out_8(port, *buf++);
- }
-+#ifndef CONFIG_COLDFIRE
- static inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr)
- {
-       unsigned int tmp;
-@@ -342,6 +369,63 @@ static inline void raw_outsw_swapw(volat
-               : "d0", "a0", "a1", "d6");
- }
-+
-+#else /*CONFIG_COLDFIRE */
-+
-+static inline void raw_insw(volatile u16 *port, u16 *buf, unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++)
-+              *buf++ = raw_inw(port);
-+}
-+
-+static inline void raw_outsw(volatile u16 *port, const u16 *buf,
-+      unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++, buf++)
-+              raw_outw(*buf, port);
-+}
-+
-+static inline void raw_insl(volatile u32 *port, u32 *buf, unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++)
-+              *buf++ = raw_inl(port);
-+}
-+
-+static inline void raw_outsl(volatile u32 *port, const u32 *buf,
-+      unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++, buf++)
-+              raw_outl(*buf, port);
-+}
-+
-+static inline void raw_insw_swapw(volatile u16 *port, u16 *buf,
-+                                unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++)
-+              *buf++ = in_le16(port);
-+
-+}
-+
-+static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf,
-+                                 unsigned int nr)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < nr; i++, buf++)
-+              out_le16(port, *buf);
-+}
-+#endif /*CONFIG_COLDFIRE */
-+
- #endif /* __KERNEL__ */
- #endif /* _RAW_IO_H */
---- a/include/asm-m68k/segment.h
-+++ b/include/asm-m68k/segment.h
-@@ -29,6 +29,7 @@ typedef struct {
-  * Get/set the SFC/DFC registers for MOVES instructions
-  */
-+#ifndef CONFIG_COLDFIRE
- static inline mm_segment_t get_fs(void)
- {
-       mm_segment_t _v;
-@@ -50,6 +51,15 @@ static inline void set_fs(mm_segment_t v
-                             : /* no outputs */ : "r" (val.seg) : "memory");
- }
-+#else /* CONFIG_COLDFIRE */
-+
-+#include <asm/current.h>
-+#define get_fs()        (current->thread.fs)
-+#define set_fs(val)     (current->thread.fs = (val))
-+#define get_ds()      (KERNEL_DS)
-+
-+#endif /* CONFIG_COLDFIRE */
-+
- #define segment_eq(a,b)       ((a).seg == (b).seg)
- #endif /* __ASSEMBLY__ */
---- a/include/asm-m68k/setup.h
-+++ b/include/asm-m68k/setup.h
-@@ -40,6 +40,7 @@
- #define MACH_HP300    9
- #define MACH_Q40     10
- #define MACH_SUN3X   11
-+#define MACH_CFMMU   12
- #define COMMAND_LINE_SIZE 256
-@@ -189,6 +190,14 @@ extern unsigned long m68k_machtype;
- #  define MACH_TYPE (MACH_SUN3X)
- #endif
-+#if !defined(CONFIG_COLDFIRE)
-+#  define MACH_IS_COLDFIRE (0)
-+#else
-+#  define CONFIG_COLDFIRE_ONLY
-+#  define MACH_IS_COLDFIRE (1)
-+#  define MACH_TYPE (MACH_CFMMU)
-+#endif
-+
- #ifndef MACH_TYPE
- #  define MACH_TYPE (m68k_machtype)
- #endif
-@@ -211,23 +220,31 @@ extern unsigned long m68k_machtype;
- #define CPUB_68030     1
- #define CPUB_68040     2
- #define CPUB_68060     3
-+#define CPUB_CFV4E     4
- #define CPU_68020      (1<<CPUB_68020)
- #define CPU_68030      (1<<CPUB_68030)
- #define CPU_68040      (1<<CPUB_68040)
- #define CPU_68060      (1<<CPUB_68060)
-+#define CPU_CFV4E      (1<<CPUB_CFV4E)
- #define FPUB_68881     0
- #define FPUB_68882     1
- #define FPUB_68040     2                       /* Internal FPU */
- #define FPUB_68060     3                       /* Internal FPU */
- #define FPUB_SUNFPA    4                       /* Sun-3 FPA */
-+#define FPUB_CFV4E     5
- #define FPU_68881      (1<<FPUB_68881)
- #define FPU_68882      (1<<FPUB_68882)
- #define FPU_68040      (1<<FPUB_68040)
- #define FPU_68060      (1<<FPUB_68060)
- #define FPU_SUNFPA     (1<<FPUB_SUNFPA)
-+#ifndef CONFIG_M5445X
-+#define FPU_CFV4E      (1<<FPUB_CFV4E)
-+#else
-+#define FPU_CFV4E      0
-+#endif
- #define MMUB_68851     0
- #define MMUB_68030     1                       /* Internal MMU */
-@@ -235,6 +252,7 @@ extern unsigned long m68k_machtype;
- #define MMUB_68060     3                       /* Internal MMU */
- #define MMUB_APOLLO    4                       /* Custom Apollo */
- #define MMUB_SUN3      5                       /* Custom Sun-3 */
-+#define MMUB_CFV4E     6
- #define MMU_68851      (1<<MMUB_68851)
- #define MMU_68030      (1<<MMUB_68030)
-@@ -242,6 +260,7 @@ extern unsigned long m68k_machtype;
- #define MMU_68060      (1<<MMUB_68060)
- #define MMU_SUN3       (1<<MMUB_SUN3)
- #define MMU_APOLLO     (1<<MMUB_APOLLO)
-+#define MMU_CFV4E      (1<<MMUB_CFV4E)
- #ifdef __KERNEL__
-@@ -341,6 +360,14 @@ extern int m68k_is040or060;
- #  endif
- #endif
-+#if !defined(CONFIG_CFV4E)
-+#  define CPU_IS_COLDFIRE (0)
-+#else
-+#  define CPU_IS_COLDFIRE (1)
-+#  define CPU_IS_CFV4E    (1)
-+#  define MMU_IS_CFV4E    (1)
-+#endif
-+
- #define CPU_TYPE (m68k_cputype)
- #ifdef CONFIG_M68KFPU_EMU
---- a/include/asm-m68k/signal.h
-+++ b/include/asm-m68k/signal.h
-@@ -150,6 +150,7 @@ typedef struct sigaltstack {
- #ifdef __KERNEL__
- #include <asm/sigcontext.h>
-+#ifndef CONFIG_COLDFIRE
- #define __HAVE_ARCH_SIG_BITOPS
- static inline void sigaddset(sigset_t *set, int _sig)
-@@ -200,6 +201,10 @@ static inline int sigfindinword(unsigned
- struct pt_regs;
- extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
-+#else
-+
-+#define ptrace_signal_deliver(regs, cookie) do { } while (0)
-+#endif /* CONFIG_COLDFIRE */
- #endif /* __KERNEL__ */
---- a/include/asm-m68k/string.h
-+++ b/include/asm-m68k/string.h
-@@ -93,6 +93,7 @@ static inline char *strchr(const char *s
-       return (char *)s - 1;
- }
-+#ifndef CONFIG_COLDFIRE
- #define __HAVE_ARCH_STRCMP
- static inline int strcmp(const char *cs, const char *ct)
- {
-@@ -110,6 +111,7 @@ static inline int strcmp(const char *cs,
-               : "+a" (cs), "+a" (ct), "=d" (res));
-       return res;
- }
-+#endif
- #define __HAVE_ARCH_MEMSET
- extern void *memset(void *, int, __kernel_size_t);
---- a/include/asm-m68k/system.h
-+++ b/include/asm-m68k/system.h
-@@ -5,9 +5,24 @@
- #include <linux/kernel.h>
- #include <asm/segment.h>
- #include <asm/entry.h>
-+#include <asm/cfcache.h>
- #ifdef __KERNEL__
-+#ifdef CONFIG_COLDFIRE
-+#define FLUSH_BC        (0x00040000)
-+
-+#define finish_arch_switch(prev) do {         \
-+      unsigned long tmpreg;                   \
-+      asm volatile ( "move.l %2,%0\n"         \
-+                     "orl %1,%0\n"            \
-+                     "movec %0,%%cacr"        \
-+                     : "=&d" (tmpreg)         \
-+                     : "id" (FLUSH_BC), "m" (shadow_cacr));   \
-+      } while(0)
-+
-+#endif
-+
- /*
-  * switch_to(n) should switch tasks to task ptr, first checking that
-  * ptr isn't the current task, in which case it does nothing.  This
-@@ -63,16 +78,25 @@ asmlinkage void resume(void);
- #define smp_read_barrier_depends()    ((void)0)
- /* interrupt control.. */
--#if 0
--#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory")
--#else
- #include <linux/hardirq.h>
-+#ifndef CONFIG_COLDFIRE
- #define local_irq_enable() ({                                                 \
-       if (MACH_IS_Q40 || !hardirq_count())                                    \
-               asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory");    \
- })
--#endif
- #define local_irq_disable() asm volatile ("oriw  #0x0700,%%sr": : : "memory")
-+#else /* CONFIG_COLDFIRE */
-+#define local_irq_enable()                                            \
-+      asm volatile ("move.w %%sr, %%d0\n\t"                           \
-+                    "andil #0xf8ff,%%d0\n\t"                          \
-+                    "move.w %%d0, %%sr\n"                             \
-+                    : : : "cc", "d0", "memory")
-+#define local_irq_disable()                                           \
-+      asm volatile ("move %/sr,%%d0\n\t"                              \
-+                    "ori.l  #0x0700,%%d0\n\t"                         \
-+                    "move %%d0,%/sr\n"                                \
-+                    : : : "cc", "%d0", "memory")
-+#endif
- #define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory")
- #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
---- a/include/asm-m68k/thread_info.h
-+++ b/include/asm-m68k/thread_info.h
-@@ -58,5 +58,6 @@ struct thread_info {
- #define TIF_DELAYED_TRACE     14      /* single step a syscall */
- #define TIF_SYSCALL_TRACE     15      /* syscall trace active */
- #define TIF_MEMDIE            16
-+#define TIF_FREEZE            17      /* freezing processes */
- #endif        /* _ASM_M68K_THREAD_INFO_H */
---- a/include/asm-m68k/tlbflush.h
-+++ b/include/asm-m68k/tlbflush.h
-@@ -2,7 +2,7 @@
- #define _M68K_TLBFLUSH_H
--#ifndef CONFIG_SUN3
-+#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
- #include <asm/current.h>
-@@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang
-       flush_tlb_all();
- }
--#else
-+static inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+}
-+
-+#elif defined(CONFIG_SUN3)
- /* Reserved PMEGs. */
-@@ -214,6 +219,13 @@ static inline void flush_tlb_kernel_page
-       sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG);
- }
-+static inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+}
-+
-+#else /* CONFIG_COLDFIRE */
-+#include <asm/cf_tlbflush.h>
- #endif
- #endif /* _M68K_TLBFLUSH_H */
---- a/include/asm-m68k/uaccess.h
-+++ b/include/asm-m68k/uaccess.h
-@@ -1,6 +1,9 @@
- #ifndef __M68K_UACCESS_H
- #define __M68K_UACCESS_H
-+#ifdef CONFIG_COLDFIRE
-+#include <asm/cf_uaccess.h>
-+#else
- /*
-  * User space memory access functions
-  */
-@@ -367,4 +370,5 @@ unsigned long __clear_user(void __user *
- #define strlen_user(str) strnlen_user(str, 32767)
-+#endif /* CONFIG_COLDFIRE */
- #endif /* _M68K_UACCESS_H */
---- a/include/asm-m68k/virtconvert.h
-+++ b/include/asm-m68k/virtconvert.h
-@@ -46,9 +46,14 @@ static inline void *phys_to_virt(unsigne
- #define virt_to_bus(a) (virt_to_phys(a) + (MACH_IS_HADES ? 0x80000000 : 0))
- #define bus_to_virt(a) (phys_to_virt((a) - (MACH_IS_HADES ? 0x80000000 : 0)))
- #else
-+#ifdef CONFIG_COLDFIRE
-+#define virt_to_bus(a) (a - PAGE_OFFSET + PCI_DMA_BASE)
-+#define bus_to_virt(a) (a - PCI_DMA_BASE + PAGE_OFFSET)
-+#else /* CONFIG_COLDFIRE */
- #define virt_to_bus virt_to_phys
- #define bus_to_virt phys_to_virt
- #endif
-+#endif
- #endif
- #endif
---- /dev/null
-+++ b/include/linux/can/dev.h
-@@ -0,0 +1,62 @@
-+/*
-+ * linux/can/dev.h
-+ *
-+ * Definitions for CAN controller network devices lib (work in progress)
-+ *
-+ * * * $Id$
-+ *
-+ * Author: Andrey Volkov <avolkov@varma-el.com>
-+ * Copyright (c) 2006 Varma Electronics Oy
-+ *
-+ */
-+
-+#ifndef CAN_DEVICE_H
-+#define CAN_DEVICE_H
-+
-+#include <linux/version.h>
-+#include <linux/can/error.h>
-+#include <linux/can/ioctl.h>
-+
-+struct can_priv {
-+      struct can_device_stats can_stats;
-+
-+      /* can-bus oscillator frequency, in Hz,
-+         BE CAREFUL! SOME CONTROLLERS (LIKE SJA1000)
-+         FOOLISH ABOUT THIS FRQ (for sja1000 as ex. this
-+         clock must be xtal clock divided by 2). */
-+      u32     can_sys_clock;
-+
-+      /* by default max_brp is equal 64,
-+         but for a Freescale TouCAN, as ex., it can be 255*/
-+      u32     max_brp;
-+      /* For the mostly all controllers, max_sjw is equal 4, but
-+         some, hmm, CAN implementations hardwared it to 1 */
-+      u8      max_sjw;
-+
-+      u32     baudrate;       /* in bauds */
-+      struct can_bittime      bit_time;
-+
-+      spinlock_t irq_lock;
-+      /* Please hold this lock when touching net_stats/can_stats*/
-+      spinlock_t stats_lock;
-+
-+      can_state_t state;
-+      can_mode_t  mode;
-+      can_ctrlmode_t ctrlmode;
-+
-+      int (*do_set_bit_time)(struct net_device *dev, struct can_bittime *br);
-+      int (*do_get_state)   (struct net_device *dev, can_state_t *state);
-+      int (*do_set_mode)    (struct net_device *dev, can_mode_t mode);
-+      int (*do_set_ctrlmode)(struct net_device *dev, can_ctrlmode_t ctrlmode);
-+      int (*do_get_ctrlmode)(struct net_device *dev, can_ctrlmode_t *ctrlmode);
-+};
-+
-+#define ND2D(_ndev)           (_ndev->dev.parent)
-+
-+struct net_device *alloc_candev(int sizeof_priv);
-+void free_candev(struct net_device *dev);
-+
-+int can_calc_bit_time(struct can_priv *can, u32 baudrate,
-+                    struct can_bittime_std *bit_time);
-+
-+#endif /* CAN_DEVICE_H */
---- /dev/null
-+++ b/include/linux/can/ioctl.h
-@@ -0,0 +1,152 @@
-+/*
-+ * linux/can/ioctl.h
-+ *
-+ * Definitions for CAN controller setup (work in progress)
-+ *
-+ * $Id$
-+ *
-+ * Send feedback to <socketcan-users@lists.berlios.de>
-+ *
-+ */
-+
-+#ifndef CAN_IOCTL_H
-+#define CAN_IOCTL_H
-+
-+#include <linux/sockios.h>
-+
-+
-+/* max. 16 private ioctls */
-+
-+#define SIOCSCANBAUDRATE      (SIOCDEVPRIVATE+0)
-+#define SIOCGCANBAUDRATE      (SIOCDEVPRIVATE+1)
-+
-+#define SIOCSCANCUSTOMBITTIME   (SIOCDEVPRIVATE+2)
-+#define SIOCGCANCUSTOMBITTIME   (SIOCDEVPRIVATE+3)
-+
-+#define SIOCSCANMODE          (SIOCDEVPRIVATE+4)
-+#define SIOCGCANMODE          (SIOCDEVPRIVATE+5)
-+
-+#define SIOCSCANCTRLMODE      (SIOCDEVPRIVATE+6)
-+#define SIOCGCANCTRLMODE      (SIOCDEVPRIVATE+7)
-+
-+#define SIOCSCANFILTER                (SIOCDEVPRIVATE+8)
-+#define SIOCGCANFILTER                (SIOCDEVPRIVATE+9)
-+
-+#define SIOCGCANSTATE         (SIOCDEVPRIVATE+10)
-+#define SIOCGCANSTATS         (SIOCDEVPRIVATE+11)
-+
-+#define SIOCSCANERRORCONFIG   (SIOCDEVPRIVATE+12)
-+#define SIOCGCANERRORCONFIG   (SIOCDEVPRIVATE+13)
-+
-+/* parameters for ioctls */
-+
-+/* SIOC[SG]CANBAUDRATE */
-+/* baudrate for CAN-controller in bits per second. */
-+/* 0 = Scan for baudrate (Autobaud) */
-+
-+typedef __u32 can_baudrate_t;
-+
-+
-+/* SIOC[SG]CANCUSTOMBITTIME */
-+
-+typedef enum CAN_BITTIME_TYPE {
-+      CAN_BITTIME_STD,
-+      CAN_BITTIME_BTR
-+} can_bittime_type_t;
-+
-+/* TSEG1 of controllers usually is a sum of synch_seg (always 1),
-+ * prop_seg and phase_seg1, TSEG2 = phase_seg2 */
-+
-+struct can_bittime_std {
-+      __u32 brp;        /* baud rate prescaler */
-+      __u8  prop_seg;   /* from 1 to 8 */
-+      __u8  phase_seg1; /* from 1 to 8 */
-+      __u8  phase_seg2; /* from 1 to 8 */
-+      __u8  sjw:7;      /* from 1 to 4 */
-+      __u8  sam:1;      /* 1 - enable triple sampling */
-+};
-+
-+struct can_bittime_btr {
-+      __u8  btr0;
-+      __u8  btr1;
-+};
-+
-+struct can_bittime {
-+      can_bittime_type_t type;
-+      union {
-+              struct can_bittime_std std;
-+              struct can_bittime_btr btr;
-+      };
-+};
-+
-+#define CAN_BAUDRATE_UNCONFIGURED     ((__u32) 0xFFFFFFFFU)
-+#define CAN_BAUDRATE_UNKNOWN          0
-+
-+/* SIOC[SG]CANMODE */
-+
-+typedef __u32 can_mode_t;
-+
-+#define CAN_MODE_STOP 0
-+#define CAN_MODE_START        1
-+#define CAN_MODE_SLEEP        2
-+
-+
-+/* SIOC[SG]CANCTRLMODE */
-+
-+typedef __u32 can_ctrlmode_t;
-+
-+#define CAN_CTRLMODE_LOOPBACK   0x1
-+#define CAN_CTRLMODE_LISTENONLY 0x2
-+
-+
-+/* SIOCGCANFILTER */
-+
-+typedef __u32 can_filter_t;
-+
-+/* filter modes (may vary due to controller specific capabilities) */
-+#define CAN_FILTER_CAPAB       0  /* get filter type capabilities
-+                                   (32 Bit value) */
-+#define CAN_FILTER_MASK_VALUE  1  /* easy bit filter (see struct can_filter) */
-+#define CAN_FILTER_SFF_BITMASK 2  /* bitfield with 2048 bit SFF filter */
-+                                /* filters 3 - 31 currently undefined */
-+
-+#define CAN_FILTER_MAX         31 /* max. filter type value */
-+
-+
-+/* SIOCGCANSTATE */
-+
-+typedef __u32 can_state_t;
-+
-+#define CAN_STATE_ACTIVE              0
-+#define CAN_STATE_BUS_WARNING         1
-+#define CAN_STATE_BUS_PASSIVE         2
-+#define CAN_STATE_BUS_OFF             3
-+#define CAN_STATE_SCANNING_BAUDRATE   4
-+#define CAN_STATE_STOPPED             5
-+#define CAN_STATE_SLEEPING            6
-+
-+
-+/* SIOCGCANSTATS */
-+
-+struct can_device_stats {
-+      int error_warning;
-+      int data_overrun;
-+      int wakeup;
-+      int bus_error;
-+      int error_passive;
-+      int arbitration_lost;
-+      int restarts;
-+      int bus_error_at_init;
-+};
-+
-+/* SIOC[SG]CANERRORCONFIG */
-+
-+typedef enum CAN_ERRCFG_TYPE {
-+      CAN_ERRCFG_MASK,
-+      CAN_ERRCFG_BUSERR,
-+      CAN_ERRCFG_BUSOFF
-+} can_errcfg_type_t;
-+
-+/* tbd */
-+
-+#endif /* CAN_IOCTL_H */
---- /dev/null
-+++ b/include/linux/can/version.h
-@@ -0,0 +1,22 @@
-+/*
-+ * linux/can/version.h
-+ *
-+ * Version information for the CAN network layer implementation
-+
-+ * Author: Urs Thuermann   <urs.thuermann@volkswagen.de>
-+ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
-+ * All rights reserved.
-+ *
-+ * Send feedback to <socketcan-users@lists.berlios.de>
-+ *
-+ */
-+
-+#ifndef CAN_VERSION_H
-+#define CAN_VERSION_H
-+
-+#define RCSID(s) asm(".section .rodata.str1.1,\"aMS\",@progbits,1\n\t" \
-+                   ".string \"" s "\"\n\t.previous\n")
-+
-+RCSID("$Id$");
-+
-+#endif /* CAN_VERSION_H */
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -873,6 +873,17 @@ struct fb_info {
- #define fb_writeq sbus_writeq
- #define fb_memset sbus_memset_io
-+#elif defined(CONFIG_COLDFIRE)
-+#define fb_readb readb
-+#define fb_readw readw
-+#define fb_readl readl
-+#define fb_readq readq
-+#define fb_writeb writeb
-+#define fb_writew writew
-+#define fb_writel writel
-+#define fb_writeq writeq
-+#define fb_memset memset_io
-+
- #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__)
- #define fb_readb __raw_readb
-@@ -899,7 +910,7 @@ struct fb_info {
- #endif
--#if defined (__BIG_ENDIAN)
-+#if defined (__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
- #define FB_LEFT_POS(bpp)          (32 - bpp)
- #define FB_SHIFT_HIGH(val, bits)  ((val) >> (bits))
- #define FB_SHIFT_LOW(val, bits)   ((val) << (bits))
---- a/include/linux/fsl_devices.h
-+++ b/include/linux/fsl_devices.h
-@@ -91,6 +91,19 @@ enum fsl_usb2_operating_modes {
-       FSL_USB2_DR_OTG,
- };
-+/* DDD
-+ * replace _operating_modes with _controller
-+ *
-+ * the operating_mode tests in fsl_platform_verify() aren't needed,
-+ * since the ehci driver isn't going to be probe()d unless it's
-+ * "fsl-ehci" device anyway, and what we really need to know is
-+ * which controller (MPH/DR) we're dealing with
-+ */
-+enum fsl_usb2_controller {
-+      FSL_USB2_MPH,
-+      FSL_USB2_DR,
-+};
-+
- enum fsl_usb2_phy_modes {
-       FSL_USB2_PHY_NONE,
-       FSL_USB2_PHY_ULPI,
-@@ -101,9 +114,36 @@ enum fsl_usb2_phy_modes {
- struct fsl_usb2_platform_data {
-       /* board specific information */
--      enum fsl_usb2_operating_modes   operating_mode;
-+      /*
-+       * DDD see note above
-+       * enum fsl_usb2_operating_modes        operating_mode;
-+       */
-+      enum fsl_usb2_controller        controller;
-       enum fsl_usb2_phy_modes         phy_mode;
-       unsigned int                    port_enables;
-+      /*
-+       * DDD this could arguably be moved to a separate
-+       * fsl usb2 device header file
-+       */
-+      char *name;                     /* pretty print */
-+      int (*platform_init) (struct platform_device *);
-+      void (*platform_uninit) (struct platform_device *);
-+      int (*platform_verify) (struct platform_device *);
-+      u32                             xcvr_type;      /* PORTSCX_PTS_* */
-+      u32                             view;           /* ULPI viewport register */
-+      u32                             r_start;        /* start of MEM resource */
-+      u32                             r_len;          /* length of MEM resource */
-+      void __iomem                    *regs;          /* ioremap'd register base */
-+      unsigned                        big_endian_mmio : 1;
-+      unsigned                        big_endian_desc : 1;
-+      unsigned                        es : 1;         /* need USBMODE:ES */
-+      unsigned                        have_sysif_regs : 1;
-+      unsigned                        le_setup_buf : 1;
-+      unsigned                        does_otg : 1;   /* set IFF it's an OTG port */
-+
-+      unsigned                        power_budget;   /* for hcd->power_budget */
-+      struct fsl_xcvr_ops             *xcvr_ops;
-+      int                             max_ep_nr;      /* max # of endpoints */
- };
- /* Flags in fsl_usb2_mph_platform_data */
-@@ -126,5 +166,16 @@ struct mpc8xx_pcmcia_ops {
-       int(*voltage_set)(int slot, int vcc, int vpp);
- };
-+struct fsl_ata_platform_data {
-+#ifdef        CONFIG_FSL_PATA_USE_DMA
-+      int     udma_mask;      /* UDMA modes h/w can handle */
-+      int     fifo_alarm;     /* value for fifo_alarm reg */
-+      int     max_sg;         /* longest sglist h/w can handle */
-+#endif
-+      int     (*init)(struct platform_device *pdev);
-+      void    (*exit)(void);
-+      int     (*get_clk_rate)(void);
-+};
-+
- #endif /* _FSL_DEVICE_H_ */
- #endif /* __KERNEL__ */
---- a/include/linux/pci.h
-+++ b/include/linux/pci.h
-@@ -458,8 +458,10 @@ int __must_check pcibios_enable_device(s
- char *pcibios_setup(char *str);
- /* Used only when drivers/pci/setup.c is used */
-+#ifndef CONFIG_COLDFIRE
- void pcibios_align_resource(void *, struct resource *, resource_size_t,
-                               resource_size_t);
-+#endif
- void pcibios_update_irq(struct pci_dev *, int irq);
- /* Generic PCI functions used internally */
---- /dev/null
-+++ b/include/linux/spi/mcfqspi.h
-@@ -0,0 +1,80 @@
-+/****************************************************************************/
-+
-+/*
-+ *    mcfqspi.c - Master QSPI controller for the ColdFire processors
-+ *
-+ *    (C) Copyright 2005, Intec Automation,
-+ *                        Mike Lavender (mike@steroidmicros)
-+ *
-+
-+     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.
-+
-+     This program is distributed in the hope that it will be useful,
-+     but WITHOUT ANY WARRANTY; without even the implied warranty of
-+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+     GNU General Public License for more details.
-+
-+     You should have received a copy of the GNU General Public License
-+     along with this program; if not, write to the Free Software
-+     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
-+/* ------------------------------------------------------------------------- */
-+
-+#ifndef MCFQSPI_H_
-+#define MCFQSPI_H_
-+
-+#define QSPI_CS_INIT          0x01
-+#define QSPI_CS_ASSERT                0x02
-+#define QSPI_CS_DROP          0x04
-+
-+#define QSPIIOCS_DOUT_HIZ     1       /* QMR[DOHIE] set hi-z dout between transfers */
-+#define QSPIIOCS_BITS         2       /* QMR[BITS] set transfer size */
-+#define QSPIIOCG_BITS         3       /* QMR[BITS] get transfer size */
-+#define QSPIIOCS_CPOL         4       /* QMR[CPOL] set SCK inactive state */
-+#define QSPIIOCS_CPHA         5       /* QMR[CPHA] set SCK phase, 1=rising edge */
-+#define QSPIIOCS_BAUD         6       /* QMR[BAUD] set SCK baud rate divider */
-+#define QSPIIOCS_QCD          7       /* QDLYR[QCD] set start delay */
-+#define QSPIIOCS_DTL          8       /* QDLYR[DTL] set after delay */
-+#define QSPIIOCS_CONT         9       /* continuous CS asserted during transfer */
-+#define QSPIIOCS_READDATA     10      /* set data send during read */
-+#define QSPIIOCS_ODD_MOD      11      /* if length of buffer is a odd number, 16-bit transfers */
-+                                      /* are finalized with a 8-bit transfer */
-+#define QSPIIOCS_DSP_MOD      12      /* transfers are bounded to 15/30 bytes (a multiple of 3 bytes = 1 DSPword) */
-+#define QSPIIOCS_POLL_MOD     13      /* driver uses polling instead of interrupts */
-+
-+#define QSPIIOCS_SET_CSIV     14      /* sets CSIV flag (cs inactive level) */
-+
-+#ifdef CONFIG_M520x
-+#undef  MCF_GPIO_PAR_QSPI
-+#define MCF_GPIO_PAR_QSPI      (0xA4034)
-+#endif
-+
-+struct coldfire_spi_master {
-+      u16 bus_num;
-+      u16 num_chipselect;
-+      u8  irq_source;
-+      u32 irq_vector;
-+      u32 irq_mask;
-+      u8  irq_lp;
-+      u8  par_val;
-+      u16 par_val16;
-+      void (*cs_control)(u8 cs, u8 command);
-+};
-+
-+
-+struct coldfire_spi_chip {
-+      u8 mode;
-+      u8 bits_per_word;
-+      u8 del_cs_to_clk;
-+      u8 del_after_trans;
-+      u16 void_write_data;
-+};
-+
-+typedef struct qspi_read_data {
-+        __u32 length;
-+        __u8 *buf;                   /* data to send during read */
-+        unsigned int loop : 1;
-+} qspi_read_data;
-+#endif /*MCFQSPI_H_*/
---- /dev/null
-+++ b/include/linux/usb/fsl_usb2.h
-@@ -0,0 +1,463 @@
-+/*
-+ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/*
-+ * Freescale USB device/endpoint management registers
-+ */
-+#ifndef __FSL_USB2_H
-+#define __FSL_USB2_H
-+
-+
-+ /* USB DR device mode registers (Little Endian) */
-+struct fsl_usb_device_regs {
-+      /* Capability register */
-+      u32 id;
-+      u32 res1[63];
-+      u16 caplength;          /* Capability Register Length */
-+      u16 hciversion;         /* Host Controller Interface Version */
-+      u32 hcsparams;          /* Host Controller Structual Parameters */
-+      u32 hccparams;          /* Host Controller Capability Parameters */
-+      u32 res2[5];
-+      u32 dciversion;         /* Device Controller Interface Version */
-+      u32 dccparams;          /* Device Controller Capability Parameters */
-+      u32 res3[6];
-+      /* Operation register */
-+      u32 usbcmd;             /* USB Command Register */
-+      u32 usbsts;             /* USB Status Register */
-+      u32 usbintr;            /* USB Interrupt Enable Register */
-+      u32 frindex;            /* Frame Index Register */
-+      u32 res4;
-+      u32 deviceaddr;         /* Device Address */
-+      u32 endpointlistaddr;   /* Endpoint List Address Register */
-+      u32 res5;
-+      u32 burstsize;          /* Master Interface Data Burst Size Register */
-+      u32 txttfilltuning;     /* Transmit FIFO Tuning Controls Register */
-+      u32 res6[2];
-+      u32 ulpiview;
-+      u32 res7[3];
-+      u32 configflag;         /* Configure Flag Register */
-+      u32 portsc1;            /* Port 1 Status and Control Register */
-+      u32 res8[7];
-+      u32 otgsc;              /* On-The-Go Status and Control */
-+      u32 usbmode;            /* USB Mode Register */
-+      u32 endptsetupstat;     /* Endpoint Setup Status Register */
-+      u32 endpointprime;      /* Endpoint Initialization Register */
-+      u32 endptflush;         /* Endpoint Flush Register */
-+      u32 endptstatus;        /* Endpoint Status Register */
-+      u32 endptcomplete;      /* Endpoint Complete Register */
-+#if 0
-+      u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */
-+#else
-+      // DDD see DCCPARAMS:DEN for the real number of device endpoints
-+      // DDD 16 is the max
-+      u32 endptctrl[16];      /* Endpoint Control Registers */
-+#endif
-+};
-+
-+ /* USB DR host mode registers (Little Endian) */
-+struct fsl_usb_host_regs {
-+      /* Capability register */
-+      u32 id;
-+      u32 res1[63];
-+      u16 caplength;          /* Capability Register Length */
-+      u16 hciversion;         /* Host Controller Interface Version */
-+      u32 hcsparams;          /* Host Controller Structual Parameters */
-+      u32 hccparams;          /* Host Controller Capability Parameters */
-+      u32 res2[5];
-+      u32 dciversion;         /* Device Controller Interface Version */
-+      u32 dccparams;          /* Device Controller Capability Parameters */
-+      u32 res3[6];
-+      /* Operation register */
-+      u32 usbcmd;             /* USB Command Register */
-+      u32 usbsts;             /* USB Status Register */
-+      u32 usbintr;            /* USB Interrupt Enable Register */
-+      u32 frindex;            /* Frame Index Register */
-+      u32 res4;
-+      u32 periodiclistbase;   /* Periodic Frame List Base Address Register */
-+      u32 asynclistaddr;      /* Current Asynchronous List Address Register */
-+      u32 res5;
-+      u32 burstsize;          /* Master Interface Data Burst Size Register */
-+      u32 txttfilltuning;     /* Transmit FIFO Tuning Controls Register */
-+      u32 res6[2];
-+      u32 ulpiview;
-+      u32 res7[3];
-+      u32 configflag;         /* Configure Flag Register */
-+      u32 portsc1;            /* Port 1 Status and Control Register */
-+      u32 res8[7];
-+      u32 otgsc;              /* On-The-Go Status and Control */
-+      u32 usbmode;            /* USB Mode Register */
-+      u32 endptsetupstat;     /* Endpoint Setup Status Register */
-+      u32 endpointprime;      /* Endpoint Initialization Register */
-+      u32 endptflush;         /* Endpoint Flush Register */
-+      u32 endptstatus;        /* Endpoint Status Register */
-+      u32 endptcomplete;      /* Endpoint Complete Register */
-+#if 0
-+      u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */
-+#else
-+      /* DDD see DCCPARAMS:DEN for the real number of device endpoints */
-+      /* DDD 16 is the max */
-+      u32 endptctrl[16];      /* Endpoint Control Registers */
-+#endif
-+};
-+
-+ /* non-EHCI USB system interface registers (Big Endian) */
-+struct usb_sys_interface {
-+      u32 snoop1;
-+      u32 snoop2;
-+      u32 age_cnt_thresh;     /* Age Count Threshold Register */
-+      u32 pri_ctrl;           /* Priority Control Register */
-+      u32 si_ctrl;            /* System Interface Control Register */
-+      u32 res[59];
-+      u32 control;            /* General Purpose Control Register */
-+};
-+
-+/* ep0 transfer state */
-+#define WAIT_FOR_SETUP                0
-+#define DATA_STATE_XMIT               1
-+#define DATA_STATE_NEED_ZLP   2
-+#define WAIT_FOR_OUT_STATUS   3
-+#define DATA_STATE_RECV               4
-+
-+/* Frame Index Register Bit Masks */
-+#define       USB_FRINDEX_MASKS                       0x3fff
-+
-+
-+
-+/* USBCMD Register Bit Masks */
-+#define USB_CMD_RUN_STOP                      0x00000001
-+#define USB_CMD_CTRL_RESET                    0x00000002
-+#define USB_CMD_PERIODIC_SCHEDULE_EN          0x00000010
-+#define USB_CMD_ASYNC_SCHEDULE_EN             0x00000020
-+#define USB_CMD_INT_AA_DOORBELL                       0x00000040
-+#define USB_CMD_ASP                           0x00000300
-+#define USB_CMD_ASYNC_SCH_PARK_EN             0x00000800
-+#define USB_CMD_SUTW                          0x00002000
-+#define USB_CMD_ATDTW                         0x00004000
-+#define USB_CMD_ITC                           0x00FF0000
-+
-+/* bit 15,3,2 are frame list size */
-+#define USB_CMD_FRAME_SIZE_1024                       0x00000000
-+#define USB_CMD_FRAME_SIZE_512                        0x00000004
-+#define USB_CMD_FRAME_SIZE_256                        0x00000008
-+#define USB_CMD_FRAME_SIZE_128                        0x0000000C
-+#define USB_CMD_FRAME_SIZE_64                 0x00008000
-+#define USB_CMD_FRAME_SIZE_32                 0x00008004
-+#define USB_CMD_FRAME_SIZE_16                 0x00008008
-+#define USB_CMD_FRAME_SIZE_8                  0x0000800C
-+
-+/* bit 9-8 are async schedule park mode count */
-+#define USB_CMD_ASP_00                                0x00000000
-+#define USB_CMD_ASP_01                                0x00000100
-+#define USB_CMD_ASP_10                                0x00000200
-+#define USB_CMD_ASP_11                                0x00000300
-+#define USB_CMD_ASP_BIT_POS                   8
-+
-+/* bit 23-16 are interrupt threshold control */
-+#define USB_CMD_ITC_NO_THRESHOLD              0x00000000
-+#define USB_CMD_ITC_1_MICRO_FRM                       0x00010000
-+#define USB_CMD_ITC_2_MICRO_FRM                       0x00020000
-+#define USB_CMD_ITC_4_MICRO_FRM                       0x00040000
-+#define USB_CMD_ITC_8_MICRO_FRM                       0x00080000
-+#define USB_CMD_ITC_16_MICRO_FRM              0x00100000
-+#define USB_CMD_ITC_32_MICRO_FRM              0x00200000
-+#define USB_CMD_ITC_64_MICRO_FRM              0x00400000
-+#define USB_CMD_ITC_BIT_POS                   16
-+
-+
-+
-+
-+/* USB STS Register Bit Masks */
-+#define USB_STS_INT                           0x00000001
-+#define USB_STS_ERR                           0x00000002
-+#define USB_STS_PORT_CHANGE                   0x00000004
-+#define USB_STS_FRM_LST_ROLL                  0x00000008
-+#define USB_STS_SYS_ERR                               0x00000010
-+#define USB_STS_IAA                           0x00000020
-+#define USB_STS_RESET                         0x00000040
-+#define USB_STS_SOF                           0x00000080
-+#define USB_STS_SUSPEND                               0x00000100
-+#define USB_STS_HC_HALTED                     0x00001000
-+#define USB_STS_RCL                           0x00002000
-+#define USB_STS_PERIODIC_SCHEDULE             0x00004000
-+#define USB_STS_ASYNC_SCHEDULE                        0x00008000
-+
-+/* USB INTR Register Bit Masks */
-+#define USB_INTR_INT_EN                               0x00000001
-+#define USB_INTR_ERR_INT_EN                   0x00000002
-+#define USB_INTR_PTC_DETECT_EN                        0x00000004
-+#define USB_INTR_FRM_LST_ROLL_EN              0x00000008
-+#define USB_INTR_SYS_ERR_EN                   0x00000010
-+#define USB_INTR_ASYN_ADV_EN                  0x00000020
-+#define USB_INTR_RESET_EN                     0x00000040
-+#define USB_INTR_SOF_EN                               0x00000080
-+#define USB_INTR_DEVICE_SUSPEND                       0x00000100
-+
-+/* Device Address bit masks */
-+#define USB_DEVICE_ADDRESS_MASK                       0xFE000000
-+#define USB_DEVICE_ADDRESS_BIT_POS            25
-+
-+/* endpoint list address bit masks */
-+#define USB_EP_LIST_ADDRESS_MASK              0xfffff800
-+
-+
-+/* x_PORTSCx */
-+/* bit 31-30 are port transceiver select */
-+#define PORTSCX_PTS_MASK              (3 << 30)       /* parallel xcvr select mask */
-+#define PORTSCX_PHY_TYPE_SEL          PORTSCX_PTS_MASK
-+#define PORTSCX_PTS_UTMI              (0 << 30)       /* UTMI/UTMI+ */
-+#define PORTSCX_PTS_PHILIPS           (1 << 30)       /* Philips classic */
-+#define PORTSCX_PTS_ULPI              (2 << 30)       /* ULPI */
-+#define PORTSCX_PTS_SERIAL            (3 << 30)       /* serial */
-+#define PORTSCX_PTS_FSLS              PORTSCX_PTS_SERIAL
-+#define PORTSCX_PTS_ONCHIP            PORTSCX_PTS_FSLS
-+
-+#define PORTSCX_STS                   (1 << 29)       /* serial xcvr select */
-+
-+/* bit 28 is parallel transceiver width for UTMI interface */
-+#define PORTSCX_PTW_8BIT              (0 << 28)       /* 8 bit parallel xcvr */
-+#define PORTSCX_PTW_16BIT             (1 << 28)       /* 16 bi parallel xcvr */
-+
-+/* bit 27-26 are port speed */
-+#define PORTSCX_PORT_SPEED_FULL               (0 << 26)
-+#define PORTSCX_PORT_SPEED_LOW                (1 << 26)
-+#define PORTSCX_PORT_SPEED_HIGH               (2 << 26)
-+#define PORTSCX_PORT_SPEED_UNDEF      (3 << 26)
-+#define PORTSCX_PORT_SPEED_MASK               (3 << 26)
-+
-+#define PORTSCX_PHY_LOW_POWER_SPD     (1 << 23)       /* phy low pwr suspend/clk disable */
-+
-+/* bit 19-16 are port test control */
-+#define PORTSCX_PTC_DISABLE           (0 << 16)
-+#define PORTSCX_PTC_JSTATE            (1 << 16)
-+#define PORTSCX_PTC_KSTATE            (2 << 16)
-+#define PORTSCX_PTC_SEQNAK            (3 << 16)       /* SE0 (host) / NAK (device) */
-+#define PORTSCX_PTC_PACKET            (4 << 16)
-+#define PORTSCX_PTC_FORCE_EN_HS               (5 << 16)
-+#define PORTSCX_PTC_FORCE_EN_FS               (6 << 16)
-+#define PORTSCX_PTC_FORCE_EN_LS               (7 << 16)
-+
-+
-+/* bit 15-14 are port indicator control */
-+#define PORTSCX_PIC_OFF                       (0 << 14)
-+#define PORTSCX_PIC_AMBER             (1 << 14)
-+#define PORTSCX_PIC_GREEN             (2 << 14)
-+#define PORTSCX_PIC_UNDEF             (3 << 14)
-+
-+#define PORTSCX_PORT_POWER            (1 << 12)       /* port power */
-+
-+/* bit 11-10 are line status */
-+#define PORTSCX_LS_MASK                       (3 << 10)       /* Line State mask */
-+#define PORTSCX_LS_SE0                        (0 << 10)       /* SE0     */
-+#define PORTSCX_LS_K_STATE            (1 << 10)       /* K-state */
-+#define PORTSCX_LS_J_STATE            (2 << 10)       /* J-state */
-+
-+#define PORTSCX_PORT_RESET            (1 <<  8)       /* Port reset */
-+#define PORTSCX_PORT_SUSPEND          (1 <<  7)       /* Suspend */
-+#define PORTSCX_PORT_FORCE_RESUME     (1 <<  6)       /* Force port resume */
-+#define PORTSCX_OVER_CURRENT_CHG      (1 <<  5)       /* over current change */
-+#define PORTSCX_OVER_CURRENT_ACT      (1 <<  4)       /* over currrent active */
-+#define PORTSCX_PORT_EN_DIS_CHANGE    (1 <<  3)       /* port {en,dis}able change */
-+#define PORTSCX_PORT_ENABLE           (1 <<  2)       /* port enabled */
-+#define PORTSCX_CONNECT_STATUS_CHANGE (1 <<  1)       /* connect status change */
-+#define PORTSCX_CURRENT_CONNECT_STATUS        (1 <<  0)       /* current connect status */
-+
-+#define PORTSCX_W1C_BITS                     \
-+       ( PORTSCX_CONNECT_STATUS_CHANGE |     \
-+         PORTSCX_PORT_EN_DIS_CHANGE    |     \
-+         PORTSCX_OVER_CURRENT_CHG )
-+
-+
-+
-+/* UOG_OTGSC Register Bits */
-+/* control bits: */
-+#define  OTGSC_CTRL_VBUS_DISCHARGE    (1 <<  0)
-+#define  OTGSC_CTRL_VBUS_CHARGE               (1 <<  1)
-+#define  OTGSC_CTRL_OTG_TERM          (1 <<  3)       /* controls DM pulldown */
-+#define  OTGSC_CTRL_DATA_PULSING      (1 <<  4)
-+#define  OTGSC_CTRL_USB_ID_PU         (1 <<  5)       /* enable ID pullup */
-+/* current status: (R/O) */
-+#define  OTGSC_STS_USB_ID             (1 <<  8)       /* 0=A-device  1=B-device */
-+#define  OTGSC_STS_A_VBUS_VALID               (1 <<  9)
-+#define  OTGSC_STS_A_SESSION_VALID    (1 << 10)
-+#define  OTGSC_STS_B_SESSION_VALID    (1 << 11)
-+#define  OTGSC_STS_B_SESSION_END      (1 << 12)
-+#define  OTGSC_STS_1ms_TIMER          (1 << 13)
-+#define  OTGSC_STS_DATA_PULSE         (1 << 14)
-+/* interrupt status: (write to clear) */
-+#define  OTGSC_INTSTS_MASK            (0x7f << 16)
-+#define  OTGSC_INTSTS_USB_ID          (1 << 16)
-+#define  OTGSC_INTSTS_A_VBUS_VALID    (1 << 17)
-+#define  OTGSC_INTSTS_A_SESSION_VALID (1 << 18)
-+#define  OTGSC_INTSTS_B_SESSION_VALID (1 << 19)
-+#define  OTGSC_INTSTS_B_SESSION_END   (1 << 20)
-+#define  OTGSC_INTSTS_1MS_TIMER               (1 << 21)
-+#define  OTGSC_INTSTS_DATA_PULSE      (1 << 22)
-+/* interrupt enables: */
-+#define  OTGSC_IE_MASK                        (0x7f << 24)
-+#define  OTGSC_IE_USB_ID              (1 << 24)
-+#define  OTGSC_IE_A_VBUS_VALID                (1 << 25)
-+#define  OTGSC_IE_A_SESSION_VALID     (1 << 26)
-+#define  OTGSC_IE_B_SESSION_VALID     (1 << 27)
-+#define  OTGSC_IE_B_SESSION_END               (1 << 28)
-+#define  OTGSC_IE_1ms_TIMER           (1 << 29)
-+#define  OTGSC_IE_DATA_PULSE          (1 << 30)
-+
-+#if 1 /* DDD FIXME these here for compatibility between my names and Leo's */
-+/* OTG interrupt enable bit masks */
-+#define  OTGSC_INTERRUPT_ENABLE_BITS_MASK     OTGSC_IE_MASK
-+
-+/* OTG interrupt status bit masks */
-+#define  OTGSC_INTERRUPT_STATUS_BITS_MASK     OTGSC_INTSTS_MASK
-+#endif // 1
-+
-+
-+
-+/* x_USBMODE */
-+#undef USBMODE_SDIS   /* defined as bit 3 in drivers/usb/host/ehci.h */
-+#define USBMODE_SDIS          (1 << 4)        /* stream disable mode */
-+#define USBMODE_SLOM          (1 << 3)        /* setup lockout mode */
-+#define USBMODE_ES            (1 << 2)        /* (big) endian select */
-+#define USBMODE_CM_MASK               (3 << 0)        /* controller mode mask */
-+#define USBMODE_CM_HOST               (3 << 0)        /* host */
-+#define USBMODE_CM_DEVICE     (2 << 0)        /* device */
-+// DDD #define USBMODE_CM_IDLE                (0 << 0)        /* idle */
-+
-+/* DDD for compatibility for now */
-+#define USB_MODE_CTRL_MODE_IDLE               USBMODE_CM_IDLE
-+#define USB_MODE_CTRL_MODE_DEVICE     USBMODE_CM_DEVICE
-+#define USB_MODE_CTRL_MODE_HOST               USBMODE_CM_HOST
-+#define USB_MODE_SETUP_LOCK_OFF               USBMODE_SLOM
-+#define USB_MODE_STREAM_DISABLE               USBMODE_SDIS
-+
-+
-+/* ULPIVIEW register bits */
-+#define ULPIVW_WU             (1 << 31)       /* Wakeup */
-+#define ULPIVW_RUN            (1 << 30)       /* read/write run */
-+#define ULPIVW_WRITE          (1 << 29)       /* 0=read  1=write */
-+#define ULPIVW_SS             (1 << 27)       /* SyncState */
-+#define ULPIVW_PORT_MASK      0x07            /* Port field */
-+#define ULPIVW_PORT_SHIFT     24
-+#define ULPIVW_ADDR_MASK      0xFF            /* data address field */
-+#define ULPIVW_ADDR_SHIFT     16
-+#define ULPIVW_RDATA_MASK     0xFF            /* read data field */
-+#define ULPIVW_RDATA_SHIFT    8
-+#define ULPIVW_WDATA_MASK     0xFF            /* write data field */
-+#define ULPIVW_WDATA_SHIFT    0
-+
-+
-+/* Endpoint Flush Register */
-+#define EPFLUSH_TX_OFFSET                     0x00010000
-+#define EPFLUSH_RX_OFFSET                     0x00000000
-+
-+/* Endpoint Setup Status bit masks */
-+#define EP_SETUP_STATUS_MASK                  0x0000003F
-+#define EP_SETUP_STATUS_EP0                   0x00000001
-+
-+/* ENDPOINTCTRLx  Register Bit Masks */
-+#define EPCTRL_TX_ENABLE                      0x00800000
-+#define EPCTRL_TX_DATA_TOGGLE_RST             0x00400000      /* Not EP0 */
-+#define EPCTRL_TX_DATA_TOGGLE_INH             0x00200000      /* Not EP0 */
-+#define EPCTRL_TX_TYPE                                0x000C0000
-+#define EPCTRL_TX_DATA_SOURCE                 0x00020000      /* Not EP0 */
-+#define EPCTRL_TX_EP_STALL                    0x00010000
-+#define EPCTRL_RX_ENABLE                      0x00000080
-+#define EPCTRL_RX_DATA_TOGGLE_RST             0x00000040      /* Not EP0 */
-+#define EPCTRL_RX_DATA_TOGGLE_INH             0x00000020      /* Not EP0 */
-+#define EPCTRL_RX_TYPE                                0x0000000C
-+#define EPCTRL_RX_DATA_SINK                   0x00000002      /* Not EP0 */
-+#define EPCTRL_RX_EP_STALL                    0x00000001
-+
-+/* bit 19-18 and 3-2 are endpoint type */
-+#define EPCTRL_EP_TYPE_CONTROL                        0
-+#define EPCTRL_EP_TYPE_ISO                    1
-+#define EPCTRL_EP_TYPE_BULK                   2
-+#define EPCTRL_EP_TYPE_INTERRUPT              3
-+#define EPCTRL_TX_EP_TYPE_SHIFT                       18
-+#define EPCTRL_RX_EP_TYPE_SHIFT                       2
-+
-+/* SNOOPn Register Bit Masks */
-+#define SNOOP_ADDRESS_MASK                    0xFFFFF000
-+#define SNOOP_SIZE_ZERO                               0x00    /* snooping disable */
-+#define SNOOP_SIZE_4KB                                0x0B    /* 4KB snoop size */
-+#define SNOOP_SIZE_8KB                                0x0C
-+#define SNOOP_SIZE_16KB                               0x0D
-+#define SNOOP_SIZE_32KB                               0x0E
-+#define SNOOP_SIZE_64KB                               0x0F
-+#define SNOOP_SIZE_128KB                      0x10
-+#define SNOOP_SIZE_256KB                      0x11
-+#define SNOOP_SIZE_512KB                      0x12
-+#define SNOOP_SIZE_1MB                                0x13
-+#define SNOOP_SIZE_2MB                                0x14
-+#define SNOOP_SIZE_4MB                                0x15
-+#define SNOOP_SIZE_8MB                                0x16
-+#define SNOOP_SIZE_16MB                               0x17
-+#define SNOOP_SIZE_32MB                               0x18
-+#define SNOOP_SIZE_64MB                               0x19
-+#define SNOOP_SIZE_128MB                      0x1A
-+#define SNOOP_SIZE_256MB                      0x1B
-+#define SNOOP_SIZE_512MB                      0x1C
-+#define SNOOP_SIZE_1GB                                0x1D
-+#define SNOOP_SIZE_2GB                                0x1E    /* 2GB snoop size */
-+
-+/* pri_ctrl Register Bit Masks */
-+#define PRI_CTRL_PRI_LVL1                     0x0000000C
-+#define PRI_CTRL_PRI_LVL0                     0x00000003
-+
-+/* si_ctrl Register Bit Masks */
-+#define SI_CTRL_ERR_DISABLE                   0x00000010
-+#define SI_CTRL_IDRC_DISABLE                  0x00000008
-+#define SI_CTRL_RD_SAFE_EN                    0x00000004
-+#define SI_CTRL_RD_PREFETCH_DISABLE           0x00000002
-+#define SI_CTRL_RD_PREFEFETCH_VAL             0x00000001
-+
-+
-+/* control Register Bit Masks */
-+#define USB_CTRL_IOENB                                0x00000004
-+#define USB_CTRL_ULPI_INT0EN                  0x00000001
-+
-+
-+/* Endpoint Transfer Descriptor bit Masks */
-+#define DTD_NEXT_TERMINATE                    0x00000001
-+#define DTD_IOC                                       0x00008000
-+#define DTD_STATUS_ACTIVE                     0x00000080
-+#define DTD_STATUS_HALTED                     0x00000040
-+#define DTD_STATUS_DATA_BUFF_ERR              0x00000020
-+#define DTD_STATUS_TRANSACTION_ERR            0x00000008
-+#define DTD_RESERVED_FIELDS                   0x80007300
-+#define DTD_ADDR_MASK                         0xFFFFFFE0
-+#define DTD_PACKET_SIZE                               0x7FFF0000
-+#define DTD_LENGTH_BIT_POS                    16
-+#define DTD_ERROR_MASK (DTD_STATUS_HALTED | \
-+                      DTD_STATUS_DATA_BUFF_ERR | \
-+                      DTD_STATUS_TRANSACTION_ERR)
-+/* Alignment requirements; must be a power of two */
-+#define DTD_ALIGNMENT                         0x20
-+#define QH_ALIGNMENT                          2048
-+
-+/* Controller dma boundary */
-+#define UDC_DMA_BOUNDARY                      0x1000
-+
-+#if defined CONFIG_PPC32
-+#define fsl_readl(addr)               in_le32((addr))
-+#define fsl_writel(addr, val32)       out_le32((addr), (val32))
-+#elif defined CONFIG_COLDFIRE
-+#define fsl_readl(addr)               in_be32((__force unsigned *)(addr))
-+#define fsl_writel(val32, addr)       out_be32((__force unsigned *)(addr), (val32))
-+
-+#define fsl_readw(addr)               in_be16((__force unsigned *)(addr))
-+#define fsl_writew(val16, addr)       out_be16((__force unsigned *)(addr), (val16))
-+#else
-+#error fsl_{readl, writel} must be defined
-+#endif
-+
-+#endif        /* __FSL_USB2_H */
---- /dev/null
-+++ b/include/linux/usb/fsl_xcvr.h
-@@ -0,0 +1,42 @@
-+/*
-+ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+enum fsl_usb_ctrlr {
-+      USB_CTRLR_H1 = 0,
-+      USB_CTRLR_H2 = 1,
-+      USB_CTRLR_OTG = 2,
-+};
-+
-+
-+/**
-+ * struct fsl_xcvr_ops - USB transceiver operations
-+ *
-+ * @xcvr_type: one of PORTSCX_PTS_{UTMI,SERIAL,ULPI}
-+ * @init: transceiver- and board-specific initialization function
-+ * @uninit: transceiver- and board-specific uninitialization function
-+ * @set_host:
-+ * @set_device:
-+ *
-+ */
-+struct fsl_xcvr_ops {
-+      enum fsl_usb_ctrlr ctrlr;       /* H1, H2, OTG */
-+      u32 xcvr_type;
-+
-+      void (*init)(struct platform_device *pdev);
-+      void (*uninit)(struct platform_device *pdev);
-+      void (*set_host)(void); /* DDD combine set_host and _device ? */
-+      void (*set_device)(void);
-+      void (*set_vbus_power)(struct fsl_usb2_platform_data *pdata, int on);
-+};
-+
-+
---- /dev/null
-+++ b/net/can/dev.c
-@@ -0,0 +1,292 @@
-+/*
-+ * $Id$
-+ *
-+ * Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
-+ * Copyright (C) 2006 Andrey Volkov, Varma Electronics
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the version 2 of the GNU General Public License
-+ * as published by the Free Software Foundation
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netdevice.h>
-+#include <linux/if_arp.h>
-+#include <linux/can.h>
-+#include <linux/can/dev.h>
-+
-+MODULE_DESCRIPTION("CAN netdevice library");
-+MODULE_LICENSE("GPL v2");
-+MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>, "
-+            "Andrey Volkov <avolkov@varma-el.com>");
-+
-+/*
-+ Abstract:
-+      Baud rate calculated with next formula:
-+      baud = frq/(brp*(1 + prop_seg+ phase_seg1 + phase_seg2))
-+
-+      This calc function based on work of Florian Hartwich and Armin Bassemi
-+      "The Configuration of the CAN Bit Timing"
-+      (http://www.semiconductors.bosch.de/pdf/CiA99Paper.pdf)
-+
-+ Parameters:
-+  [in]
-+    bit_time_nsec - expected bit time in nanosecs
-+
-+  [out]
-+      bit_time        - calculated time segments, for meaning of
-+                        each field read CAN standard.
-+*/
-+
-+#define DEFAULT_MAX_BRP                       64U
-+#define DEFAULT_MAX_SJW                       4U
-+
-+/* All below values in tq units */
-+#define MAX_BIT_TIME  25U
-+#define MIN_BIT_TIME  8U
-+#define MAX_PROP_SEG  8U
-+#define MAX_PHASE_SEG1        8U
-+#define MAX_PHASE_SEG2        8U
-+
-+int can_calc_bit_time(struct can_priv *can, u32 baudrate,
-+                    struct can_bittime_std *bit_time)
-+{
-+      int best_error  = -1; /* Ariphmetic error */
-+      int df, best_df = -1; /* oscillator's tolerance range */
-+      u32 quanta;           /*in tq units*/
-+      u32 brp, phase_seg1, phase_seg2, sjw, prop_seg;
-+      u32 brp_min, brp_max, brp_expected;
-+      u64 tmp;
-+
-+      /* baudrate range [1baud,1Mbaud] */
-+      if (baudrate == 0 || baudrate > 1000000UL)
-+              return -EINVAL;
-+
-+      tmp = (u64)can->can_sys_clock*1000;
-+      do_div(tmp, baudrate);
-+      brp_expected = (u32)tmp;
-+
-+      brp_min = brp_expected / (1000 * MAX_BIT_TIME);
-+      if (brp_min == 0)
-+              brp_min = 1;
-+      if (brp_min > can->max_brp)
-+              return -ERANGE;
-+
-+      brp_max = (brp_expected + 500 * MIN_BIT_TIME) / (1000 * MIN_BIT_TIME);
-+      if (brp_max == 0)
-+              brp_max = 1;
-+      if (brp_max > can->max_brp)
-+              brp_max = can->max_brp;
-+
-+      for (brp = brp_min; brp <= brp_max; brp++) {
-+              quanta = brp_expected / (brp * 1000);
-+              if (quanta < MAX_BIT_TIME && quanta * brp * 1000 !=
-+                              brp_expected)
-+                      quanta++;
-+              if (quanta < MIN_BIT_TIME || quanta > MAX_BIT_TIME)
-+                      continue;
-+
-+              phase_seg2 = min((quanta - 3) / 2, MAX_PHASE_SEG2);
-+              for (sjw = can->max_sjw; sjw > 0; sjw--) {
-+                      for (; phase_seg2 > sjw; phase_seg2--) {
-+                              u32 err1, err2;
-+                              phase_seg1 = phase_seg2 % 2 ?
-+                                      phase_seg2-1 : phase_seg2;
-+                              prop_seg = quanta-1 - phase_seg2 - phase_seg1;
-+                              /*
-+                               * FIXME: support of longer lines
-+                               * (i.e. bigger prop_seg) is more prefered
-+                               * than support of cheap oscillators
-+                               * (i.e. bigger df/phase_seg1/phase_seg2)
-+                               * */
-+
-+                              if (prop_seg < phase_seg1)
-+                                              continue;
-+                              if (prop_seg > MAX_PROP_SEG)
-+                                              goto next_brp;
-+
-+                              err1 = phase_seg1 * brp * 500 * 1000 /
-+                                      (13 * brp_expected - phase_seg2 *
-+                                       brp * 1000);
-+                              err2 = sjw * brp * 50 * 1000 / brp_expected;
-+
-+                              df = min(err1, err2);
-+                              if (df >= best_df) {
-+                                      unsigned error = abs(brp_expected * 10 /
-+                                                      (brp * (1 + prop_seg +
-+                                                              phase_seg1 +
-+                                                              phase_seg2)) - 10000);
-+
-+                                      if (error > 10 || error > best_error)
-+                                              continue;
-+
-+                                      if (error == best_error && prop_seg <
-+                                                      bit_time->prop_seg)
-+                                              continue;
-+
-+                                      best_error = error;
-+                                      best_df = df;
-+                                      bit_time->brp = brp;
-+                                      bit_time->prop_seg = prop_seg;
-+                                      bit_time->phase_seg1 = phase_seg1;
-+                                      bit_time->phase_seg2 = phase_seg2;
-+                                      bit_time->sjw = sjw;
-+                                      bit_time->sam =
-+                                              (bit_time->phase_seg1 > 3);
-+                              }
-+                      }
-+              }
-+next_brp:     ;
-+      }
-+
-+      if (best_error < 0)
-+              return -EDOM;
-+      return 0;
-+}
-+EXPORT_SYMBOL(can_calc_bit_time);
-+
-+static int can_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
-+{
-+      struct can_priv *can = netdev_priv(dev);
-+      struct can_bittime *bt = (struct can_bittime *)&ifr->ifr_ifru;
-+      ulong *baudrate = (ulong *)&ifr->ifr_ifru;
-+      int ret = -EOPNOTSUPP;
-+
-+      dev_dbg(ND2D(dev), "(%s) 0x%08x %p\n", __func__, cmd, &ifr->ifr_ifru);
-+
-+      switch (cmd) {
-+      case SIOCSCANBAUDRATE:
-+              if (can->do_set_bit_time) {
-+                      struct can_bittime bit_time;
-+                      ret = can_calc_bit_time(can, *baudrate, &bit_time.std);
-+                      if (ret != 0)
-+                              break;
-+                      bit_time.type = CAN_BITTIME_STD;
-+                      ret = can->do_set_bit_time(dev, &bit_time);
-+                      if (!ret) {
-+                              can->baudrate = *baudrate;
-+                              can->bit_time = bit_time;
-+                      }
-+              }
-+              break;
-+      case SIOCGCANBAUDRATE:
-+              *baudrate = can->baudrate;
-+              ret = 0;
-+              break;
-+      case SIOCSCANCUSTOMBITTIME:
-+              if (can->do_set_bit_time) {
-+                      ret = can->do_set_bit_time(dev, bt);
-+                      if (!ret) {
-+                              can->bit_time = *bt;
-+                              if (bt->type == CAN_BITTIME_STD && bt->std.brp) {
-+                                      can->baudrate = can->can_sys_clock /
-+                                              (bt->std.brp * (1 + bt->std.prop_seg +
-+                                                              bt->std.phase_seg1 +
-+                                                              bt->std.phase_seg2));
-+                              } else
-+                                      can->baudrate = CAN_BAUDRATE_UNKNOWN;
-+                      }
-+              }
-+              break;
-+      case SIOCGCANCUSTOMBITTIME:
-+              *bt = can->bit_time;
-+              ret = 0;
-+              break;
-+      case SIOCSCANMODE:
-+              if (can->do_set_mode) {
-+                      can_mode_t mode =
-+                              *((can_mode_t *)(&ifr->ifr_ifru));
-+                      if (mode == CAN_MODE_START &&
-+                          can->baudrate == CAN_BAUDRATE_UNCONFIGURED) {
-+                              dev_info(ND2D(dev), "Impossible to start \
-+                                              on UNKNOWN speed\n");
-+                              ret = EINVAL;
-+                      } else
-+                              return can->do_set_mode(dev, mode);
-+              }
-+              break;
-+      case SIOCGCANMODE:
-+              *((can_mode_t *)(&ifr->ifr_ifru)) = can->mode;
-+              ret = 0;
-+              break;
-+      case SIOCSCANCTRLMODE:
-+              if (can->do_set_ctrlmode) {
-+                      can_ctrlmode_t ctrlmode =
-+                              *((can_ctrlmode_t *)(&ifr->ifr_ifru));
-+                      return can->do_set_ctrlmode(dev, ctrlmode);
-+              }
-+              break;
-+      case SIOCGCANCTRLMODE:
-+              *((can_ctrlmode_t *)(&ifr->ifr_ifru)) = can->ctrlmode;
-+              ret = 0;
-+              break;
-+      case SIOCSCANFILTER:
-+              break;
-+      case SIOCGCANFILTER:
-+              break;
-+      case SIOCGCANSTATE:
-+              if (can->do_get_state)
-+                      return can->do_get_state(dev,
-+                                      (can_state_t *)(&ifr->ifr_ifru));
-+              break;
-+      case SIOCGCANSTATS:
-+              *((struct can_device_stats *)(&ifr->ifr_ifru)) = can->can_stats;
-+              ret = 0;
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+static void can_setup(struct net_device *dev)
-+{
-+      dev->type            = ARPHRD_CAN;
-+      dev->mtu             = sizeof(struct can_frame);
-+      dev->do_ioctl        = can_ioctl;
-+      dev->hard_header_len = 0;
-+      dev->addr_len        = 0;
-+      dev->tx_queue_len    = 10;
-+
-+      /* New-style flags. */
-+      dev->flags           = IFF_NOARP;
-+      dev->features        = NETIF_F_NO_CSUM;
-+}
-+
-+/*
-+ * Function  alloc_candev
-+ *    Allocates and sets up an CAN device
-+ */
-+struct net_device *alloc_candev(int sizeof_priv)
-+{
-+      struct net_device *dev;
-+      struct can_priv *priv;
-+
-+      dev = alloc_netdev(sizeof_priv, "can%d", can_setup);
-+      if (!dev)
-+              return NULL;
-+
-+      priv = netdev_priv(dev);
-+
-+      priv->baudrate = CAN_BAUDRATE_UNCONFIGURED;
-+      priv->max_brp  = DEFAULT_MAX_BRP;
-+      priv->max_sjw  = DEFAULT_MAX_SJW;
-+      spin_lock_init(&priv->irq_lock);
-+
-+      return dev;
-+}
-+EXPORT_SYMBOL(alloc_candev);
-+
-+void free_candev(struct net_device *dev)
-+{
-+      free_netdev(dev);
-+}
-+EXPORT_SYMBOL(free_candev);
---- a/net/can/Makefile
-+++ b/net/can/Makefile
-@@ -10,3 +10,6 @@ can-raw-objs         := raw.o
- obj-$(CONFIG_CAN_BCM) += can-bcm.o
- can-bcm-objs          := bcm.o
-+
-+obj-$(CONFIG_CAN)       += candev.o
-+candev-objs             := dev.o
---- a/net/irda/irlap.c
-+++ b/net/irda/irlap.c
-@@ -627,7 +627,7 @@ void irlap_status_indication(struct irla
- {
-       switch (quality_of_link) {
-       case STATUS_NO_ACTIVITY:
--              IRDA_MESSAGE("IrLAP, no activity on link!\n");
-+              /* IRDA_MESSAGE("IrLAP, no activity on link!\n"); */
-               break;
-       case STATUS_NOISY:
-               IRDA_MESSAGE("IrLAP, noisy link!\n");
---- /dev/null
-+++ b/scripts/checkfiles
-@@ -0,0 +1,35 @@
-+#!/bin/sh
-+# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version)
-+# Licensed under the terms of the GNU GPL License version 2
-+#
-+# Check source files for compliance with coding standards, using terse
-+# output in the style that g/cc produces.  This output can be easily parsed
-+# within text editors (e.g., emacs/vim) which can produce a split text
-+# screen showing in one screen the error message, and in another screen the
-+# corresponding source file, with the cursor placed on the offending line.
-+# See for example the documentation for Emacs's "next-error" command, often
-+# bound to M-x ` (ESC x back-tick).
-+
-+# Usage: checkfiles file [files...]
-+#        if "file" is a directory, will check all *.[hc] files recursively
-+
-+# check usage
-+usage() {
-+      echo "Usage: checkfiles file [files...]"
-+      echo "(if \"file\" is a directory, check recursively for all C sources/headers)"
-+      exit 1
-+}
-+
-+# if test -z "$@" ; then
-+#     usage
-+# fi
-+if ! test -f scripts/checkpatch.pl ; then
-+      echo "checkfiles: must run from top level source tree"
-+      exit 1
-+fi
-+
-+# check coding-style compliance of each source file found
-+find "$@" -type f -name '*.[hc]' | \
-+while read f ; do
-+      diff -u /dev/null $f | perl scripts/checkpatch.pl -
-+done
---- /dev/null
-+++ b/scripts/checkfilesterse
-@@ -0,0 +1,34 @@
-+#!/bin/sh
-+# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version)
-+# Licensed under the terms of the GNU GPL License version 2
-+#
-+# Check source files for compliance with coding standards, using terse
-+# output in the style that g/cc produces.  This output can be easily parsed
-+# within text editors (e.g., emacs/vim) which can produce a split text
-+# screen showing in one screen the error message, and in another screen the
-+# corresponding source file, with the cursor placed on the offending line.
-+# See for example the documentation for Emacs's "next-error" command, often
-+# bound to M-x ` (ESC x back-tick).
-+
-+# Usage: checkfiles file [files...]
-+#        if "file" is a directory, will check all *.[hc] files recursively
-+
-+# check usage
-+usage() {
-+      echo "Usage: checkfiles file [files...]"
-+      echo "(if \"file\" is a directory, check recursively for all C sources/headers)"
-+      exit 1
-+}
-+if test -z "" ; then
-+      usage
-+fi
-+if ! test -f scripts/checkpatch.pl ; then
-+      echo "checkfiles: must run from top level source tree"
-+      exit 1
-+fi
-+
-+# check coding-style compliance of each source file found, using terse output
-+find "$@" -type f -name '*.[hc]' | \
-+while read f ; do
-+      diff -u /dev/null $f | perl scripts/checkpatch.pl -t -
-+done
diff --git a/target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch b/target/linux/coldfire/patches/001-mcfv4e_checkfiles_script.patch
new file mode 100644 (file)
index 0000000..16b8536
--- /dev/null
@@ -0,0 +1,94 @@
+From d54d785a28afb65811c5d5ad727c57233deb6f60 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:36:51 -0600
+Subject: [PATCH] Scripts to allow running files through checkpatch.pl
+
+Scripts based on scripts/checkfiles that are in various trees.
+
+These should not be sent up because there are already patches from
+the original script author.
+
+LTIBName: mcfv4e-checkfiles-script
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ scripts/checkfiles      |   35 +++++++++++++++++++++++++++++++++++
+ scripts/checkfilesterse |   34 ++++++++++++++++++++++++++++++++++
+ 2 files changed, 69 insertions(+), 0 deletions(-)
+ create mode 100755 scripts/checkfiles
+ create mode 100755 scripts/checkfilesterse
+
+--- /dev/null
++++ b/scripts/checkfiles
+@@ -0,0 +1,35 @@
++#!/bin/sh
++# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version)
++# Licensed under the terms of the GNU GPL License version 2
++#
++# Check source files for compliance with coding standards, using terse
++# output in the style that g/cc produces.  This output can be easily parsed
++# within text editors (e.g., emacs/vim) which can produce a split text
++# screen showing in one screen the error message, and in another screen the
++# corresponding source file, with the cursor placed on the offending line.
++# See for example the documentation for Emacs's "next-error" command, often
++# bound to M-x ` (ESC x back-tick).
++
++# Usage: checkfiles file [files...]
++#        if "file" is a directory, will check all *.[hc] files recursively
++
++# check usage
++usage() {
++      echo "Usage: checkfiles file [files...]"
++      echo "(if \"file\" is a directory, check recursively for all C sources/headers)"
++      exit 1
++}
++
++# if test -z "$@" ; then
++#     usage
++# fi
++if ! test -f scripts/checkpatch.pl ; then
++      echo "checkfiles: must run from top level source tree"
++      exit 1
++fi
++
++# check coding-style compliance of each source file found
++find "$@" -type f -name '*.[hc]' | \
++while read f ; do
++      diff -u /dev/null $f | perl scripts/checkpatch.pl -
++done
+--- /dev/null
++++ b/scripts/checkfilesterse
+@@ -0,0 +1,34 @@
++#!/bin/sh
++# (c) 2007, Erez Zadok <ezk@cs.sunysb.edu> (initial version)
++# Licensed under the terms of the GNU GPL License version 2
++#
++# Check source files for compliance with coding standards, using terse
++# output in the style that g/cc produces.  This output can be easily parsed
++# within text editors (e.g., emacs/vim) which can produce a split text
++# screen showing in one screen the error message, and in another screen the
++# corresponding source file, with the cursor placed on the offending line.
++# See for example the documentation for Emacs's "next-error" command, often
++# bound to M-x ` (ESC x back-tick).
++
++# Usage: checkfiles file [files...]
++#        if "file" is a directory, will check all *.[hc] files recursively
++
++# check usage
++usage() {
++      echo "Usage: checkfiles file [files...]"
++      echo "(if \"file\" is a directory, check recursively for all C sources/headers)"
++      exit 1
++}
++if test -z "" ; then
++      usage
++fi
++if ! test -f scripts/checkpatch.pl ; then
++      echo "checkfiles: must run from top level source tree"
++      exit 1
++fi
++
++# check coding-style compliance of each source file found, using terse output
++find "$@" -type f -name '*.[hc]' | \
++while read f ; do
++      diff -u /dev/null $f | perl scripts/checkpatch.pl -t -
++done
diff --git a/target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch b/target/linux/coldfire/patches/002-mcfv4e_coldfire_headers.patch
new file mode 100644 (file)
index 0000000..a31b288
--- /dev/null
@@ -0,0 +1,1646 @@
+From 127797e5cf8a036825007586b914b75897aba554 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:39:31 -0600
+Subject: [PATCH] Add Coldfire Support into existing headers.
+
+Modifications to the various M68k header files to add
+Coldfire processor support.
+
+LTIBName: mcfv4e-coldfire-headers
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/atomic.h      |   23 ++-
+ include/asm-m68k/bitops.h      |  426 ++++++++++++++++++++++++++++++++++++++++
+ include/asm-m68k/bootinfo.h    |   13 ++
+ include/asm-m68k/byteorder.h   |   12 +-
+ include/asm-m68k/cacheflush.h  |    4 +
+ include/asm-m68k/checksum.h    |   10 +
+ include/asm-m68k/delay.h       |   26 +++
+ include/asm-m68k/div64.h       |    4 +
+ include/asm-m68k/elf.h         |    2 +-
+ include/asm-m68k/fpu.h         |    2 +
+ include/asm-m68k/io.h          |   26 +++-
+ include/asm-m68k/irq.h         |    5 +-
+ include/asm-m68k/machdep.h     |    7 +
+ include/asm-m68k/mmu_context.h |   84 ++++++++-
+ include/asm-m68k/page.h        |   20 ++-
+ include/asm-m68k/page_offset.h |    7 +-
+ include/asm-m68k/pci.h         |   99 ++++++----
+ include/asm-m68k/pgalloc.h     |    4 +-
+ include/asm-m68k/pgtable.h     |   15 ++
+ include/asm-m68k/processor.h   |   46 ++++-
+ include/asm-m68k/ptrace.h      |   11 +
+ include/asm-m68k/raw_io.h      |   58 ++++++
+ include/asm-m68k/segment.h     |   10 +
+ include/asm-m68k/setup.h       |   27 +++
+ include/asm-m68k/signal.h      |    5 +
+ include/asm-m68k/string.h      |    2 +
+ include/asm-m68k/system.h      |   17 ++-
+ include/asm-m68k/thread_info.h |    1 +
+ include/asm-m68k/tlbflush.h    |   16 ++-
+ include/asm-m68k/uaccess.h     |    4 +
+ 30 files changed, 925 insertions(+), 61 deletions(-)
+
+--- a/include/asm-m68k/atomic.h
++++ b/include/asm-m68k/atomic.h
+@@ -2,7 +2,7 @@
+ #define __ARCH_M68K_ATOMIC__
+-#include <asm/system.h>
++#include <asm/system.h>       /* local_irq_XXX() */
+ /*
+  * Atomic operations that C can't guarantee us.  Useful for
+@@ -21,12 +21,20 @@ typedef struct { int counter; } atomic_t
+ static inline void atomic_add(int i, atomic_t *v)
+ {
++#ifndef CONFIG_COLDFIRE
+       __asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i));
++#else
++      __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
++#endif
+ }
+ static inline void atomic_sub(int i, atomic_t *v)
+ {
++#ifndef CONFIG_COLDFIRE
+       __asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i));
++#else
++      __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
++#endif
+ }
+ static inline void atomic_inc(atomic_t *v)
+@@ -46,6 +54,14 @@ static inline int atomic_dec_and_test(at
+       return c != 0;
+ }
++static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v)
++{
++      char c;
++      __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v)
++                           : "m" (*v));
++      return c != 0 ;
++}
++
+ static inline int atomic_inc_and_test(atomic_t *v)
+ {
+       char c;
+@@ -156,7 +172,12 @@ static inline int atomic_sub_and_test(in
+ static inline int atomic_add_negative(int i, atomic_t *v)
+ {
+       char c;
++#ifndef CONFIG_COLDFIRE
+       __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i));
++#else
++       __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v)
++                            : "d" (i) , "m" (*v));
++#endif
+       return c != 0;
+ }
+--- a/include/asm-m68k/bitops.h
++++ b/include/asm-m68k/bitops.h
+@@ -19,6 +19,7 @@
+  *
+  * They use the standard big-endian m680x0 bit ordering.
+  */
++#ifndef CONFIG_COLDFIRE
+ #define test_and_set_bit(nr,vaddr) \
+   (__builtin_constant_p(nr) ? \
+@@ -457,4 +458,429 @@ static inline int ext2_find_next_bit(con
+ #endif /* __KERNEL__ */
++#else /* CONFIG_COLDFIRE */
++
++#define test_and_set_bit(nr,vaddr)                    \
++  (__builtin_constant_p(nr) ?                         \
++   __constant_coldfire_test_and_set_bit(nr, vaddr) :  \
++   __generic_coldfire_test_and_set_bit(nr, vaddr))
++
++
++static __inline__ int __constant_coldfire_test_and_set_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++
++      __asm__ __volatile__ ("bset %2,%1; sne %0"
++           : "=d" (retval), "+QUd" (*p)
++           : "di" (nr & 7));
++      return retval;
++}
++
++static __inline__ int __generic_coldfire_test_and_set_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++
++      __asm__ __volatile__ ("bset %2,%1; sne %0"
++           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "d" (nr)
++           : "memory");
++      return retval;
++}
++#define __test_and_set_bit(nr, vaddr) test_and_set_bit(nr, vaddr)
++
++#define set_bit(nr,vaddr)                     \
++  (__builtin_constant_p(nr) ?                 \
++   __constant_coldfire_set_bit(nr, vaddr) :   \
++   __generic_coldfire_set_bit(nr, vaddr))
++
++static __inline__ void __constant_coldfire_set_bit(int nr,
++      volatile void *vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bset %1,%0"
++           : "+QUd" (*p) : "di" (nr & 7));
++}
++
++static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr)
++{
++      __asm__ __volatile__ ("bset %1,%0"
++           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "d" (nr)
++           : "memory");
++}
++#define __set_bit(nr, vaddr) set_bit(nr, vaddr)
++
++#define test_and_clear_bit(nr, vaddr)                 \
++  (__builtin_constant_p(nr) ?                         \
++   __constant_coldfire_test_and_clear_bit(nr, vaddr) :        \
++   __generic_coldfire_test_and_clear_bit(nr, vaddr))
++
++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++
++      __asm__ __volatile__ ("bclr %2,%1; sne %0"
++           : "=d" (retval), "+QUd" (*p)
++           : "id" (nr & 7));
++
++      return retval;
++}
++
++static __inline__ int __generic_coldfire_test_and_clear_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++
++      __asm__ __volatile__ ("bclr %2,%1; sne %0"
++           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "d" (nr & 7)
++           : "memory");
++
++      return retval;
++}
++#define __test_and_clear_bit(nr, vaddr) test_and_clear_bit(nr, vaddr)
++
++/*
++ * clear_bit() doesn't provide any barrier for the compiler.
++ */
++#define smp_mb__before_clear_bit()    barrier()
++#define smp_mb__after_clear_bit()     barrier()
++
++#define clear_bit(nr,vaddr)                   \
++  (__builtin_constant_p(nr) ?                 \
++   __constant_coldfire_clear_bit(nr, vaddr) : \
++   __generic_coldfire_clear_bit(nr, vaddr))
++
++static __inline__ void __constant_coldfire_clear_bit(int nr,
++      volatile void *vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bclr %1,%0"
++           : "+QUd" (*p) : "id" (nr & 7));
++}
++
++static __inline__ void __generic_coldfire_clear_bit(int nr,
++      volatile void *vaddr)
++{
++      __asm__ __volatile__ ("bclr %1,%0"
++           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "d" (nr)
++           : "memory");
++}
++#define __clear_bit(nr, vaddr) clear_bit(nr, vaddr)
++
++#define test_and_change_bit(nr, vaddr)                        \
++  (__builtin_constant_p(nr) ?                         \
++   __constant_coldfire_test_and_change_bit(nr, vaddr) :       \
++   __generic_coldfire_test_and_change_bit(nr, vaddr))
++
++static __inline__ int __constant_coldfire_test_and_change_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++
++      __asm__ __volatile__ ("bchg %2,%1; sne %0"
++           : "=d" (retval), "+QUd" (*p)
++           : "id" (nr & 7));
++
++      return retval;
++}
++
++static __inline__ int __generic_coldfire_test_and_change_bit(int nr,
++      volatile void *vaddr)
++{
++      char retval;
++
++      __asm__ __volatile__ ("bchg %2,%1; sne %0"
++           : "=d" (retval), "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "id" (nr)
++           : "memory");
++
++      return retval;
++}
++#define __test_and_change_bit(nr, vaddr) test_and_change_bit(nr, vaddr)
++#define __change_bit(nr, vaddr) change_bit(nr, vaddr)
++
++#define change_bit(nr,vaddr)                  \
++  (__builtin_constant_p(nr) ?                 \
++   __constant_coldfire_change_bit(nr, vaddr) :        \
++   __generic_coldfire_change_bit(nr, vaddr))
++
++static __inline__ void __constant_coldfire_change_bit(int nr,
++      volatile void *vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bchg %1,%0"
++           : "+QUd" (*p) : "id" (nr & 7));
++}
++
++static __inline__ void __generic_coldfire_change_bit(int nr,
++      volatile void *vaddr)
++{
++      __asm__ __volatile__ ("bchg %1,%0"
++           : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
++           : "d" (nr)
++           : "memory");
++}
++
++static inline int test_bit(int nr, const unsigned long *vaddr)
++{
++      return (vaddr[nr >> 5] & (1UL << (nr & 31))) != 0;
++}
++
++static __inline__ unsigned long ffz(unsigned long word)
++{
++      unsigned long result = 0;
++
++      while (word & 1) {
++              result++;
++              word >>= 1;
++      }
++      return result;
++}
++
++/* find_next_zero_bit() finds the first zero bit in a bit string of length
++ * 'size' bits, starting the search at bit 'offset'.  This is largely based
++ * on Linus's ALPHA routines.
++ */
++static __inline__ unsigned long find_next_zero_bit(void *addr,
++      unsigned long size, unsigned long offset)
++{
++      unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
++      unsigned long result = offset & ~31UL;
++      unsigned long tmp;
++
++      if (offset >= size)
++              return size;
++      size -= result;
++      offset &= 31UL;
++      if (offset) {
++              tmp = *(p++);
++              tmp |= ~0UL >> (32-offset);
++              if (size < 32)
++                      goto found_first;
++              if (~tmp)
++                      goto found_middle;
++              size -= 32;
++              result += 32;
++      }
++      while (size & ~31UL) {
++              tmp = *(p++);
++              if (~tmp)
++                      goto found_middle;
++              result += 32;
++              size -= 32;
++      }
++      if (!size)
++              return result;
++      tmp = *p;
++
++found_first:
++      tmp |= ~0UL >> size;
++found_middle:
++      return result + ffz(tmp);
++}
++
++#define find_first_zero_bit(addr, size) find_next_zero_bit(((void *)addr), \
++              (size), 0)
++
++/* Ported from included/linux/bitops.h  */
++static __inline__ int ffs(int x)
++{
++      int r = 1;
++
++      if (!x)
++              return 0;
++      if (!(x & 0xffff)) {
++              x >>= 16;
++              r += 16;
++      }
++      if (!(x & 0xff)) {
++              x >>= 8;
++              r += 8;
++      }
++      if (!(x & 0xf)) {
++              x >>= 4;
++              r += 4;
++      }
++      if (!(x & 3)) {
++              x >>= 2;
++              r += 2;
++      }
++      if (!(x & 1)) {
++              x >>= 1;
++              r += 1;
++      }
++      return r;
++}
++#define __ffs(x) (ffs(x) - 1)
++
++/* find_next_bit - find the next set bit in a memory region
++ * (from asm-ppc/bitops.h)
++ */
++static __inline__ unsigned long find_next_bit(const unsigned long *addr,
++      unsigned long size, unsigned long offset)
++{
++      unsigned int *p = ((unsigned int *) addr) + (offset >> 5);
++      unsigned int result = offset & ~31UL;
++      unsigned int tmp;
++
++      if (offset >= size)
++              return size;
++      size -= result;
++      offset &= 31UL;
++      if (offset) {
++              tmp = *p++;
++              tmp &= ~0UL << offset;
++              if (size < 32)
++                      goto found_first;
++              if (tmp)
++                      goto found_middle;
++              size -= 32;
++              result += 32;
++      }
++      while (size >= 32) {
++              tmp = *p++;
++              if (tmp != 0)
++                      goto found_middle;
++              result += 32;
++              size -= 32;
++      }
++      if (!size)
++              return result;
++      tmp = *p;
++
++found_first:
++      tmp &= ~0UL >> (32 - size);
++      if (tmp == 0UL)        /* Are any bits set? */
++              return result + size; /* Nope. */
++found_middle:
++      return result + __ffs(tmp);
++}
++
++#define find_first_bit(addr, size) find_next_bit((addr), (size), 0)
++
++#ifdef __KERNEL__
++
++/* Ported from include/linux/bitops.h */
++static  __inline__ int fls(int x)
++{
++      int r = 32;
++
++      if (!x)
++              return 0;
++      if (!(x & 0xffff0000u)) {
++              x <<= 16;
++              r -= 16;
++      }
++      if (!(x & 0xff000000u)) {
++              x <<= 8;
++              r -= 8;
++      }
++      if (!(x & 0xf0000000u)) {
++              x <<= 4;
++              r -= 4;
++      }
++      if (!(x & 0xc0000000u)) {
++              x <<= 2;
++              r -= 2;
++      }
++      if (!(x & 0x80000000u)) {
++              x <<= 1;
++              r -= 1;
++      }
++      return r;
++}
++
++#include <asm-generic/bitops/fls64.h>
++#include <asm-generic/bitops/sched.h>
++#include <asm-generic/bitops/hweight.h>
++
++#define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \
++                                                      (size), 0)
++#define minix_test_and_set_bit(nr, addr)      test_and_set_bit((nr), \
++                                                      (unsigned long *)(addr))
++#define minix_set_bit(nr, addr)                       set_bit((nr), \
++                                                      (unsigned long *)(addr))
++#define minix_test_and_clear_bit(nr, addr)    test_and_clear_bit((nr), \
++                                                      (unsigned long *)(addr))
++
++static inline int minix_test_bit(int nr, const volatile unsigned long *vaddr)
++{
++      int     *a = (int *)vaddr;
++      int     mask;
++
++      a += nr >> 5;
++      mask = 1 << (nr & 0x1f);
++      return ((mask & *a) != 0);
++}
++
++#define ext2_set_bit(nr, addr)                        test_and_set_bit((nr) ^ 24, \
++                                                      (unsigned long *)(addr))
++#define ext2_set_bit_atomic(lock, nr, addr)   test_and_set_bit((nr) ^ 24, \
++                                                      (unsigned long *)(addr))
++#define ext2_clear_bit(nr, addr)              test_and_clear_bit((nr) ^ 24, \
++                                                      (unsigned long *)(addr))
++#define ext2_clear_bit_atomic(lock, nr, addr) test_and_clear_bit((nr) ^ 24, \
++                                                      (unsigned long *)(addr))
++
++static inline int ext2_test_bit(int nr, const void *vaddr)
++{
++      const unsigned char *p = vaddr;
++      return (p[nr >> 3] & (1U << (nr & 7))) != 0;
++}
++
++static inline int ext2_find_first_zero_bit(const void *vaddr, unsigned size)
++{
++      const unsigned long *p = vaddr, *addr = vaddr;
++      int res;
++
++      if (!size)
++              return 0;
++
++      size = (size >> 5) + ((size & 31) > 0);
++      while (*p++ == ~0UL) {
++              if (--size == 0)
++                      return (p - addr) << 5;
++      }
++
++      --p;
++      for (res = 0; res < 32; res++)
++              if (!ext2_test_bit (res, p))
++                      break;
++      return (p - addr) * 32 + res;
++}
++
++static inline int ext2_find_next_zero_bit(const void *vaddr, unsigned size,
++                                        unsigned offset)
++{
++      const unsigned long *addr = vaddr;
++      const unsigned long *p = addr + (offset >> 5);
++      int bit = offset & 31UL, res;
++
++      if (offset >= size)
++              return size;
++
++      if (bit) {
++              /* Look for zero in first longword */
++              for (res = bit; res < 32; res++)
++                      if (!ext2_test_bit (res, p))
++                              return (p - addr) * 32 + res;
++              p++;
++      }
++      /* No zero yet, search remaining full bytes for a zero */
++      res = ext2_find_first_zero_bit(p, size - 32 * (p - addr));
++      return (p - addr) * 32 + res;
++}
++
++#endif /* KERNEL */
++
++#endif /* CONFIG_COLDFIRE */
++
+ #endif /* _M68K_BITOPS_H */
+--- a/include/asm-m68k/bootinfo.h
++++ b/include/asm-m68k/bootinfo.h
+@@ -49,6 +49,19 @@ struct bi_record {
+ #endif /* __ASSEMBLY__ */
++#ifndef __ASSEMBLY__
++
++struct uboot_record {
++    unsigned long bd_info;
++    unsigned long initrd_start;
++    unsigned long initrd_end;
++    unsigned long cmd_line_start;
++    unsigned long cmd_line_stop;
++};
++
++#endif /* __ASSEMBLY__ */
++
++
+     /*
+      *  Tag Definitions
+      *
+--- a/include/asm-m68k/byteorder.h
++++ b/include/asm-m68k/byteorder.h
+@@ -4,8 +4,15 @@
+ #include <asm/types.h>
+ #include <linux/compiler.h>
+-#ifdef __GNUC__
+-
++#if defined(__GNUC__)
++#if defined(__mcfisaaplus__) || defined(__mcfisac__)
++static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
++{
++      __asm__ ("byterev %0" : "=d" (val) : "0" (val));
++      return val;
++}
++#define __arch__swab32(x) ___arch__swab32(x)
++#elif !defined(__mcoldfire__)
+ static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 val)
+ {
+       __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
+@@ -14,6 +21,7 @@ static __inline__ __attribute_const__ __
+ #define __arch__swab32(x) ___arch__swab32(x)
+ #endif
++#endif
+ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
+ #  define __BYTEORDER_HAS_U64__
+--- a/include/asm-m68k/cacheflush.h
++++ b/include/asm-m68k/cacheflush.h
+@@ -6,6 +6,9 @@
+ /* cache code */
+ #define FLUSH_I_AND_D (0x00000808)
+ #define FLUSH_I               (0x00000008)
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_cacheflush.h>
++#else /* !CONFIG_COLDFIRE */
+ /*
+  * Cache handling functions
+@@ -153,4 +156,5 @@ static inline void copy_from_user_page(s
+       memcpy(dst, src, len);
+ }
++#endif /* !CONFIG_COLDFIRE */
+ #endif /* _M68K_CACHEFLUSH_H */
+--- a/include/asm-m68k/checksum.h
++++ b/include/asm-m68k/checksum.h
+@@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck(
+                                             void *dst, int len,
+                                             __wsum sum);
++#ifndef CONFIG_COLDFIRE  /* CF has own copy in arch/m68k/lib/checksum.c */
+ /*
+  *    This is a version of ip_compute_csum() optimized for IP headers,
+  *    which always checksum on 4 octet boundaries.
+@@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const
+                : "memory");
+       return (__force __sum16)~sum;
+ }
++#else
++extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
++#endif
+ /*
+  *    Fold a partial checksum
+@@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const
+ static inline __sum16 csum_fold(__wsum sum)
+ {
+       unsigned int tmp = (__force u32)sum;
++#ifdef CONFIG_COLDFIRE
++      tmp = (tmp & 0xffff) + (tmp >> 16);
++      tmp = (tmp & 0xffff) + (tmp >> 16);
++      return (__force __sum16) ~tmp;
++#else
+       __asm__("swap %1\n\t"
+               "addw %1, %0\n\t"
+               "clrw %1\n\t"
+@@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s
+               : "=&d" (sum), "=&d" (tmp)
+               : "0" (sum), "1" (tmp));
+       return (__force __sum16)~sum;
++#endif
+ }
+--- a/include/asm-m68k/delay.h
++++ b/include/asm-m68k/delay.h
+@@ -11,8 +11,25 @@
+ static inline void __delay(unsigned long loops)
+ {
++#if defined(CONFIG_COLDFIRE)
++      /* The coldfire runs this loop at significantly different speeds
++       * depending upon long word alignment or not.  We'll pad it to
++       * long word alignment which is the faster version.
++       * The 0x4a8e is of course a 'tstl %fp' instruction.  This is better
++       * than using a NOP (0x4e71) instruction because it executes in one
++       * cycle not three and doesn't allow for an arbitary delay waiting
++       * for bus cycles to finish.  Also fp/a6 isn't likely to cause a
++       * stall waiting for the register to become valid if such is added
++       * to the coldfire at some stage.
++       */
++      __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t"
++                            "1: subql #1, %0\n\t"
++                            "jcc 1b"
++                            : "=d" (loops) : "0" (loops));
++#else
+       __asm__ __volatile__ ("1: subql #1,%0; jcc 1b"
+               : "=d" (loops) : "0" (loops));
++#endif
+ }
+ extern void __bad_udelay(void);
+@@ -26,12 +43,17 @@ extern void __bad_udelay(void);
+  */
+ static inline void __const_udelay(unsigned long xloops)
+ {
++#if defined(CONFIG_COLDFIRE)
++
++      __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ);
++#else
+       unsigned long tmp;
+       __asm__ ("mulul %2,%0:%1"
+               : "=d" (xloops), "=d" (tmp)
+               : "d" (xloops), "1" (loops_per_jiffy));
+       __delay(xloops * HZ);
++#endif
+ }
+ static inline void __udelay(unsigned long usecs)
+@@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon
+ static inline unsigned long muldiv(unsigned long a, unsigned long b,
+                                  unsigned long c)
+ {
++#if defined(CONFIG_COLDFIRE)
++      return (long)(((unsigned long long)a * b)/c);
++#else
+       unsigned long tmp;
+       __asm__ ("mulul %2,%0:%1; divul %3,%0:%1"
+               : "=d" (tmp), "=d" (a)
+               : "d" (b), "d" (c), "1" (a));
+       return a;
++#endif
+ }
+ #endif /* defined(_M68K_DELAY_H) */
+--- a/include/asm-m68k/div64.h
++++ b/include/asm-m68k/div64.h
+@@ -5,6 +5,7 @@
+ /* n = n / base; return rem; */
++#ifndef CONFIG_COLDFIRE
+ #define do_div(n, base) ({                                    \
+       union {                                                 \
+               unsigned long n32[2];                           \
+@@ -24,6 +25,9 @@
+       (n) = __n.n64;                                          \
+       __rem;                                                  \
+ })
++#else
++#  include <asm-generic/div64.h>
++#endif
+ extern uint64_t div64_64(uint64_t dividend, uint64_t divisor);
+ #endif /* _M68K_DIV64_H */
+--- a/include/asm-m68k/elf.h
++++ b/include/asm-m68k/elf.h
+@@ -60,7 +60,7 @@ typedef struct user_m68kfp_struct elf_fp
+ #define ELF_PLAT_INIT(_r, load_addr)  _r->a1 = 0
+ #define USE_ELF_CORE_DUMP
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #define ELF_EXEC_PAGESIZE     4096
+ #else
+ #define ELF_EXEC_PAGESIZE     8192
+--- a/include/asm-m68k/fpu.h
++++ b/include/asm-m68k/fpu.h
+@@ -12,6 +12,8 @@
+ #define FPSTATESIZE (96/sizeof(unsigned char))
+ #elif defined(CONFIG_M68KFPU_EMU)
+ #define FPSTATESIZE (28/sizeof(unsigned char))
++#elif defined(CONFIG_CFV4E)
++#define FPSTATESIZE (16/sizeof(unsigned char))
+ #elif defined(CONFIG_M68060)
+ #define FPSTATESIZE (12/sizeof(unsigned char))
+ #else
+--- a/include/asm-m68k/io.h
++++ b/include/asm-m68k/io.h
+@@ -397,10 +397,12 @@ static inline void memcpy_toio(volatile 
+       __builtin_memcpy((void __force *) dst, src, count);
+ }
+-#ifndef CONFIG_SUN3
+-#define IO_SPACE_LIMIT 0xffff
+-#else
++#if defined(CONFIG_SUN3)
+ #define IO_SPACE_LIMIT 0x0fffffff
++#elif defined(CONFIG_COLDFIRE)
++#define IO_SPACE_LIMIT 0xffffffff
++#else
++#define IO_SPACE_LIMIT 0xffff
+ #endif
+ #endif /* __KERNEL__ */
+@@ -418,4 +420,22 @@ static inline void memcpy_toio(volatile 
+  */
+ #define xlate_dev_kmem_ptr(p) p
++#ifdef CONFIG_COLDFIRE
++
++#define memset_io(a, b, c) memset((void *)(a), (b), (c))
++#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
++#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
++#if !defined(readb)
++#define readb(addr) \
++    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
++#define readw(addr) \
++    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
++#define readl(addr) \
++    ({ unsigned int __v = (*(volatile unsigned int *) (addr)); __v; })
++#define writeb(b, addr) (void)((*(volatile unsigned char *) (addr)) = (b))
++#define writew(b, addr) (void)((*(volatile unsigned short *) (addr)) = (b))
++#define writel(b, addr) (void)((*(volatile unsigned int *) (addr)) = (b))
++#endif /* readb */
++#endif /* CONFIG_COLDFIRE */
++
+ #endif /* _IO_H */
+--- a/include/asm-m68k/irq.h
++++ b/include/asm-m68k/irq.h
+@@ -11,7 +11,10 @@
+  * Currently the Atari has 72 and the Amiga 24, but if both are
+  * supported in the kernel it is better to make room for 72.
+  */
+-#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
++#if defined(CONFIG_COLDFIRE)
++#define SYS_IRQS 256
++#define NR_IRQS SYS_IRQS
++#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
+ #define NR_IRQS 200
+ #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
+ #define NR_IRQS 72
+--- a/include/asm-m68k/machdep.h
++++ b/include/asm-m68k/machdep.h
+@@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int);
+ extern void (*mach_l2_flush) (int);
+ extern void (*mach_beep) (unsigned int, unsigned int);
++#ifdef CONFIG_COLDFIRE
++extern void __init config_coldfire(void);
++extern void __init mmu_context_init(void);
++extern irq_handler_t mach_default_handler;
++extern void (*mach_tick)(void);
++#endif
++
+ #endif /* _M68K_MACHDEP_H */
+--- a/include/asm-m68k/mmu_context.h
++++ b/include/asm-m68k/mmu_context.h
+@@ -7,7 +7,7 @@ static inline void enter_lazy_tlb(struct
+ {
+ }
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #include <asm/setup.h>
+ #include <asm/page.h>
+@@ -102,7 +102,7 @@ static inline void activate_mm(struct mm
+               switch_mm_0460(next_mm);
+ }
+-#else  /* CONFIG_SUN3 */
++#elif defined(CONFIG_SUN3)
+ #include <asm/sun3mmu.h>
+ #include <linux/sched.h>
+@@ -150,5 +150,83 @@ static inline void activate_mm(struct mm
+       activate_context(next_mm);
+ }
+-#endif
++#else /* CONFIG_COLDFIRE */
++
++#include <asm/atomic.h>
++#include <asm/bitops.h>
++#include <asm/mmu.h>
++
++#define NO_CONTEXT            256
++#define LAST_CONTEXT          255
++#define FIRST_CONTEXT         1
++
++extern void set_context(mm_context_t context, pgd_t *pgd);
++extern unsigned long context_map[];
++extern mm_context_t next_mmu_context;
++
++extern atomic_t nr_free_contexts;
++extern struct mm_struct *context_mm[LAST_CONTEXT+1];
++extern void steal_context(void);
++
++static inline void get_mmu_context(struct mm_struct *mm)
++{
++      mm_context_t ctx;
++
++      if (mm->context != NO_CONTEXT)
++              return;
++      while (atomic_dec_and_test_lt(&nr_free_contexts)) {
++              atomic_inc(&nr_free_contexts);
++              steal_context();
++      }
++      ctx = next_mmu_context;
++      while (test_and_set_bit(ctx, context_map)) {
++              ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
++              if (ctx > LAST_CONTEXT)
++                      ctx = 0;
++      }
++      next_mmu_context = (ctx + 1) & LAST_CONTEXT;
++      mm->context = ctx;
++      context_mm[ctx] = mm;
++}
++
++/*
++ * Set up the context for a new address space.
++ */
++#define init_new_context(tsk, mm)     (((mm)->context = NO_CONTEXT), 0)
++
++/*
++ * We're finished using the context for an address space.
++ */
++static inline void destroy_context(struct mm_struct *mm)
++{
++      if (mm->context != NO_CONTEXT) {
++              clear_bit(mm->context, context_map);
++              mm->context = NO_CONTEXT;
++              atomic_inc(&nr_free_contexts);
++      }
++}
++
++static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
++      struct task_struct *tsk)
++{
++      get_mmu_context(tsk->mm);
++      set_context(tsk->mm->context, next->pgd);
++}
++
++/*
++ * After we have set current->mm to a new value, this activates
++ * the context for the new mm so we see the new mappings.
++ */
++static inline void activate_mm(struct mm_struct *active_mm,
++      struct mm_struct *mm)
++{
++      get_mmu_context(mm);
++      set_context(mm->context, mm->pgd);
++}
++
++#define deactivate_mm(tsk, mm) do { } while (0)
++
++extern void mmu_context_init(void);
++
++#endif /* CONFIG_COLDFIRE */
+ #endif
+--- a/include/asm-m68k/page.h
++++ b/include/asm-m68k/page.h
+@@ -4,7 +4,7 @@
+ #include <linux/const.h>
+ /* PAGE_SHIFT determines the page size */
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #define PAGE_SHIFT    (12)
+ #else
+ #define PAGE_SHIFT    (13)
+@@ -116,10 +116,23 @@ typedef struct page *pgtable_t;
+ extern unsigned long m68k_memoffset;
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3)
+ #define WANT_PAGE_VIRTUAL
++#if defined(CONFIG_COLDFIRE)
++static inline unsigned long ___pa(void *vaddr)
++{
++      return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
++}
++#define __pa(vaddr)   ___pa((void *)(vaddr))
++
++static inline void *__va(unsigned long paddr)
++{
++      return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
++}
++
++#else
+ static inline unsigned long ___pa(void *vaddr)
+ {
+       unsigned long paddr;
+@@ -141,6 +154,7 @@ static inline void *__va(unsigned long p
+               : "0" (paddr), "i" (m68k_fixup_memoffset));
+       return vaddr;
+ }
++#endif
+ #else /* !CONFIG_SUN3 */
+ /* This #define is a horrible hack to suppress lots of warnings. --m */
+@@ -172,6 +186,8 @@ static inline void *__va(unsigned long x
+  * memory node, but we have no highmem, so that works for now.
+  * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
+  * of the shifts unnecessary.
++ *
++ * PFNs are used to map physical pages.  So PFN[0] maps to the base phys addr.
+  */
+ #define virt_to_pfn(kaddr)    (__pa(kaddr) >> PAGE_SHIFT)
+ #define pfn_to_virt(pfn)      __va((pfn) << PAGE_SHIFT)
+--- a/include/asm-m68k/page_offset.h
++++ b/include/asm-m68k/page_offset.h
+@@ -1,8 +1,11 @@
+ /* This handles the memory map.. */
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #define PAGE_OFFSET_RAW               0x00000000
+-#else
++#elif defined(CONFIG_SUN3)
+ #define PAGE_OFFSET_RAW               0x0E000000
++#else /* CONFIG_COLDFIRE */
++#define PAGE_OFFSET_RAW               0xC0000000
++#define       PHYS_OFFSET             0x40000000
+ #endif
+--- a/include/asm-m68k/pci.h
++++ b/include/asm-m68k/pci.h
+@@ -1,57 +1,86 @@
+-#ifndef _ASM_M68K_PCI_H
+-#define _ASM_M68K_PCI_H
+-
+ /*
+- * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
++ * asm-m68k/pci.h - m68k specific PCI declarations.
+  *
+- * Written by Wout Klaren.
++ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
+  */
++#ifndef _ASM_M68K_PCI_H
++#define _ASM_M68K_PCI_H
+-#include <asm/scatterlist.h>
++#ifdef CONFIG_PCI
+-struct pci_ops;
++#include <asm-generic/pci-dma-compat.h>
+ /*
+- * Structure with hardware dependent information and functions of the
+- * PCI bus.
++ * The PCI address space does equal the physical memory
++ * address space.  The networking and block device layers use
++ * this boolean for bounce buffer decisions.
+  */
++#define PCI_DMA_BUS_IS_PHYS           (1)
+-struct pci_bus_info
+-{
+-      /*
+-       * Resources of the PCI bus.
+-       */
+-
+-      struct resource mem_space;
+-      struct resource io_space;
++#define PCIBIOS_MIN_IO                        0x00004000
++#define PCIBIOS_MIN_MEM                       0x02000000
+-      /*
+-       * System dependent functions.
+-       */
++#define pcibios_assign_all_busses()   0
++#define pcibios_scan_all_fns(a, b)    0
+-      struct pci_ops *m68k_pci_ops;
++static inline void
++pcibios_set_master(struct pci_dev *dev)
++{
++      /* no special bus mastering setup handling */
++}
+-      void (*fixup)(int pci_modify);
+-      void (*conf_device)(struct pci_dev *dev);
+-};
++static inline void
++pcibios_penalize_isa_irq(int irq, int active)
++{
++      /* no dynamic PCI IRQ allocation */
++}
+-#define pcibios_assign_all_busses()   0
+-#define pcibios_scan_all_fns(a, b)    0
++static inline void
++pcibios_add_platform_entries(struct pci_dev *dev)
++{
++      /* no special handling */
++}
+-static inline void pcibios_set_master(struct pci_dev *dev)
++static inline void
++pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
++                       struct resource *res)
+ {
+-      /* No special bus mastering setup handling */
++#ifdef CONFIG_M54455
++      if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
++              /* HACK!  FIX! kludge to fix bridge mapping */
++              region->start = res->start & 0x0fffffff;
++              region->end = res->end & 0x0fffffff;
++      } else {
++              region->start = res->start;
++              region->end = res->end;
++      }
++#else
++      region->start = res->start;
++      region->end = res->end;
++#endif
+ }
+-static inline void pcibios_penalize_isa_irq(int irq, int active)
++static inline void
++pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
++                      struct pci_bus_region *region)
+ {
+-      /* We don't do dynamic PCI IRQ allocation */
++      res->start = region->start;
++      res->end = region->end;
+ }
+-/* The PCI address space does equal the physical memory
+- * address space.  The networking and block device layers use
+- * this boolean for bounce buffer decisions.
+- */
+-#define PCI_DMA_BUS_IS_PHYS   (1)
++static inline struct resource *
++pcibios_select_root(struct pci_dev *pdev, struct resource *res)
++{
++      struct resource *root = NULL;
++
++      if (res->flags & IORESOURCE_IO)
++              root = &ioport_resource;
++      if (res->flags & IORESOURCE_MEM)
++              root = &iomem_resource;
++
++      return root;
++}
++#endif /* CONFIG_PCI */
+ #endif /* _ASM_M68K_PCI_H */
+--- a/include/asm-m68k/pgalloc.h
++++ b/include/asm-m68k/pgalloc.h
+@@ -8,8 +8,10 @@
+ #include <asm/virtconvert.h>
+-#ifdef CONFIG_SUN3
++#if defined(CONFIG_SUN3)
+ #include <asm/sun3_pgalloc.h>
++#elif defined(CONFIG_COLDFIRE)
++#include <asm/cf_pgalloc.h>
+ #else
+ #include <asm/motorola_pgalloc.h>
+ #endif
+--- a/include/asm-m68k/pgtable.h
++++ b/include/asm-m68k/pgtable.h
+@@ -40,6 +40,8 @@
+ /* PGDIR_SHIFT determines what a third-level page table entry can map */
+ #ifdef CONFIG_SUN3
+ #define PGDIR_SHIFT     17
++#elif defined(CONFIG_COLDFIRE)
++#define PGDIR_SHIFT   22
+ #else
+ #define PGDIR_SHIFT   25
+ #endif
+@@ -54,6 +56,10 @@
+ #define PTRS_PER_PTE   16
+ #define PTRS_PER_PMD   1
+ #define PTRS_PER_PGD   2048
++#elif defined(CONFIG_COLDFIRE)
++#define PTRS_PER_PTE    512
++#define PTRS_PER_PMD    1
++#define PTRS_PER_PGD    1024
+ #else
+ #define PTRS_PER_PTE  1024
+ #define PTRS_PER_PMD  8
+@@ -66,6 +72,9 @@
+ #ifdef CONFIG_SUN3
+ #define KMAP_START     0x0DC00000
+ #define KMAP_END       0x0E000000
++#elif defined(CONFIG_COLDFIRE)
++#define KMAP_START    0xe0000000
++#define KMAP_END      0xf0000000
+ #else
+ #define       KMAP_START      0xd0000000
+ #define       KMAP_END        0xf0000000
+@@ -130,6 +139,8 @@ static inline void update_mmu_cache(stru
+ #ifdef CONFIG_SUN3
+ #include <asm/sun3_pgtable.h>
++#elif defined(CONFIG_COLDFIRE)
++#include <asm/cf_pgtable.h>
+ #else
+ #include <asm/motorola_pgtable.h>
+ #endif
+@@ -140,6 +151,9 @@ static inline void update_mmu_cache(stru
+ /*
+  * Macro to mark a page protection value as "uncacheable".
+  */
++#ifdef CONFIG_COLDFIRE
++# define pgprot_noncached(prot)       (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE))
++#else /* CONFIG_COLDFIRE */
+ #ifdef SUN3_PAGE_NOCACHE
+ # define __SUN3_PAGE_NOCACHE  SUN3_PAGE_NOCACHE
+ #else
+@@ -154,6 +168,7 @@ static inline void update_mmu_cache(stru
+           ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S))  \
+           : (prot)))
++#endif /* CONFIG_COLDFIRE */
+ #endif /* !__ASSEMBLY__ */
+ /*
+--- a/include/asm-m68k/processor.h
++++ b/include/asm-m68k/processor.h
+@@ -22,24 +22,38 @@ static inline unsigned long rdusp(void)
+ {
+       unsigned long usp;
++#ifndef CONFIG_COLDFIRE
+       __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
++#else
++      __asm__ __volatile__("movel %/usp,%0" : "=a" (usp));
++#endif
+       return usp;
+ }
+ static inline void wrusp(unsigned long usp)
+ {
++#ifndef CONFIG_COLDFIRE
+       __asm__ __volatile__("move %0,%/usp" : : "a" (usp));
++#else
++      __asm__ __volatile__("movel %0,%/usp" : : "a" (usp));
++#endif
+ }
+ /*
+  * User space process size: 3.75GB. This is hardcoded into a few places,
+  * so don't change it unless you know what you are doing.
+  */
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #define TASK_SIZE     (0xF0000000UL)
++#elif defined(CONFIG_COLDFIRE)
++#define TASK_SIZE       (0xC0000000UL)
++#else /* CONFIG_SUN3 */
++#ifdef __ASSEMBLY__
++#define TASK_SIZE     (0x0E000000)
+ #else
+ #define TASK_SIZE     (0x0E000000UL)
+ #endif
++#endif
+ #ifdef __KERNEL__
+ #define STACK_TOP     TASK_SIZE
+@@ -49,9 +63,11 @@ static inline void wrusp(unsigned long u
+ /* This decides where the kernel will search for a free chunk of vm
+  * space during mmap's.
+  */
+-#ifndef CONFIG_SUN3
+-#define TASK_UNMAPPED_BASE    0xC0000000UL
+-#else
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
++#define TASK_UNMAPPED_BASE     0xC0000000UL
++#elif defined(CONFIG_COLDFIRE)
++#define TASK_UNMAPPED_BASE     0x80000000UL
++#else /* CONFIG_SUN3 */
+ #define TASK_UNMAPPED_BASE    0x0A000000UL
+ #endif
+ #define TASK_UNMAPPED_ALIGN(addr, off)        PAGE_ALIGN(addr)
+@@ -60,7 +76,11 @@ struct thread_struct {
+       unsigned long  ksp;             /* kernel stack pointer */
+       unsigned long  usp;             /* user stack pointer */
+       unsigned short sr;              /* saved status register */
++#ifndef CONFIG_COLDFIRE
+       unsigned short fs;              /* saved fs (sfc, dfc) */
++#else
++      mm_segment_t   fs;
++#endif
+       unsigned long  crp[2];          /* cpu root pointer */
+       unsigned long  esp0;            /* points to SR of stack frame */
+       unsigned long  faddr;           /* info about last fault */
+@@ -81,6 +101,7 @@ struct thread_struct {
+ /*
+  * Do necessary setup to start up a newly executed thread.
+  */
++#ifndef CONFIG_COLDFIRE
+ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
+                               unsigned long usp)
+ {
+@@ -91,6 +112,23 @@ static inline void start_thread(struct p
+       regs->sr &= ~0x2000;
+       wrusp(usp);
+ }
++#else
++/*
++ * Do necessary setup to start up a newly executed thread.
++ *
++ * pass the data segment into user programs if it exists,
++ * it can't hurt anything as far as I can tell
++ */
++#define start_thread(_regs, _pc, _usp)                        \
++do {                                                  \
++      set_fs(USER_DS); /* reads from user space */    \
++      (_regs)->pc = (_pc);                            \
++      if (current->mm)                                \
++              (_regs)->d5 = current->mm->start_data;  \
++      (_regs)->sr &= ~0x2000;                         \
++      wrusp(_usp);                                    \
++} while (0)
++#endif
+ /* Forward declaration, a strange C thing */
+ struct task_struct;
+--- a/include/asm-m68k/ptrace.h
++++ b/include/asm-m68k/ptrace.h
+@@ -38,10 +38,21 @@ struct pt_regs {
+   long     d0;
+   long     orig_d0;
+   long     stkadj;
++#ifndef CONFIG_COLDFIRE
+   unsigned short sr;
+   unsigned long  pc;
+   unsigned format :  4; /* frame format specifier */
+   unsigned vector : 12; /* vector offset */
++#else
++  unsigned long mmuar;
++  unsigned long mmusr;
++  unsigned format : 4;  /* frame format specifier */
++  unsigned fs2 : 2;
++  unsigned vector: 8;
++  unsigned fs1 : 2;
++  unsigned short sr;
++  unsigned long pc;
++#endif
+ };
+ /*
+--- a/include/asm-m68k/raw_io.h
++++ b/include/asm-m68k/raw_io.h
+@@ -77,6 +77,7 @@ static inline void raw_outsb(volatile u8
+               out_8(port, *buf++);
+ }
++#ifndef CONFIG_COLDFIRE
+ static inline void raw_insw(volatile u16 __iomem *port, u16 *buf, unsigned int nr)
+ {
+       unsigned int tmp;
+@@ -342,6 +343,63 @@ static inline void raw_outsw_swapw(volat
+               : "d0", "a0", "a1", "d6");
+ }
++
++#else /*CONFIG_COLDFIRE */
++
++static inline void raw_insw(volatile u16 *port, u16 *buf, unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++)
++              *buf++ = raw_inw(port);
++}
++
++static inline void raw_outsw(volatile u16 *port, const u16 *buf,
++      unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++, buf++)
++              raw_outw(*buf, port);
++}
++
++static inline void raw_insl(volatile u32 *port, u32 *buf, unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++)
++              *buf++ = raw_inl(port);
++}
++
++static inline void raw_outsl(volatile u32 *port, const u32 *buf,
++      unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++, buf++)
++              raw_outl(*buf, port);
++}
++
++static inline void raw_insw_swapw(volatile u16 *port, u16 *buf,
++                                unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++)
++              *buf++ = in_le16(port);
++
++}
++
++static inline void raw_outsw_swapw(volatile u16 __iomem *port, const u16 *buf,
++                                 unsigned int nr)
++{
++      unsigned int i;
++
++      for (i = 0; i < nr; i++, buf++)
++              out_le16(port, *buf);
++}
++#endif /*CONFIG_COLDFIRE */
++
+ #endif /* __KERNEL__ */
+ #endif /* _RAW_IO_H */
+--- a/include/asm-m68k/segment.h
++++ b/include/asm-m68k/segment.h
+@@ -29,6 +29,7 @@ typedef struct {
+  * Get/set the SFC/DFC registers for MOVES instructions
+  */
++#ifndef CONFIG_COLDFIRE
+ static inline mm_segment_t get_fs(void)
+ {
+       mm_segment_t _v;
+@@ -50,6 +51,15 @@ static inline void set_fs(mm_segment_t v
+                             : /* no outputs */ : "r" (val.seg) : "memory");
+ }
++#else /* CONFIG_COLDFIRE */
++
++#include <asm/current.h>
++#define get_fs()        (current->thread.fs)
++#define set_fs(val)     (current->thread.fs = (val))
++#define get_ds()      (KERNEL_DS)
++
++#endif /* CONFIG_COLDFIRE */
++
+ #define segment_eq(a,b)       ((a).seg == (b).seg)
+ #endif /* __ASSEMBLY__ */
+--- a/include/asm-m68k/setup.h
++++ b/include/asm-m68k/setup.h
+@@ -40,6 +40,7 @@
+ #define MACH_HP300    9
+ #define MACH_Q40     10
+ #define MACH_SUN3X   11
++#define MACH_CFMMU   12
+ #define COMMAND_LINE_SIZE 256
+@@ -189,6 +190,14 @@ extern unsigned long m68k_machtype;
+ #  define MACH_TYPE (MACH_SUN3X)
+ #endif
++#if !defined(CONFIG_COLDFIRE)
++#  define MACH_IS_COLDFIRE (0)
++#else
++#  define CONFIG_COLDFIRE_ONLY
++#  define MACH_IS_COLDFIRE (1)
++#  define MACH_TYPE (MACH_CFMMU)
++#endif
++
+ #ifndef MACH_TYPE
+ #  define MACH_TYPE (m68k_machtype)
+ #endif
+@@ -211,23 +220,31 @@ extern unsigned long m68k_machtype;
+ #define CPUB_68030     1
+ #define CPUB_68040     2
+ #define CPUB_68060     3
++#define CPUB_CFV4E     4
+ #define CPU_68020      (1<<CPUB_68020)
+ #define CPU_68030      (1<<CPUB_68030)
+ #define CPU_68040      (1<<CPUB_68040)
+ #define CPU_68060      (1<<CPUB_68060)
++#define CPU_CFV4E      (1<<CPUB_CFV4E)
+ #define FPUB_68881     0
+ #define FPUB_68882     1
+ #define FPUB_68040     2                       /* Internal FPU */
+ #define FPUB_68060     3                       /* Internal FPU */
+ #define FPUB_SUNFPA    4                       /* Sun-3 FPA */
++#define FPUB_CFV4E     5
+ #define FPU_68881      (1<<FPUB_68881)
+ #define FPU_68882      (1<<FPUB_68882)
+ #define FPU_68040      (1<<FPUB_68040)
+ #define FPU_68060      (1<<FPUB_68060)
+ #define FPU_SUNFPA     (1<<FPUB_SUNFPA)
++#ifndef CONFIG_M54455
++#define FPU_CFV4E      (1<<FPUB_CFV4E)
++#else
++#define FPU_CFV4E      0
++#endif
+ #define MMUB_68851     0
+ #define MMUB_68030     1                       /* Internal MMU */
+@@ -235,6 +252,7 @@ extern unsigned long m68k_machtype;
+ #define MMUB_68060     3                       /* Internal MMU */
+ #define MMUB_APOLLO    4                       /* Custom Apollo */
+ #define MMUB_SUN3      5                       /* Custom Sun-3 */
++#define MMUB_CFV4E     6
+ #define MMU_68851      (1<<MMUB_68851)
+ #define MMU_68030      (1<<MMUB_68030)
+@@ -242,6 +260,7 @@ extern unsigned long m68k_machtype;
+ #define MMU_68060      (1<<MMUB_68060)
+ #define MMU_SUN3       (1<<MMUB_SUN3)
+ #define MMU_APOLLO     (1<<MMUB_APOLLO)
++#define MMU_CFV4E      (1<<MMUB_CFV4E)
+ #ifdef __KERNEL__
+@@ -341,6 +360,14 @@ extern int m68k_is040or060;
+ #  endif
+ #endif
++#if !defined(CONFIG_CFV4E)
++#  define CPU_IS_COLDFIRE (0)
++#else
++#  define CPU_IS_COLDFIRE (1)
++#  define CPU_IS_CFV4E    (1)
++#  define MMU_IS_CFV4E    (1)
++#endif
++
+ #define CPU_TYPE (m68k_cputype)
+ #ifdef CONFIG_M68KFPU_EMU
+--- a/include/asm-m68k/signal.h
++++ b/include/asm-m68k/signal.h
+@@ -150,6 +150,7 @@ typedef struct sigaltstack {
+ #ifdef __KERNEL__
+ #include <asm/sigcontext.h>
++#ifndef CONFIG_COLDFIRE
+ #define __HAVE_ARCH_SIG_BITOPS
+ static inline void sigaddset(sigset_t *set, int _sig)
+@@ -200,6 +201,10 @@ static inline int sigfindinword(unsigned
+ struct pt_regs;
+ extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
++#else
++
++#define ptrace_signal_deliver(regs, cookie) do { } while (0)
++#endif /* CONFIG_COLDFIRE */
+ #endif /* __KERNEL__ */
+--- a/include/asm-m68k/string.h
++++ b/include/asm-m68k/string.h
+@@ -93,6 +93,7 @@ static inline char *strchr(const char *s
+       return (char *)s - 1;
+ }
++#ifndef CONFIG_COLDFIRE
+ #define __HAVE_ARCH_STRCMP
+ static inline int strcmp(const char *cs, const char *ct)
+ {
+@@ -110,6 +111,7 @@ static inline int strcmp(const char *cs,
+               : "+a" (cs), "+a" (ct), "=d" (res));
+       return res;
+ }
++#endif
+ #define __HAVE_ARCH_MEMSET
+ extern void *memset(void *, int, __kernel_size_t);
+--- a/include/asm-m68k/system.h
++++ b/include/asm-m68k/system.h
+@@ -63,16 +63,25 @@ asmlinkage void resume(void);
+ #define smp_read_barrier_depends()    ((void)0)
+ /* interrupt control.. */
+-#if 0
+-#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory")
+-#else
+ #include <linux/hardirq.h>
++#ifndef CONFIG_COLDFIRE
+ #define local_irq_enable() ({                                                 \
+       if (MACH_IS_Q40 || !hardirq_count())                                    \
+               asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory");    \
+ })
+-#endif
+ #define local_irq_disable() asm volatile ("oriw  #0x0700,%%sr": : : "memory")
++#else /* CONFIG_COLDFIRE */
++#define local_irq_enable()                                            \
++      asm volatile ("move.w %%sr, %%d0\n\t"                           \
++                    "andil #0xf8ff,%%d0\n\t"                          \
++                    "move.w %%d0, %%sr\n"                             \
++                    : : : "cc", "d0", "memory")
++#define local_irq_disable()                                           \
++      asm volatile ("move %/sr,%%d0\n\t"                              \
++                    "ori.l  #0x0700,%%d0\n\t"                         \
++                    "move %%d0,%/sr\n"                                \
++                    : : : "cc", "%d0", "memory")
++#endif
+ #define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory")
+ #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
+--- a/include/asm-m68k/thread_info.h
++++ b/include/asm-m68k/thread_info.h
+@@ -58,5 +58,6 @@ struct thread_info {
+ #define TIF_DELAYED_TRACE     14      /* single step a syscall */
+ #define TIF_SYSCALL_TRACE     15      /* syscall trace active */
+ #define TIF_MEMDIE            16
++#define TIF_FREEZE            17      /* freezing processes */
+ #endif        /* _ASM_M68K_THREAD_INFO_H */
+--- a/include/asm-m68k/tlbflush.h
++++ b/include/asm-m68k/tlbflush.h
+@@ -2,7 +2,7 @@
+ #define _M68K_TLBFLUSH_H
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #include <asm/current.h>
+@@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang
+       flush_tlb_all();
+ }
+-#else
++static inline void flush_tlb_pgtables(struct mm_struct *mm,
++                                    unsigned long start, unsigned long end)
++{
++}
++
++#elif defined(CONFIG_SUN3)
+ /* Reserved PMEGs. */
+@@ -214,6 +219,13 @@ static inline void flush_tlb_kernel_page
+       sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG);
+ }
++static inline void flush_tlb_pgtables(struct mm_struct *mm,
++                                    unsigned long start, unsigned long end)
++{
++}
++
++#else /* CONFIG_COLDFIRE */
++#include <asm/cf_tlbflush.h>
+ #endif
+ #endif /* _M68K_TLBFLUSH_H */
+--- a/include/asm-m68k/uaccess.h
++++ b/include/asm-m68k/uaccess.h
+@@ -1,6 +1,9 @@
+ #ifndef __M68K_UACCESS_H
+ #define __M68K_UACCESS_H
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_uaccess.h>
++#else
+ /*
+  * User space memory access functions
+  */
+@@ -367,4 +370,5 @@ unsigned long __clear_user(void __user *
+ #define strlen_user(str) strnlen_user(str, 32767)
++#endif /* CONFIG_COLDFIRE */
+ #endif /* _M68K_UACCESS_H */
diff --git a/target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch b/target/linux/coldfire/patches/003-mcfv4e_coldfire_headers2.patch
new file mode 100644 (file)
index 0000000..473cebc
--- /dev/null
@@ -0,0 +1,1865 @@
+From 3da86cd2810e9ba4e4a9e7471a92025172c1c990 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:41:41 -0600
+Subject: [PATCH] Add Coldfire specific header files.
+
+LTIBName: mcfv4e-coldfire-headers2
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/cf_cacheflush.h |  160 ++++++++++++++++
+ include/asm-m68k/cf_entry.h      |  146 +++++++++++++++
+ include/asm-m68k/cf_pgalloc.h    |   99 ++++++++++
+ include/asm-m68k/cf_pgtable.h    |  357 ++++++++++++++++++++++++++++++++++++
+ include/asm-m68k/cf_tlbflush.h   |   59 ++++++
+ include/asm-m68k/cf_uaccess.h    |  376 ++++++++++++++++++++++++++++++++++++++
+ include/asm-m68k/cfcache.h       |   86 +++++++++
+ include/asm-m68k/cfmmu.h         |  104 +++++++++++
+ include/asm-m68k/coldfire.h      |   38 ++++
+ include/asm-m68k/coldfire_edma.h |   39 ++++
+ include/asm-m68k/mcfqspi.h       |   50 +++++
+ include/asm-m68k/mcfsim.h        |   96 ++++++++++
+ include/asm-m68k/mcfuart.h       |  180 ++++++++++++++++++
+ 13 files changed, 1790 insertions(+), 0 deletions(-)
+ create mode 100644 include/asm-m68k/cf_cacheflush.h
+ create mode 100644 include/asm-m68k/cf_entry.h
+ create mode 100644 include/asm-m68k/cf_pgalloc.h
+ create mode 100644 include/asm-m68k/cf_pgtable.h
+ create mode 100644 include/asm-m68k/cf_tlbflush.h
+ create mode 100644 include/asm-m68k/cf_uaccess.h
+ create mode 100644 include/asm-m68k/cfcache.h
+ create mode 100644 include/asm-m68k/cfmmu.h
+ create mode 100644 include/asm-m68k/coldfire.h
+ create mode 100644 include/asm-m68k/coldfire_edma.h
+ create mode 100644 include/asm-m68k/mcfqspi.h
+ create mode 100644 include/asm-m68k/mcfsim.h
+ create mode 100644 include/asm-m68k/mcfuart.h
+
+--- /dev/null
++++ b/include/asm-m68k/cf_cacheflush.h
+@@ -0,0 +1,160 @@
++#ifndef M68K_CF_CACHEFLUSH_H
++#define M68K_CF_CACHEFLUSH_H
++
++#include <asm/cfcache.h>
++
++/*
++ * Cache handling functions
++ */
++
++#define flush_icache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3))    \
++    asm volatile("cpushl %%ic,(%0)\n"                         \
++               "\taddq%.l #1,%0\n"                            \
++               "\tcpushl %%ic,(%0)\n"                         \
++               "\taddq%.l #1,%0\n"                            \
++               "\tcpushl %%ic,(%0)\n"                         \
++               "\taddq%.l #1,%0\n"                            \
++               "\tcpushl %%ic,(%0)" : : "a" (set));           \
++})
++
++/*
++ * invalidate the cache for the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
++ */
++extern void cache_clear(unsigned long paddr, int len);
++/*
++ * push any dirty cache in the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
++ */
++extern void cache_push(unsigned long paddr, int len);
++
++/*
++ * push and invalidate pages in the specified user virtual
++ * memory range.
++ */
++extern void cache_push_v(unsigned long vaddr, int len);
++
++/* This is needed whenever the virtual mapping of the current
++   process changes.  */
++
++
++#define flush_cache_all()             do { } while (0)
++#define flush_cache_mm(mm)            do { } while (0)
++#define flush_cache_range(mm, a, b)   do { } while (0)
++#define flush_cache_page(vma, vmaddr, pfn)    do { } while (0)
++
++#define flush_dcache_range(paddr, len)        do { } while (0)
++
++/* Push the page at kernel virtual address and clear the icache */
++/* use cpush %bc instead of cpush %dc, cinv %ic */
++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
++extern inline void __flush_page_to_ram(void *address)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++  unsigned long addr = (unsigned long) address;
++
++  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
++
++  start_set = addr & _ICACHE_SET_MASK;
++  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3))
++      asm volatile("cpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)" : : "a" (set));
++
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3))
++    asm volatile("cpushl %%bc,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%bc,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%bc,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%bc,(%0)" : : "a" (set));
++}
++
++#define flush_dcache_page(page)                       do { } while (0)
++#define flush_icache_page(vma, pg)            do { } while (0)
++#define flush_icache_user_range(adr, len)     do { } while (0)
++/* NL */
++#define flush_icache_user_page(vma, page, addr, len)  do { } while (0)
++
++/* Push n pages at kernel virtual address and clear the icache */
++/* use cpush %bc instead of cpush %dc, cinv %ic */
++extern inline void flush_icache_range(unsigned long address,
++                                    unsigned long endaddr)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++
++  start_set = address & _ICACHE_SET_MASK;
++  end_set = endaddr & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3))
++      asm volatile("cpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)" : : "a" (set));
++
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3))
++    asm volatile("cpushl %%ic,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%ic,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%ic,(%0)\n"
++               "\taddq%.l #1,%0\n"
++               "\tcpushl %%ic,(%0)" : : "a" (set));
++}
++
++static inline void copy_to_user_page(struct vm_area_struct *vma,
++                                   struct page *page, unsigned long vaddr,
++                                   void *dst, void *src, int len)
++{
++      memcpy(dst, src, len);
++      flush_icache_user_page(vma, page, vaddr, len);
++}
++static inline void copy_from_user_page(struct vm_area_struct *vma,
++                                     struct page *page, unsigned long vaddr,
++                                     void *dst, void *src, int len)
++{
++      memcpy(dst, src, len);
++}
++
++#define flush_cache_dup_mm(mm)                        flush_cache_mm(mm)
++#define flush_cache_vmap(start, end)          flush_cache_all()
++#define flush_cache_vunmap(start, end)                flush_cache_all()
++#define flush_dcache_mmap_lock(mapping)               do { } while (0)
++#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++
++#endif /* M68K_CF_CACHEFLUSH_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_entry.h
+@@ -0,0 +1,146 @@
++#ifndef __CF_M68K_ENTRY_H
++#define __CF_M68K_ENTRY_H
++
++#include <asm/setup.h>
++#include <asm/page.h>
++#include <asm/coldfire.h>
++#include <asm/cfmmu.h>
++#include <asm/asm-offsets.h>
++
++/*
++ * Stack layout in 'ret_from_exception':
++ *
++ *    This allows access to the syscall arguments in registers d1-d5
++ *
++ *     0(sp) - d1
++ *     4(sp) - d2
++ *     8(sp) - d3
++ *     C(sp) - d4
++ *    10(sp) - d5
++ *    14(sp) - a0
++ *    18(sp) - a1
++ *    1C(sp) - a2
++ *    20(sp) - d0
++ *    24(sp) - orig_d0
++ *    28(sp) - stack adjustment
++ *    2C(sp) - sr
++ *    2E(sp) - pc
++ *    32(sp) - format & vector
++ *    36(sp) - MMUSR
++ *    3A(sp) - MMUAR
++ */
++
++/*
++ * 97/05/14 Andreas: Register %a2 is now set to the current task throughout
++ *                 the whole kernel.
++ */
++
++/* the following macro is used when enabling interrupts */
++/* portable version */
++#define ALLOWINT      (~0x700)
++#define       MAX_NOINT_IPL   0
++
++#ifdef __ASSEMBLY__
++
++#define curptr a2
++
++LFLUSH_I_AND_D = 0x00000808
++LSIGTRAP = 5
++
++/* process bits for task_struct.ptrace */
++PT_TRACESYS_OFF = 3
++PT_TRACESYS_BIT = 1
++PT_PTRACED_OFF = 3
++PT_PTRACED_BIT = 0
++PT_DTRACE_OFF = 3
++PT_DTRACE_BIT = 2
++
++#define SAVE_ALL_INT save_all_int
++#define SAVE_ALL_SYS save_all_sys
++#define RESTORE_ALL restore_all
++/*
++ * This defines the normal kernel pt-regs layout.
++ *
++ * regs a3-a6 and d6-d7 are preserved by C code
++ * the kernel doesn't mess with usp unless it needs to
++ */
++
++/*
++ * a -1 in the orig_d0 field signifies
++ * that the stack frame is NOT for syscall
++ */
++.macro        save_all_int
++      movel   MMUSR,%sp@-
++      movel   MMUAR,%sp@-
++      clrl    %sp@-           | stk_adj
++      pea     -1:w            | orig d0
++      movel   %d0,%sp@-       | d0
++      subal   #(8*4), %sp
++      moveml  %d1-%d5/%a0-%a1/%curptr,%sp@
++.endm
++
++.macro        save_all_sys
++      movel   MMUSR,%sp@-
++      movel   MMUAR,%sp@-
++      clrl    %sp@-           | stk_adj
++      movel   %d0,%sp@-       | orig d0
++      movel   %d0,%sp@-       | d0
++      subal   #(8*4), %sp
++      moveml  %d1-%d5/%a0-%a1/%curptr,%sp@
++.endm
++
++.macro        restore_all
++      moveml  %sp@,%a0-%a1/%curptr/%d1-%d5
++      addal   #(8*4), %sp
++      movel   %sp@+,%d0       | d0
++      addql   #4,%sp          | orig d0
++      addl    %sp@+,%sp       | stk_adj
++      addql   #8,%sp          | MMUAR & MMUSR
++      rte
++.endm
++
++#define SWITCH_STACK_SIZE (6*4+4)     /* includes return address */
++
++#define SAVE_SWITCH_STACK save_switch_stack
++#define RESTORE_SWITCH_STACK restore_switch_stack
++#define GET_CURRENT(tmp) get_current tmp
++
++.macro        save_switch_stack
++      subal   #(6*4), %sp
++      moveml  %a3-%a6/%d6-%d7,%sp@
++.endm
++
++.macro        restore_switch_stack
++      moveml  %sp@,%a3-%a6/%d6-%d7
++      addal   #(6*4), %sp
++.endm
++
++.macro        get_current reg=%d0
++      movel   %sp,\reg
++      andl    #-THREAD_SIZE,\reg
++      movel   \reg,%curptr
++      movel   %curptr@,%curptr
++.endm
++
++#else /* C source */
++
++#define STR(X) STR1(X)
++#define STR1(X) #X
++
++#define PT_OFF_ORIG_D0         0x24
++#define PT_OFF_FORMATVEC 0x32
++#define PT_OFF_SR      0x2C
++#define SAVE_ALL_INT                          \
++      "clrl   %%sp@-;"    /* stk_adj */       \
++      "pea    -1:w;"      /* orig d0 = -1 */  \
++      "movel  %%d0,%%sp@-;" /* d0 */          \
++      "subal  #(8*4),%sp"                     \
++      "moveml %%d1-%%d5/%%a0-%%a2,%%sp@"
++#define GET_CURRENT(tmp) \
++      "movel  %%sp,"#tmp"\n\t" \
++      "andw   #-"STR(THREAD_SIZE)","#tmp"\n\t" \
++      "movel  "#tmp",%%a2\n\t"
++
++#endif
++
++#endif /* __CF_M68K_ENTRY_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_pgalloc.h
+@@ -0,0 +1,99 @@
++#ifndef M68K_CF_PGALLOC_H
++#define M68K_CF_PGALLOC_H
++
++#include <asm/coldfire.h>
++#include <asm/page.h>
++#include <asm/cf_tlbflush.h>
++
++extern inline void pte_free_kernel(pte_t *pte)
++{
++      free_page((unsigned long) pte);
++}
++
++extern const char bad_pmd_string[];
++
++extern inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm,
++      unsigned long address)
++{
++      unsigned long page = __get_free_page(GFP_DMA|__GFP_REPEAT);
++
++      if (!page)
++              return NULL;
++
++      memset((void *)page, 0, PAGE_SIZE);
++      return (pte_t *) (page);
++}
++
++extern inline pmd_t *pmd_alloc_kernel(pgd_t *pgd, unsigned long address)
++{
++      return (pmd_t *) pgd;
++}
++
++#define pmd_alloc_one_fast(mm, address) ({ BUG(); ((pmd_t *)1); })
++#define pmd_alloc_one(mm, address)      ({ BUG(); ((pmd_t *)2); })
++
++#define pte_alloc_one_fast(mm, addr) pte_alloc_one(mm, addr)
++
++#define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
++      (unsigned long)(page_address(page)))
++#define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
++
++static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page)
++{
++      __free_page(page);
++}
++
++#define __pmd_free_tlb(tlb, pmd) do { } while (0)
++
++static inline struct page *pte_alloc_one(struct mm_struct *mm,
++      unsigned long address)
++{
++      struct page *page = alloc_pages(GFP_DMA|__GFP_REPEAT, 0);
++      pte_t *pte;
++
++      if (!page)
++              return NULL;
++
++      pte = kmap(page);
++      if (pte) {
++              clear_page(pte);
++              __flush_page_to_ram(pte);
++              flush_tlb_kernel_page(pte);
++              nocache_page(pte);
++      }
++      kunmap(pte);
++
++      return page;
++}
++
++extern inline void pte_free(struct page *page)
++{
++      __free_page(page);
++}
++
++/*
++ * In our implementation, each pgd entry contains 1 pmd that is never allocated
++ * or freed.  pgd_present is always 1, so this should never be called. -NL
++ */
++#define pmd_free(pmd) BUG()
++
++extern inline void pgd_free(pgd_t *pgd)
++{
++      free_page((unsigned long) pgd);
++}
++
++extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
++{
++     pgd_t *new_pgd;
++
++     new_pgd = (pgd_t *)__get_free_page(GFP_DMA | __GFP_NOWARN);
++     if (!new_pgd)
++           return NULL;
++     memcpy(new_pgd, swapper_pg_dir, PAGE_SIZE);
++     memset(new_pgd, 0, PAGE_OFFSET >> PGDIR_SHIFT);
++     return new_pgd;
++}
++
++#define pgd_populate(mm, pmd, pte) BUG()
++
++#endif /* M68K_CF_PGALLOC_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_pgtable.h
+@@ -0,0 +1,357 @@
++#ifndef _CF_PGTABLE_H
++#define _CF_PGTABLE_H
++
++#include <asm/cfmmu.h>
++#include <asm/page.h>
++
++#ifndef __ASSEMBLY__
++#include <asm/virtconvert.h>
++#include <linux/linkage.h>
++
++/* For virtual address to physical address conversion */
++#define VTOP(addr)    __pa(addr)
++#define PTOV(addr)    __va(addr)
++
++
++#endif        /* !__ASSEMBLY__ */
++
++/* Page protection values within PTE. */
++
++/* MMUDR bits, in proper place. */
++#define CF_PAGE_LOCKED      (0x00000002)
++#define CF_PAGE_EXEC        (0x00000004)
++#define CF_PAGE_WRITABLE    (0x00000008)
++#define CF_PAGE_READABLE    (0x00000010)
++#define CF_PAGE_SYSTEM      (0x00000020)
++#define CF_PAGE_COPYBACK    (0x00000040)
++#define CF_PAGE_NOCACHE     (0x00000080)
++
++#define CF_CACHEMASK       (~0x00000040)
++#define CF_PAGE_MMUDR_MASK  (0x000000fe)
++
++#define _PAGE_NOCACHE030  (CF_PAGE_NOCACHE)
++
++/* MMUTR bits, need shifting down.  */
++#define CF_PAGE_VALID       (0x00000400)
++#define CF_PAGE_SHARED      (0x00000800)
++
++#define CF_PAGE_MMUTR_MASK  (0x00000c00)
++#define CF_PAGE_MMUTR_SHIFT (10)
++#define CF_ASID_MMU_SHIFT   (2)
++
++/* Fake bits, not implemented in CF, will get masked out before
++   hitting hardware, and might go away altogether once this port is
++   complete.  */
++#if PAGE_SHIFT < 13
++#error COLDFIRE Error: Pages must be at least 8k in size
++#endif
++#define CF_PAGE_ACCESSED    (0x00001000)
++#define CF_PAGE_FILE        (0x00000200)
++#define CF_PAGE_DIRTY       (0x00000001)
++
++#define _PAGE_CACHE040        0x020   /* 68040 cache mode, cachable, copyback */
++#define _PAGE_NOCACHE_S 0x040   /* 68040 no-cache mode, serialized */
++#define _PAGE_NOCACHE   0x060   /* 68040 cache mode, non-serialized */
++#define _PAGE_CACHE040W 0x000   /* 68040 cache mode, cachable, write-through */
++#define _DESCTYPE_MASK  0x003
++#define _CACHEMASK040   (~0x060)
++#define _PAGE_GLOBAL040 0x400   /* 68040 global bit, used for kva descs */
++
++
++/* Externally used page protection values. */
++#define _PAGE_PRESENT (CF_PAGE_VALID)
++#define _PAGE_ACCESSED        (CF_PAGE_ACCESSED)
++#define _PAGE_DIRTY   (CF_PAGE_DIRTY)
++#define _PAGE_READWRITE (CF_PAGE_WRITABLE \
++                      | CF_PAGE_READABLE \
++                      | CF_PAGE_SYSTEM \
++                      | CF_PAGE_SHARED)
++
++/* Compound page protection values. */
++#define PAGE_NONE     __pgprot(CF_PAGE_VALID \
++                               | CF_PAGE_ACCESSED)
++
++#define PAGE_SHARED     __pgprot(CF_PAGE_VALID \
++                               | CF_PAGE_ACCESSED \
++                               | CF_PAGE_SHARED)
++
++#define PAGE_INIT     __pgprot(CF_PAGE_VALID \
++                               | CF_PAGE_WRITABLE \
++                               | CF_PAGE_READABLE \
++                               | CF_PAGE_EXEC \
++                               | CF_PAGE_SYSTEM \
++                               | CF_PAGE_SHARED)
++
++#define PAGE_KERNEL   __pgprot(CF_PAGE_VALID \
++                               | CF_PAGE_WRITABLE \
++                               | CF_PAGE_READABLE \
++                               | CF_PAGE_EXEC \
++                               | CF_PAGE_SYSTEM \
++                               | CF_PAGE_SHARED \
++                               | CF_PAGE_ACCESSED)
++
++#define PAGE_COPY     __pgprot(CF_PAGE_VALID \
++                               | CF_PAGE_ACCESSED \
++                               | CF_PAGE_READABLE \
++                               | CF_PAGE_DIRTY)
++/*
++ * Page protections for initialising protection_map.  See mm/mmap.c
++ * for use.  In general, the bit positions are xwr, and P-items are
++ * private, the S-items are shared.
++ */
++
++#define __P000        PAGE_NONE
++#define __P100        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_EXEC)
++#define __P010        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_WRITABLE \
++                       | CF_PAGE_ACCESSED)
++#define __P110        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_WRITABLE \
++                       | CF_PAGE_EXEC)
++#define __P001        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_READABLE)
++#define __P101        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_READABLE \
++                       | CF_PAGE_EXEC)
++#define __P011        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_READABLE \
++                       | CF_PAGE_WRITABLE \
++                       | CF_PAGE_ACCESSED)
++#define __P111        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_WRITABLE \
++                       | CF_PAGE_READABLE \
++                       | CF_PAGE_EXEC)
++
++#define __S000        PAGE_NONE
++#define __S100        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_EXEC)
++#define __S010        PAGE_SHARED
++#define __S110        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_EXEC)
++#define __S001        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_READABLE)
++#define __S101        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_READABLE \
++                       | CF_PAGE_EXEC)
++#define __S011        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_READABLE)
++#define __S111        __pgprot(CF_PAGE_VALID \
++                       | CF_PAGE_ACCESSED \
++                       | CF_PAGE_SHARED \
++                       | CF_PAGE_READABLE \
++                       | CF_PAGE_EXEC)
++
++#define PTE_MASK      PAGE_MASK
++#define CF_PAGE_CHG_MASK      (PTE_MASK | CF_PAGE_ACCESSED | CF_PAGE_DIRTY)
++
++#ifndef __ASSEMBLY__
++
++/*
++ * Conversion functions: convert a page and protection to a page entry,
++ * and a page entry and page directory to the page they refer to.
++ */
++#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
++
++extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
++{
++      pte_val(pte) = (pte_val(pte) & CF_PAGE_CHG_MASK) | pgprot_val(newprot);
++      return pte;
++}
++
++#define pmd_set(pmdp, ptep) do {} while (0)
++
++extern inline void pgd_set(pgd_t *pgdp, pmd_t *pmdp)
++{
++      pgd_val(*pgdp) = virt_to_phys(pmdp);
++}
++
++#define __pte_page(pte) \
++      ((unsigned long) ((pte_val(pte) & CF_PAGE_PGNUM_MASK) + PAGE_OFFSET))
++#define __pmd_page(pmd) ((unsigned long) (pmd_val(pmd)))
++
++extern inline int pte_none(pte_t pte)
++{
++      return !pte_val(pte);
++}
++extern inline int pte_present(pte_t pte)
++{
++      return pte_val(pte) & CF_PAGE_VALID;
++}
++extern inline void pte_clear(struct mm_struct *mm, unsigned long addr,
++      pte_t *ptep)
++{
++      pte_val(*ptep) = 0;
++}
++
++#define pte_pagenr(pte)               ((__pte_page(pte) - PAGE_OFFSET) >> PAGE_SHIFT)
++#define pte_page(pte)         virt_to_page(__pte_page(pte))
++
++extern inline int pmd_none2(pmd_t *pmd) { return !pmd_val(*pmd); }
++#define pmd_none(pmd) pmd_none2(&(pmd))
++extern inline int pmd_bad2(pmd_t *pmd) { return 0; }
++#define pmd_bad(pmd) pmd_bad2(&(pmd))
++#define pmd_present(pmd) (!pmd_none2(&(pmd)))
++extern inline void pmd_clear(pmd_t *pmdp) { pmd_val(*pmdp) = 0; }
++
++extern inline int pgd_none(pgd_t pgd) { return 0; }
++extern inline int pgd_bad(pgd_t pgd) { return 0; }
++extern inline int pgd_present(pgd_t pgd) { return 1; }
++extern inline void pgd_clear(pgd_t *pgdp) {}
++
++
++#define pte_ERROR(e) \
++      printk(KERN_ERR "%s:%d: bad pte %08lx.\n",      \
++      __FILE__, __LINE__, pte_val(e))
++#define pmd_ERROR(e) \
++      printk(KERN_ERR "%s:%d: bad pmd %08lx.\n",      \
++      __FILE__, __LINE__, pmd_val(e))
++#define pgd_ERROR(e) \
++      printk(KERN_ERR "%s:%d: bad pgd %08lx.\n",      \
++      __FILE__, __LINE__, pgd_val(e))
++
++
++/*
++ * The following only work if pte_present() is true.
++ * Undefined behaviour if not...
++ * [we have the full set here even if they don't change from m68k]
++ */
++extern inline int pte_read(pte_t pte) \
++      { return pte_val(pte) & CF_PAGE_READABLE; }
++extern inline int pte_write(pte_t pte)        \
++      { return pte_val(pte) & CF_PAGE_WRITABLE; }
++extern inline int pte_exec(pte_t pte) \
++      { return pte_val(pte) & CF_PAGE_EXEC; }
++extern inline int pte_dirty(pte_t pte)        \
++      { return pte_val(pte) & CF_PAGE_DIRTY; }
++extern inline int pte_young(pte_t pte)        \
++      { return pte_val(pte) & CF_PAGE_ACCESSED; }
++extern inline int pte_file(pte_t pte) \
++      { return pte_val(pte) & CF_PAGE_FILE; }
++
++extern inline pte_t pte_wrprotect(pte_t pte)  \
++      { pte_val(pte) &= ~CF_PAGE_WRITABLE; return pte; }
++extern inline pte_t pte_rdprotect(pte_t pte)  \
++      { pte_val(pte) &= ~CF_PAGE_READABLE; return pte; }
++extern inline pte_t pte_exprotect(pte_t pte)  \
++      { pte_val(pte) &= ~CF_PAGE_EXEC; return pte; }
++extern inline pte_t pte_mkclean(pte_t pte)    \
++      { pte_val(pte) &= ~CF_PAGE_DIRTY; return pte; }
++extern inline pte_t pte_mkold(pte_t pte)      \
++      { pte_val(pte) &= ~CF_PAGE_ACCESSED; return pte; }
++extern inline pte_t pte_mkwrite(pte_t pte)    \
++      { pte_val(pte) |= CF_PAGE_WRITABLE; return pte; }
++extern inline pte_t pte_mkread(pte_t pte)     \
++      { pte_val(pte) |= CF_PAGE_READABLE; return pte; }
++extern inline pte_t pte_mkexec(pte_t pte)     \
++      { pte_val(pte) |= CF_PAGE_EXEC; return pte; }
++extern inline pte_t pte_mkdirty(pte_t pte)    \
++      { pte_val(pte) |= CF_PAGE_DIRTY; return pte; }
++extern inline pte_t pte_mkyoung(pte_t pte)    \
++      { pte_val(pte) |= CF_PAGE_ACCESSED; return pte; }
++extern inline pte_t pte_mknocache(pte_t pte)  \
++      { pte_val(pte) |= 0x80 | (pte_val(pte) & ~0x40); return pte; }
++extern inline pte_t pte_mkcache(pte_t pte)    \
++      { pte_val(pte) &= ~CF_PAGE_NOCACHE; return pte; }
++
++#define swapper_pg_dir kernel_pg_dir
++extern pgd_t kernel_pg_dir[PTRS_PER_PGD];
++
++/* Find an entry in a pagetable directory. */
++#define pgd_index(address)     ((address) >> PGDIR_SHIFT)
++
++#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
++
++/* Find an entry in a kernel pagetable directory. */
++#define pgd_offset_k(address) pgd_offset(&init_mm, address)
++
++/* Find an entry in the second-level pagetable. */
++extern inline pmd_t *pmd_offset(pgd_t *pgd, unsigned long address)
++{
++      return (pmd_t *) pgd;
++}
++
++/* Find an entry in the third-level pagetable. */
++#define __pte_offset(address) ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
++#define pte_offset_kernel(dir, address) ((pte_t *) __pmd_page(*(dir)) + \
++                                        __pte_offset(address))
++
++/* Disable caching for page at given kernel virtual address. */
++static inline void nocache_page(void *vaddr)
++{
++      pgd_t *dir;
++      pmd_t *pmdp;
++      pte_t *ptep;
++      unsigned long addr = (unsigned long)vaddr;
++
++      dir = pgd_offset_k(addr);
++      pmdp = pmd_offset(dir, addr);
++      ptep = pte_offset_kernel(pmdp, addr);
++      *ptep = pte_mknocache(*ptep);
++}
++
++/* Enable caching for page at given kernel virtual address. */
++static inline void cache_page(void *vaddr)
++{
++      pgd_t *dir;
++      pmd_t *pmdp;
++      pte_t *ptep;
++      unsigned long addr = (unsigned long)vaddr;
++
++      dir = pgd_offset_k(addr);
++      pmdp = pmd_offset(dir, addr);
++      ptep = pte_offset_kernel(pmdp, addr);
++      *ptep = pte_mkcache(*ptep);
++}
++
++#define PTE_FILE_MAX_BITS     21
++#define PTE_FILE_SHIFT                11
++
++static inline unsigned long pte_to_pgoff(pte_t pte)
++{
++      return pte_val(pte) >> PTE_FILE_SHIFT;
++}
++
++static inline pte_t pgoff_to_pte(unsigned pgoff)
++{
++      pte_t pte = __pte((pgoff << PTE_FILE_SHIFT) + CF_PAGE_FILE);
++      return pte;
++}
++
++/* Encode and de-code a swap entry (must be !pte_none(e) && !pte_present(e)) */
++#define __swp_entry(type, offset) ((swp_entry_t) { (type) |   \
++                                 (offset << PTE_FILE_SHIFT) })
++#define __swp_type(x)         ((x).val & 0xFF)
++#define __swp_offset(x)               ((x).val >> PTE_FILE_SHIFT)
++#define __pte_to_swp_entry(pte)       ((swp_entry_t) { pte_val(pte) })
++#define __swp_entry_to_pte(x) (__pte((x).val))
++
++#define pmd_page(pmd)         virt_to_page(__pmd_page(pmd))
++
++#define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) +   \
++                                     __pte_offset(address))
++#define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address)
++#define pte_unmap(pte) kunmap(pte)
++#define pte_unmap_nested(pte) kunmap(pte)
++
++#define pfn_pte(pfn, prot)    __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
++#define pte_pfn(pte)          (pte_val(pte) >> PAGE_SHIFT)
++
++
++#endif        /* !__ASSEMBLY__ */
++#endif        /* !_CF_PGTABLE_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_tlbflush.h
+@@ -0,0 +1,59 @@
++#ifndef M68K_CF_TLBFLUSH_H
++#define M68K_CF_TLBFLUSH_H
++
++#include <asm/coldfire.h>
++
++/* Flush all userspace mappings.  */
++static inline void flush_tlb_all(void)
++{
++      preempt_disable();
++      *MMUOR = MMUOR_CNL;
++      preempt_enable();
++}
++
++/* Clear user TLB entries within the context named in mm */
++static inline void flush_tlb_mm(struct mm_struct *mm)
++{
++      preempt_disable();
++      *MMUOR = MMUOR_CNL;
++      preempt_enable();
++}
++
++/* Flush a single TLB page.  */
++static inline void flush_tlb_page(struct vm_area_struct *vma,
++                                 unsigned long addr)
++{
++      preempt_disable();
++      *MMUOR = MMUOR_CNL;
++      preempt_enable();
++}
++/* Flush a range of pages from TLB. */
++
++static inline void flush_tlb_range(struct mm_struct *mm,
++                    unsigned long start, unsigned long end)
++{
++      preempt_disable();
++      *MMUOR = MMUOR_CNL;
++      preempt_enable();
++}
++
++/* Flush kernel page from TLB. */
++static inline void flush_tlb_kernel_page(void *addr)
++{
++      preempt_disable();
++      *MMUOR = MMUOR_CNL;
++      preempt_enable();
++}
++
++static inline void flush_tlb_kernel_range(unsigned long start,
++      unsigned long end)
++{
++      flush_tlb_all();
++}
++
++extern inline void flush_tlb_pgtables(struct mm_struct *mm,
++                                    unsigned long start, unsigned long end)
++{
++}
++
++#endif /* M68K_CF_TLBFLUSH_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_uaccess.h
+@@ -0,0 +1,376 @@
++#ifndef __M68K_CF_UACCESS_H
++#define __M68K_CF_UACCESS_H
++
++/*
++ * User space memory access functions
++ */
++
++/* The "moves" command is not available in the CF instruction set. */
++#include <linux/compiler.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++#include <linux/sched.h>
++#include <asm/segment.h>
++
++#define VERIFY_READ   0
++#define VERIFY_WRITE  1
++
++/* We let the MMU do all checking */
++#define access_ok(type, addr, size) 1
++
++/*
++ * The exception table consists of pairs of addresses: the first is the
++ * address of an instruction that is allowed to fault, and the second is
++ * the address at which the program should continue.  No registers are
++ * modified, so it is entirely up to the continuation code to figure out
++ * what to do.
++ *
++ * All the routines below use bits of fixup code that are out of line
++ * with the main instruction path.  This means when everything is well,
++ * we don't even have to jump over them.  Further, they do not intrude
++ * on our cache or tlb entries.
++ */
++
++struct exception_table_entry
++{
++      unsigned long insn, fixup;
++};
++
++extern int __put_user_bad(void);
++extern int __get_user_bad(void);
++
++#define __put_user_asm(res, x, ptr, bwl, reg, err)    \
++asm volatile ("\n"                                    \
++      "1:     move."#bwl"     %2,%1\n"                \
++      "2:\n"                                          \
++      "       .section .fixup,\"ax\"\n"               \
++      "       .even\n"                                \
++      "10:    moveq.l %3,%0\n"                        \
++      "       jra 2b\n"                               \
++      "       .previous\n"                            \
++      "\n"                                            \
++      "       .section __ex_table,\"a\"\n"            \
++      "       .align  4\n"                            \
++      "       .long   1b,10b\n"                       \
++      "       .long   2b,10b\n"                       \
++      "       .previous"                              \
++      : "+d" (res), "=m" (*(ptr))                     \
++      : #reg (x), "i" (err))
++
++/*
++ * These are the main single-value transfer routines.  They automatically
++ * use the right size if we just have the right pointer type.
++ */
++
++#define __put_user(x, ptr)                                            \
++({                                                                    \
++      typeof(*(ptr)) __pu_val = (x);                                  \
++      int __pu_err = 0;                                               \
++      __chk_user_ptr(ptr);                                            \
++      switch (sizeof (*(ptr))) {                                      \
++      case 1:                                                         \
++              __put_user_asm(__pu_err, __pu_val, ptr, b, d, -EFAULT); \
++              break;                                                  \
++      case 2:                                                         \
++              __put_user_asm(__pu_err, __pu_val, ptr, w, d, -EFAULT); \
++              break;                                                  \
++      case 4:                                                         \
++              __put_user_asm(__pu_err, __pu_val, ptr, l, r, -EFAULT); \
++              break;                                                  \
++      case 8:                                                         \
++              {                                                       \
++              const void __user *__pu_ptr = (ptr);                    \
++              asm volatile ("\n"                                      \
++                      "1:     move.l  %2,(%1)+\n"                     \
++                      "2:     move.l  %R2,(%1)\n"                     \
++                      "3:\n"                                          \
++                      "       .section .fixup,\"ax\"\n"               \
++                      "       .even\n"                                \
++                      "10:    movel %3,%0\n"                          \
++                      "       jra 3b\n"                               \
++                      "       .previous\n"                            \
++                      "\n"                                            \
++                      "       .section __ex_table,\"a\"\n"            \
++                      "       .align 4\n"                             \
++                      "       .long 1b,10b\n"                         \
++                      "       .long 2b,10b\n"                         \
++                      "       .long 3b,10b\n"                         \
++                      "       .previous"                              \
++                      : "+d" (__pu_err), "+a" (__pu_ptr)              \
++                      : "r" (__pu_val), "i" (-EFAULT)                 \
++                      : "memory");                                    \
++              break;                                                  \
++          }                                                           \
++      default:                                                        \
++              __pu_err = __put_user_bad();                            \
++              break;                                                  \
++      }                                                               \
++      __pu_err;                                                       \
++})
++#define put_user(x, ptr)      __put_user(x, ptr)
++
++
++#define __get_user_asm(res, x, ptr, type, bwl, reg, err) ({   \
++      type __gu_val;                                          \
++      asm volatile ("\n"                                      \
++              "1:     move."#bwl"     %2,%1\n"                \
++              "2:\n"                                          \
++              "       .section .fixup,\"ax\"\n"               \
++              "       .even\n"                                \
++              "10:    move.l  %3,%0\n"                        \
++              "       subl    %1,%1\n"                        \
++              "       jra     2b\n"                           \
++              "       .previous\n"                            \
++              "\n"                                            \
++              "       .section __ex_table,\"a\"\n"            \
++              "       .align  4\n"                            \
++              "       .long   1b,10b\n"                       \
++              "       .previous"                              \
++              : "+d" (res), "=&" #reg (__gu_val)              \
++              : "m" (*(ptr)), "i" (err));                     \
++      (x) = (typeof(*(ptr)))(unsigned long)__gu_val;          \
++})
++
++#define __get_user(x, ptr)                                            \
++({                                                                    \
++      int __gu_err = 0;                                               \
++      __chk_user_ptr(ptr);                                            \
++      switch (sizeof(*(ptr))) {                                       \
++      case 1:                                                         \
++              __get_user_asm(__gu_err, x, ptr, u8, b, d, -EFAULT);    \
++              break;                                                  \
++      case 2:                                                         \
++              __get_user_asm(__gu_err, x, ptr, u16, w, d, -EFAULT);   \
++              break;                                                  \
++      case 4:                                                         \
++              __get_user_asm(__gu_err, x, ptr, u32, l, r, -EFAULT);   \
++              break;                                                  \
++/*    case 8: disabled because gcc-4.1 has a broken typeof            \
++              {                                                       \
++              const void *__gu_ptr = (ptr);                           \
++              u64 __gu_val;                                           \
++              asm volatile ("\n"                                      \
++                      "1:     move.l  (%2)+,%1\n"                     \
++                      "2:     move.l  (%2),%R1\n"                     \
++                      "3:\n"                                          \
++                      "       .section .fixup,\"ax\"\n"               \
++                      "       .even\n"                                \
++                      "10:    move.l  %3,%0\n"                        \
++                      "       subl    %1,%1\n"                        \
++                      "       subl    %R1,%R1\n"                      \
++                      "       jra     3b\n"                           \
++                      "       .previous\n"                            \
++                      "\n"                                            \
++                      "       .section __ex_table,\"a\"\n"            \
++                      "       .align  4\n"                            \
++                      "       .long   1b,10b\n"                       \
++                      "       .long   2b,10b\n"                       \
++                      "       .previous"                              \
++                      : "+d" (__gu_err), "=&r" (__gu_val),            \
++                        "+a" (__gu_ptr)                               \
++                      : "i" (-EFAULT)                                 \
++                      : "memory");                                    \
++              (x) = (typeof(*(ptr)))__gu_val;                         \
++              break;                                                  \
++          }   */                                                      \
++      default:                                                        \
++              __gu_err = __get_user_bad();                            \
++              break;                                                  \
++      }                                                               \
++      __gu_err;                                                       \
++})
++#define get_user(x, ptr) __get_user(x, ptr)
++
++unsigned long __generic_copy_from_user(void *to, const void __user *from,
++      unsigned long n);
++unsigned long __generic_copy_to_user(void __user *to, const void *from,
++      unsigned long n);
++
++#define __constant_copy_from_user_asm(res, to, from, tmp, n, s1, s2, s3)\
++      asm volatile ("\n"                                              \
++              "1:     move."#s1"      (%2)+,%3\n"                     \
++              "       move."#s1"      %3,(%1)+\n"                     \
++              "2:     move."#s2"      (%2)+,%3\n"                     \
++              "       move."#s2"      %3,(%1)+\n"                     \
++              "       .ifnc   \""#s3"\",\"\"\n"                       \
++              "3:     move."#s3"      (%2)+,%3\n"                     \
++              "       move."#s3"      %3,(%1)+\n"                     \
++              "       .endif\n"                                       \
++              "4:\n"                                                  \
++              "       .section __ex_table,\"a\"\n"                    \
++              "       .align  4\n"                                    \
++              "       .long   1b,10f\n"                               \
++              "       .long   2b,20f\n"                               \
++              "       .ifnc   \""#s3"\",\"\"\n"                       \
++              "       .long   3b,30f\n"                               \
++              "       .endif\n"                                       \
++              "       .previous\n"                                    \
++              "\n"                                                    \
++              "       .section .fixup,\"ax\"\n"                       \
++              "       .even\n"                                        \
++              "10:    clr."#s1"       (%1)+\n"                        \
++              "20:    clr."#s2"       (%1)+\n"                        \
++              "       .ifnc   \""#s3"\",\"\"\n"                       \
++              "30:    clr."#s3"       (%1)+\n"                        \
++              "       .endif\n"                                       \
++              "       moveq.l #"#n",%0\n"                             \
++              "       jra     4b\n"                                   \
++              "       .previous\n"                                    \
++              : "+d" (res), "+&a" (to), "+a" (from), "=&d" (tmp)      \
++              : : "memory")
++
++static __always_inline unsigned long
++__constant_copy_from_user(void *to, const void __user *from, unsigned long n)
++{
++      unsigned long res = 0, tmp;
++
++      switch (n) {
++      case 1:
++              __get_user_asm(res, *(u8 *)to, (u8 __user *)from, u8, b, d, 1);
++              break;
++      case 2:
++              __get_user_asm(res, *(u16 *)to, (u16 __user *)from, u16, w,
++                      d, 2);
++              break;
++      case 3:
++              __constant_copy_from_user_asm(res, to, from, tmp, 3, w, b,);
++              break;
++      case 4:
++              __get_user_asm(res, *(u32 *)to, (u32 __user *)from, u32, l,
++                      r, 4);
++              break;
++      case 5:
++              __constant_copy_from_user_asm(res, to, from, tmp, 5, l, b,);
++              break;
++      case 6:
++              __constant_copy_from_user_asm(res, to, from, tmp, 6, l, w,);
++              break;
++      case 7:
++              __constant_copy_from_user_asm(res, to, from, tmp, 7, l, w, b);
++              break;
++      case 8:
++              __constant_copy_from_user_asm(res, to, from, tmp, 8, l, l,);
++              break;
++      case 9:
++              __constant_copy_from_user_asm(res, to, from, tmp, 9, l, l, b);
++              break;
++      case 10:
++              __constant_copy_from_user_asm(res, to, from, tmp, 10, l, l, w);
++              break;
++      case 12:
++              __constant_copy_from_user_asm(res, to, from, tmp, 12, l, l, l);
++              break;
++      default:
++              /* we limit the inlined version to 3 moves */
++              return __generic_copy_from_user(to, from, n);
++      }
++
++      return res;
++}
++
++#define __constant_copy_to_user_asm(res, to, from, tmp, n, s1, s2, s3)        \
++      asm volatile ("\n"                                              \
++              "       move."#s1"      (%2)+,%3\n"                     \
++              "11:    move."#s1"      %3,(%1)+\n"                     \
++              "12:    move."#s2"      (%2)+,%3\n"                     \
++              "21:    move."#s2"      %3,(%1)+\n"                     \
++              "22:\n"                                                 \
++              "       .ifnc   \""#s3"\",\"\"\n"                       \
++              "       move."#s3"      (%2)+,%3\n"                     \
++              "31:    move."#s3"      %3,(%1)+\n"                     \
++              "32:\n"                                                 \
++              "       .endif\n"                                       \
++              "4:\n"                                                  \
++              "\n"                                                    \
++              "       .section __ex_table,\"a\"\n"                    \
++              "       .align  4\n"                                    \
++              "       .long   11b,5f\n"                               \
++              "       .long   12b,5f\n"                               \
++              "       .long   21b,5f\n"                               \
++              "       .long   22b,5f\n"                               \
++              "       .ifnc   \""#s3"\",\"\"\n"                       \
++              "       .long   31b,5f\n"                               \
++              "       .long   32b,5f\n"                               \
++              "       .endif\n"                                       \
++              "       .previous\n"                                    \
++              "\n"                                                    \
++              "       .section .fixup,\"ax\"\n"                       \
++              "       .even\n"                                        \
++              "5:     moveq.l #"#n",%0\n"                             \
++              "       jra     4b\n"                                   \
++              "       .previous\n"                                    \
++              : "+d" (res), "+a" (to), "+a" (from), "=&d" (tmp)       \
++              : : "memory")
++
++static __always_inline unsigned long
++__constant_copy_to_user(void __user *to, const void *from, unsigned long n)
++{
++      unsigned long res = 0, tmp;
++
++      switch (n) {
++      case 1:
++              __put_user_asm(res, *(u8 *)from, (u8 __user *)to, b, d, 1);
++              break;
++      case 2:
++              __put_user_asm(res, *(u16 *)from, (u16 __user *)to, w, d, 2);
++              break;
++      case 3:
++              __constant_copy_to_user_asm(res, to, from, tmp, 3, w, b,);
++              break;
++      case 4:
++              __put_user_asm(res, *(u32 *)from, (u32 __user *)to, l, r, 4);
++              break;
++      case 5:
++              __constant_copy_to_user_asm(res, to, from, tmp, 5, l, b,);
++              break;
++      case 6:
++              __constant_copy_to_user_asm(res, to, from, tmp, 6, l, w,);
++              break;
++      case 7:
++              __constant_copy_to_user_asm(res, to, from, tmp, 7, l, w, b);
++              break;
++      case 8:
++              __constant_copy_to_user_asm(res, to, from, tmp, 8, l, l,);
++              break;
++      case 9:
++              __constant_copy_to_user_asm(res, to, from, tmp, 9, l, l, b);
++              break;
++      case 10:
++              __constant_copy_to_user_asm(res, to, from, tmp, 10, l, l, w);
++              break;
++      case 12:
++              __constant_copy_to_user_asm(res, to, from, tmp, 12, l, l, l);
++              break;
++      default:
++              /* limit the inlined version to 3 moves */
++              return __generic_copy_to_user(to, from, n);
++      }
++
++      return res;
++}
++
++#define __copy_from_user(to, from, n)         \
++(__builtin_constant_p(n) ?                    \
++ __constant_copy_from_user(to, from, n) :     \
++ __generic_copy_from_user(to, from, n))
++
++#define __copy_to_user(to, from, n)           \
++(__builtin_constant_p(n) ?                    \
++ __constant_copy_to_user(to, from, n) :               \
++ __generic_copy_to_user(to, from, n))
++
++#define __copy_to_user_inatomic               __copy_to_user
++#define __copy_from_user_inatomic     __copy_from_user
++
++#define copy_from_user(to, from, n)   __copy_from_user(to, from, n)
++#define copy_to_user(to, from, n)     __copy_to_user(to, from, n)
++
++long strncpy_from_user(char *dst, const char __user *src, long count);
++long strnlen_user(const char __user *src, long n);
++unsigned long __clear_user(void __user *to, unsigned long n);
++
++#define clear_user __clear_user
++
++#define strlen_user(str) strnlen_user(str, 32767)
++
++#endif /* _M68K_CF_UACCESS_H */
+--- /dev/null
++++ b/include/asm-m68k/cfcache.h
+@@ -0,0 +1,86 @@
++/*
++ * include/asm-m68k/cfcache.h
++ */
++#ifndef CF_CFCACHE_H
++#define CF_CFCACHE_H
++
++#define CF_CACR_DEC         (0x80000000) /* Data Cache Enable                */
++#define CF_CACR_DW          (0x40000000) /* Data default Write-protect       */
++#define CF_CACR_DESB        (0x20000000) /* Data Enable Store Buffer         */
++#define CF_CACR_DDPI        (0x10000000) /* Data Disable CPUSHL Invalidate   */
++#define CF_CACR_DHLCK       (0x08000000) /* 1/2 Data Cache Lock Mode         */
++#define CF_CACR_DDCM_00     (0x00000000) /* Cacheable writethrough imprecise */
++#define CF_CACR_DDCM_01     (0x02000000) /* Cacheable copyback               */
++#define CF_CACR_DDCM_10     (0x04000000) /* Noncacheable precise             */
++#define CF_CACR_DDCM_11     (0x06000000) /* Noncacheable imprecise           */
++#define CF_CACR_DCINVA      (0x01000000) /* Data Cache Invalidate All        */
++#define CF_CACR_IVO         (0x00100000) /* Invalidate only                  */
++#define CF_CACR_BEC         (0x00080000) /* Branch Cache Enable              */
++#define CF_CACR_BCINVA      (0x00040000) /* Branch Cache Invalidate All      */
++#define CF_CACR_IEC         (0x00008000) /* Instruction Cache Enable         */
++#define CF_CACR_SPA         (0x00004000) /* Search by Physical Address       */
++#define CF_CACR_DNFB        (0x00002000) /* Default cache-inhibited fill buf */
++#define CF_CACR_IDPI        (0x00001000) /* Instr Disable CPUSHL Invalidate  */
++#define CF_CACR_IHLCK       (0x00000800) /* 1/2 Instruction Cache Lock Mode  */
++#define CF_CACR_IDCM        (0x00000400) /* Noncacheable Instr default mode  */
++#define CF_CACR_ICINVA      (0x00000100) /* Instr Cache Invalidate All       */
++#define CF_CACR_EUSP        (0x00000020) /* Switch stacks in user mode       */
++
++#define DCACHE_LINE_SIZE 0x0010     /* bytes per line        */
++#define DCACHE_WAY_SIZE  0x2000     /* words per cache block */
++#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+CF_CACR_BCINVA+CF_CACR_ICINVA)
++#ifdef CONFIG_M5445X_DISABLE_CACHE
++/* disable cache for testing rev0 silicon */
++#define CACHE_INITIAL_MODE (CF_CACR_EUSP)
++#else
++#define CACHE_INITIAL_MODE (CF_CACR_DEC+CF_CACR_BEC+CF_CACR_IEC+CF_CACR_EUSP)
++#endif
++
++#define _DCACHE_SIZE (2*16384)
++#define _ICACHE_SIZE (2*16384)
++
++#define _SET_SHIFT 4
++
++/*
++ * Masks for cache sizes.  Programming note: because the set size is a
++ * power of two, the mask is also the last address in the set.
++ * This may need to be #ifdef for other Coldfire processors.
++ */
++
++#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT)
++#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT)
++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
++
++
++#ifndef __ASSEMBLY__
++
++extern void DcacheFlushInvalidate(void);
++
++extern void DcacheDisable(void);
++extern void DcacheEnable(void);
++
++/******************************************************************************/
++/*** Unimplemented Cache functionality                                      ***/
++/******************************************************************************/
++#define preDcacheInvalidateBlockMark()
++#define postDcacheInvalidateBlockMark()
++#define DcacheZeroBlock(p, l)           fast_bzero((char *)(p), (long)(l))
++#define loadDcacheInvalidateBlock()     ASSERT(!"Not Implemented on V4e")
++#define IcacheInvalidateBlock()         ASSERT(!"Not Implemented on V4e")
++
++/******************************************************************************/
++/*** Redundant Cache functionality on ColdFire                              ***/
++/******************************************************************************/
++#define DcacheInvalidateBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l)
++#define DcacheFlushCacheBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l)
++#define DcacheFlushBlock(p, l)      DcacheFlushInvalidateCacheBlock(p, l)
++
++extern void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size);
++extern void FLASHDcacheFlushInvalidate(void);
++
++extern void cacr_set(unsigned long x);
++
++#endif /* !__ASSEMBLY__ */
++
++#endif /* CF_CACHE_H */
+--- /dev/null
++++ b/include/asm-m68k/cfmmu.h
+@@ -0,0 +1,104 @@
++/*
++ * Definitions for Coldfire V4e MMU
++ */
++#include <asm/movs.h>
++
++#ifndef __CF_MMU_H__
++#define __CF_MMU_H__
++
++
++#define MMU_BASE 0xE1000000
++
++
++#define MMUCR (MMU_BASE+0x00)
++#define MMUCR_ASMN  1
++#define MMUCR_ASM   (1<<MMUCR_ASMN)
++#define MMUCR_ENN   0
++#define MMUCR_EN    (1<<MMUCR_ENN)
++
++#define MMUOR REG16(MMU_BASE+0x04+0x02)
++#define MMUOR_AAN   16
++#define MMUOR_AA    (0xffff<<MMUOR_AAN)
++#define MMUOR_STLBN 8
++#define MMUOR_STLB  (1<<MMUOR_STLBN)
++#define MMUOR_CAN   7
++#define MMUOR_CA    (1<<MMUOR_CAN)
++#define MMUOR_CNLN  6
++#define MMUOR_CNL   (1<<MMUOR_CNLN)
++#define MMUOR_CASN  5
++#define MMUOR_CAS   (1<<MMUOR_CASN)
++#define MMUOR_ITLBN 4
++#define MMUOR_ITLB  (1<<MMUOR_ITLBN)
++#define MMUOR_ADRN  3
++#define MMUOR_ADR   (1<<MMUOR_ADRN)
++#define MMUOR_RWN   2
++#define MMUOR_RW    (1<<MMUOR_RWN)
++#define MMUOR_ACCN  1
++#define MMUOR_ACC   (1<<MMUOR_ACCN)
++#define MMUOR_UAAN  0
++#define MMUOR_UAA   (1<<MMUOR_UAAN)
++
++#define MMUSR REG32(MMU_BASE+0x08)
++#define MMUSR_SPFN  5
++#define MMUSR_SPF   (1<<MMUSR_SPFN)
++#define MMUSR_RFN   4
++#define MMUSR_RF    (1<<MMUSR_RFN)
++#define MMUSR_WFN   3
++#define MMUSR_WF    (1<<MMUSR_WFN)
++#define MMUSR_HITN  1
++#define MMUSR_HIT   (1<<MMUSR_HITN)
++
++#define MMUAR REG32(MMU_BASE+0x10)
++#define MMUAR_VPN   1
++#define MMUAR_VP    (0xfffffffe)
++#define MMUAR_SN    0
++#define MMUAR_S     (1<<MMUAR_SN)
++
++#define MMUTR REG32(MMU_BASE+0x14)
++#define MMUTR_VAN   10
++#define MMUTR_VA    (0xfffffc00)
++#define MMUTR_IDN   2
++#define MMUTR_ID    (0xff<<MMUTR_IDN)
++#define MMUTR_SGN   1
++#define MMUTR_SG    (1<<MMUTR_SGN)
++#define MMUTR_VN    0
++#define MMUTR_V     (1<<MMUTR_VN)
++
++#define MMUDR REG32(MMU_BASE+0x18)
++#define MMUDR_PAN   10
++#define MMUDR_PA    (0xfffffc00)
++#define MMUDR_SZN   8
++#define MMUDR_SZ_MASK (0x2<<MMUDR_SZN)
++#define MMUDR_SZ1M  (0<<MMUDR_SZN)
++#define MMUDR_SZ4K  (1<<MMUDR_SZN)
++#define MMUDR_SZ8K  (2<<MMUDR_SZN)
++#define MMUDR_SZ16M (3<<MMUDR_SZN)
++#define MMUDR_CMN   6
++#define MMUDR_INC   (2<<MMUDR_CMN)
++#define MMUDR_IC    (0<<MMUDR_CMN)
++#define MMUDR_DWT   (0<<MMUDR_CMN)
++#define MMUDR_DCB   (1<<MMUDR_CMN)
++#define MMUDR_DNCP  (2<<MMUDR_CMN)
++#define MMUDR_DNCIP (3<<MMUDR_CMN)
++#define MMUDR_SPN   5
++#define MMUDR_SP    (1<<MMUDR_SPN)
++#define MMUDR_RN    4
++#define MMUDR_R     (1<<MMUDR_RN)
++#define MMUDR_WN    3
++#define MMUDR_W     (1<<MMUDR_WN)
++#define MMUDR_XN    2
++#define MMUDR_X     (1<<MMUDR_XN)
++#define MMUDR_LKN   1
++#define MMUDR_LK    (1<<MMUDR_LKN)
++
++
++#ifndef __ASSEMBLY__
++#define CF_PMEGS_NUM          256
++#define CF_INVALID_CONTEXT    255
++#define CF_PAGE_PGNUM_MASK    (PAGE_MASK)
++
++extern int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb,
++                     int extension_word);
++#endif /* __ASSEMBLY__*/
++
++#endif        /* !__CF_MMU_H__ */
+--- /dev/null
++++ b/include/asm-m68k/coldfire.h
+@@ -0,0 +1,38 @@
++#ifndef _COLDFIRE_H_
++#define _COLDFIRE_H_
++
++#define MCF_MBAR      0x0
++#define MCF_RAMBAR1   0x40000000
++#define MCF_SRAM      0x80000000
++#define MCF_CLK       CONFIG_MCFCLK
++#define MCF_BUSCLK    (CONFIG_MCFCLK/2)
++
++#ifdef __ASSEMBLY__
++#define REG32
++#define REG16
++#define REG08
++#else  /* __ASSEMBLY__ */
++#define REG32(x) ((volatile unsigned long  *)(x))
++#define REG16(x) ((volatile unsigned short *)(x))
++#define REG08(x) ((volatile unsigned char  *)(x))
++
++#define MCF_REG32(x) *(volatile unsigned long  *)(MCF_MBAR+(x))
++#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x))
++#define MCF_REG08(x) *(volatile unsigned char  *)(MCF_MBAR+(x))
++
++void cacr_set(unsigned long);
++unsigned long cacr_get(void);
++
++#define coldfire_enable_irq0(irq)     MCF_INTC0_CIMR = (irq);
++
++#define coldfire_enable_irq1(irq)     MCF_INTC1_CIMR = (irq);
++
++#define coldfire_disable_irq0(irq)    MCF_INTC0_SIMR = (irq);
++
++#define coldfire_disable_irq1(irq)    MCF_INTC1_SIMR = (irq);
++
++#define getiprh()                     MCF_INTC0_IPRH
++
++#endif /* __ASSEMBLY__ */
++
++#endif  /* _COLDFIRE_H_  */
+--- /dev/null
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -0,0 +1,39 @@
++#ifndef _LINUX_COLDFIRE_DMA_H
++#define _LINUX_COLDFIRE_DMA_H
++
++#include <linux/interrupt.h>
++
++#define EDMA_DRIVER_NAME              "ColdFire-eDMA"
++#define DMA_DEV_MINOR                         1
++
++#define EDMA_INT_CHANNEL_BASE                 8
++#define EDMA_INT_CONTROLLER_BASE      64
++#define EDMA_CHANNELS                 16
++
++#define EDMA_IRQ_LEVEL                        5
++
++typedef irqreturn_t (*edma_irq_handler)(int, void *);
++typedef void (*edma_error_handler)(int, void *);
++
++void set_edma_params(int channel, u32 source, u32 dest,
++      u32 attr, u32 soff, u32 nbytes, u32 slast,
++      u32 citer, u32 biter, u32 doff, u32 dlast_sga);
++
++void start_edma_transfer(int channel, int major_int);
++
++void stop_edma_transfer(int channel);
++
++void confirm_edma_interrupt_handled(int channel);
++
++void init_edma(void);
++
++int  request_edma_channel(int channel,
++                      edma_irq_handler handler,
++                      edma_error_handler error_handler,
++                      void *dev,
++                      spinlock_t *lock,
++                      const char *device_id);
++
++int free_edma_channel(int channel, void *dev);
++
++#endif
+--- /dev/null
++++ b/include/asm-m68k/mcfqspi.h
+@@ -0,0 +1,50 @@
++/****************************************************************************/
++/*
++ *    mcfqspi.h - Master QSPI controller for the ColdFire processors
++ *
++ *    (C) Copyright 2005, Intec Automation,
++ *                        Mike Lavender (mike@steroidmicros)
++ *
++
++     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.
++
++     This program is distributed in the hope that it will be useful,
++     but WITHOUT ANY WARRANTY; without even the implied warranty of
++     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++     GNU General Public License for more details.
++
++     You should have received a copy of the GNU General Public License
++     along with this program; if not, write to the Free Software
++     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
++/* ------------------------------------------------------------------------- */
++
++#ifndef MCFQSPI_H_
++#define MCFQSPI_H_
++
++#define QSPI_CS_INIT     0x01
++#define QSPI_CS_ASSERT         0x02
++#define QSPI_CS_DROP   0x04
++
++struct coldfire_spi_master {
++      u16 bus_num;
++      u16 num_chipselect;
++      u8  irq_source;
++      u32 irq_vector;
++      u32 irq_mask;
++      u8  irq_lp;
++      u8  par_val;
++      void (*cs_control)(u8 cs, u8 command);
++};
++
++
++struct coldfire_spi_chip {
++      u8 mode;
++      u8 bits_per_word;
++      u8 del_cs_to_clk;
++      u8 del_after_trans;
++      u16 void_write_data;
++};
++#endif /*MCFQSPI_H_*/
+--- /dev/null
++++ b/include/asm-m68k/mcfsim.h
+@@ -0,0 +1,96 @@
++/*
++ *    mcfsim.h -- ColdFire System Integration Module support.
++ *
++ *    (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com)
++ *    (C) Copyright 2000, Lineo Inc. (www.lineo.com)
++ */
++
++#ifndef       mcfsim_h
++#define       mcfsim_h
++
++#if defined(CONFIG_COLDFIRE)
++#include <asm/coldfire.h>
++#endif
++
++#if defined(CONFIG_M54455)
++#include <asm/mcf5445x_intc.h>
++#include <asm/mcf5445x_gpio.h>
++#include <asm/mcf5445x_i2c.h>
++#include <asm/mcf5445x_ccm.h>
++#include <asm/mcf5445x_pci.h>
++#include <asm/mcf5445x_pciarb.h>
++#include <asm/mcf5445x_eport.h>
++#endif
++
++/*
++ *    Define the base address of the SIM within the MBAR address space.
++ */
++#define       MCFSIM_BASE             0x0             /* Base address of SIM */
++
++/*
++ *    Bit definitions for the ICR family of registers.
++ */
++#define       MCFSIM_ICR_AUTOVEC      0x80            /* Auto-vectored intr */
++#define       MCFSIM_ICR_LEVEL0       0x00            /* Level 0 intr */
++#define       MCFSIM_ICR_LEVEL1       0x04            /* Level 1 intr */
++#define       MCFSIM_ICR_LEVEL2       0x08            /* Level 2 intr */
++#define       MCFSIM_ICR_LEVEL3       0x0c            /* Level 3 intr */
++#define       MCFSIM_ICR_LEVEL4       0x10            /* Level 4 intr */
++#define       MCFSIM_ICR_LEVEL5       0x14            /* Level 5 intr */
++#define       MCFSIM_ICR_LEVEL6       0x18            /* Level 6 intr */
++#define       MCFSIM_ICR_LEVEL7       0x1c            /* Level 7 intr */
++
++#define       MCFSIM_ICR_PRI0         0x00            /* Priority 0 intr */
++#define       MCFSIM_ICR_PRI1         0x01            /* Priority 1 intr */
++#define       MCFSIM_ICR_PRI2         0x02            /* Priority 2 intr */
++#define       MCFSIM_ICR_PRI3         0x03            /* Priority 3 intr */
++
++/*
++ *    Bit definitions for the Interrupt Mask register (IMR).
++ */
++#define       MCFSIM_IMR_EINT1        0x0002          /* External intr # 1 */
++#define       MCFSIM_IMR_EINT2        0x0004          /* External intr # 2 */
++#define       MCFSIM_IMR_EINT3        0x0008          /* External intr # 3 */
++#define       MCFSIM_IMR_EINT4        0x0010          /* External intr # 4 */
++#define       MCFSIM_IMR_EINT5        0x0020          /* External intr # 5 */
++#define       MCFSIM_IMR_EINT6        0x0040          /* External intr # 6 */
++#define       MCFSIM_IMR_EINT7        0x0080          /* External intr # 7 */
++
++#define       MCFSIM_IMR_SWD          0x0100          /* Software Watchdog intr */
++#define       MCFSIM_IMR_TIMER1       0x0200          /* TIMER 1 intr */
++#define       MCFSIM_IMR_TIMER2       0x0400          /* TIMER 2 intr */
++#define MCFSIM_IMR_MBUS               0x0800          /* MBUS intr    */
++#define       MCFSIM_IMR_UART1        0x1000          /* UART 1 intr */
++#define       MCFSIM_IMR_UART2        0x2000          /* UART 2 intr */
++
++/*
++ *    Mask for all of the SIM devices. Some parts have more or less
++ *    SIM devices. This is a catchall for the sandard set.
++ */
++#ifndef MCFSIM_IMR_MASKALL
++#define       MCFSIM_IMR_MASKALL      0x3ffe          /* All intr sources */
++#endif
++
++
++/*
++ *    PIT interrupt settings, if not found in mXXXXsim.h file.
++ */
++#ifndef       ICR_INTRCONF
++#define       ICR_INTRCONF            0x2b            /* PIT1 level 5, priority 3 */
++#endif
++#ifndef       MCFPIT_IMR
++#define       MCFPIT_IMR              MCFINTC_IMRH
++#endif
++#ifndef       MCFPIT_IMR_IBIT
++#define       MCFPIT_IMR_IBIT         (1 << (MCFINT_PIT1 - 32))
++#endif
++
++
++#ifndef __ASSEMBLY__
++/*
++ *    Definition for the interrupt auto-vectoring support.
++ */
++extern void   mcf_autovector(unsigned int vec);
++#endif /* __ASSEMBLY__ */
++
++#endif        /* mcfsim_h */
+--- /dev/null
++++ b/include/asm-m68k/mcfuart.h
+@@ -0,0 +1,180 @@
++/*
++ *    mcfuart.h -- ColdFire internal UART support defines.
++ *
++ *    Matt Waddel Matt.Waddel@freescale.com
++ *    Copyright Freescale Semiconductor, Inc. 2007
++ *
++ *    Derived from m68knommu version of this same file (Greg Ungerer & Lineo).
++ *
++ */
++
++#ifndef       mcfuart_h
++#define       mcfuart_h
++
++/*
++ *    Define the base address of the UARTS within the MBAR address
++ *    space.
++ */
++#if defined(CONFIG_M54455)
++#include <asm/mcf5445x_intc.h>
++#define MCFUART_BASE1         0xfc060000      /* Base address of UART1 */
++#define MCFUART_BASE2         0xfc064000      /* Base address of UART2 */
++#define MCFUART_BASE3         0xfc068000      /* Base address of UART3 */
++#define MCFINT_VECBASE                64
++#define MCFINT_UART0          26
++#endif
++
++
++/*
++ *    Define the ColdFire UART register set addresses.
++ */
++#define       MCFUART_UMR             0x00            /* Mode register (r/w) */
++#define       MCFUART_USR             0x04            /* Status register (r) */
++#define       MCFUART_UCSR            0x04            /* Clock Select (w) */
++#define       MCFUART_UCR             0x08            /* Command register (w) */
++#define       MCFUART_URB             0x0c            /* Receiver Buffer (r) */
++#define       MCFUART_UTB             0x0c            /* Transmit Buffer (w) */
++#define       MCFUART_UIPCR           0x10            /* Input Port Change (r) */
++#define       MCFUART_UACR            0x10            /* Auxiliary Control (w) */
++#define       MCFUART_UISR            0x14            /* Interrup Status (r) */
++#define       MCFUART_UIMR            0x14            /* Interrupt Mask (w) */
++#define       MCFUART_UBG1            0x18            /* Baud Rate MSB (r/w) */
++#define       MCFUART_UBG2            0x1c            /* Baud Rate LSB (r/w) */
++#ifdef        CONFIG_M5272
++#define       MCFUART_UTF             0x28            /* Transmitter FIFO (r/w) */
++#define       MCFUART_URF             0x2c            /* Receiver FIFO (r/w) */
++#define       MCFUART_UFPD            0x30            /* Frac Prec. Divider (r/w) */
++#else
++#define       MCFUART_UIVR            0x30            /* Interrupt Vector (r/w) */
++#endif
++#define       MCFUART_UIPR            0x34            /* Input Port (r) */
++#define       MCFUART_UOP1            0x38            /* Output Port Bit Set (w) */
++#define       MCFUART_UOP0            0x3c            /* Output Port Bit Reset (w) */
++
++
++/*
++ *    Define bit flags in Mode Register 1 (MR1).
++ */
++#define       MCFUART_MR1_RXRTS       0x80            /* Auto RTS flow control */
++#define       MCFUART_MR1_RXIRQFULL   0x40            /* RX IRQ type FULL */
++#define       MCFUART_MR1_RXIRQRDY    0x00            /* RX IRQ type RDY */
++#define       MCFUART_MR1_RXERRBLOCK  0x20            /* RX block error mode */
++#define       MCFUART_MR1_RXERRCHAR   0x00            /* RX char error mode */
++
++#define       MCFUART_MR1_PARITYNONE  0x10            /* No parity */
++#define       MCFUART_MR1_PARITYEVEN  0x00            /* Even parity */
++#define       MCFUART_MR1_PARITYODD   0x04            /* Odd parity */
++#define       MCFUART_MR1_PARITYSPACE 0x08            /* Space parity */
++#define       MCFUART_MR1_PARITYMARK  0x0c            /* Mark parity */
++
++#define       MCFUART_MR1_CS5         0x00            /* 5 bits per char */
++#define       MCFUART_MR1_CS6         0x01            /* 6 bits per char */
++#define       MCFUART_MR1_CS7         0x02            /* 7 bits per char */
++#define       MCFUART_MR1_CS8         0x03            /* 8 bits per char */
++
++/*
++ *    Define bit flags in Mode Register 2 (MR2).
++ */
++#define       MCFUART_MR2_LOOPBACK    0x80            /* Loopback mode */
++#define       MCFUART_MR2_REMOTELOOP  0xc0            /* Remote loopback mode */
++#define       MCFUART_MR2_AUTOECHO    0x40            /* Automatic echo */
++#define       MCFUART_MR2_TXRTS       0x20            /* Assert RTS on TX */
++#define       MCFUART_MR2_TXCTS       0x10            /* Auto CTS flow control */
++
++#define       MCFUART_MR2_STOP1       0x07            /* 1 stop bit */
++#define       MCFUART_MR2_STOP15      0x08            /* 1.5 stop bits */
++#define       MCFUART_MR2_STOP2       0x0f            /* 2 stop bits */
++
++/*
++ *    Define bit flags in Status Register (USR).
++ */
++#define       MCFUART_USR_RXBREAK     0x80            /* Received BREAK */
++#define       MCFUART_USR_RXFRAMING   0x40            /* Received framing error */
++#define       MCFUART_USR_RXPARITY    0x20            /* Received parity error */
++#define       MCFUART_USR_RXOVERRUN   0x10            /* Received overrun error */
++#define       MCFUART_USR_TXEMPTY     0x08            /* Transmitter empty */
++#define       MCFUART_USR_TXREADY     0x04            /* Transmitter ready */
++#define       MCFUART_USR_RXFULL      0x02            /* Receiver full */
++#define       MCFUART_USR_RXREADY     0x01            /* Receiver ready */
++
++#define       MCFUART_USR_RXERR       (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \
++                              MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN)
++
++/*
++ *    Define bit flags in Clock Select Register (UCSR).
++ */
++#define       MCFUART_UCSR_RXCLKTIMER 0xd0            /* RX clock is timer */
++#define       MCFUART_UCSR_RXCLKEXT16 0xe0            /* RX clock is external x16 */
++#define       MCFUART_UCSR_RXCLKEXT1  0xf0            /* RX clock is external x1 */
++
++#define       MCFUART_UCSR_TXCLKTIMER 0x0d            /* TX clock is timer */
++#define       MCFUART_UCSR_TXCLKEXT16 0x0e            /* TX clock is external x16 */
++#define       MCFUART_UCSR_TXCLKEXT1  0x0f            /* TX clock is external x1 */
++
++/*
++ *    Define bit flags in Command Register (UCR).
++ */
++#define       MCFUART_UCR_CMDNULL             0x00    /* No command */
++#define       MCFUART_UCR_CMDRESETMRPTR       0x10    /* Reset MR pointer */
++#define       MCFUART_UCR_CMDRESETRX          0x20    /* Reset receiver */
++#define       MCFUART_UCR_CMDRESETTX          0x30    /* Reset transmitter */
++#define       MCFUART_UCR_CMDRESETERR         0x40    /* Reset error status */
++#define       MCFUART_UCR_CMDRESETBREAK       0x50    /* Reset BREAK change */
++#define       MCFUART_UCR_CMDBREAKSTART       0x60    /* Start BREAK */
++#define       MCFUART_UCR_CMDBREAKSTOP        0x70    /* Stop BREAK */
++
++#define       MCFUART_UCR_TXNULL      0x00            /* No TX command */
++#define       MCFUART_UCR_TXENABLE    0x04            /* Enable TX */
++#define       MCFUART_UCR_TXDISABLE   0x08            /* Disable TX */
++#define       MCFUART_UCR_RXNULL      0x00            /* No RX command */
++#define       MCFUART_UCR_RXENABLE    0x01            /* Enable RX */
++#define       MCFUART_UCR_RXDISABLE   0x02            /* Disable RX */
++
++/*
++ *    Define bit flags in Input Port Change Register (UIPCR).
++ */
++#define       MCFUART_UIPCR_CTSCOS    0x10            /* CTS change of state */
++#define       MCFUART_UIPCR_CTS       0x01            /* CTS value */
++
++/*
++ *    Define bit flags in Input Port Register (UIP).
++ */
++#define       MCFUART_UIPR_CTS        0x01            /* CTS value */
++
++/*
++ *    Define bit flags in Output Port Registers (UOP).
++ *    Clear bit by writing to UOP0, set by writing to UOP1.
++ */
++#define       MCFUART_UOP_RTS         0x01            /* RTS set or clear */
++
++/*
++ *    Define bit flags in the Auxiliary Control Register (UACR).
++ */
++#define       MCFUART_UACR_IEC        0x01            /* Input enable control */
++
++/*
++ *    Define bit flags in Interrupt Status Register (UISR).
++ *    These same bits are used for the Interrupt Mask Register (UIMR).
++ */
++#define       MCFUART_UIR_COS         0x80            /* Change of state (CTS) */
++#define       MCFUART_UIR_DELTABREAK  0x04            /* Break start or stop */
++#define       MCFUART_UIR_RXREADY     0x02            /* Receiver ready */
++#define       MCFUART_UIR_TXREADY     0x01            /* Transmitter ready */
++
++#ifdef        CONFIG_M5272
++/*
++ *    Define bit flags in the Transmitter FIFO Register (UTF).
++ */
++#define       MCFUART_UTF_TXB         0x1f            /* Transmitter data level */
++#define       MCFUART_UTF_FULL        0x20            /* Transmitter fifo full */
++#define       MCFUART_UTF_TXS         0xc0            /* Transmitter status */
++
++/*
++ *    Define bit flags in the Receiver FIFO Register (URF).
++ */
++#define       MCFUART_URF_RXB         0x1f            /* Receiver data level */
++#define       MCFUART_URF_FULL        0x20            /* Receiver fifo full */
++#define       MCFUART_URF_RXS         0xc0            /* Receiver status */
++#endif
++
++#endif        /* mcfuart_h */
diff --git a/target/linux/coldfire/patches/004-m5445x_headers.patch b/target/linux/coldfire/patches/004-m5445x_headers.patch
new file mode 100644 (file)
index 0000000..3a72bf6
--- /dev/null
@@ -0,0 +1,5136 @@
+From fa0f89c9cf9ceecc3feac1d96914c8e91f98d90f Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:43:01 -0600
+Subject: [PATCH] Add MCF5445x Specific Header Files.
+
+LTIBName: m5445x-headers
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/mcf5445x_ccm.h    |  161 ++++
+ include/asm-m68k/mcf5445x_dspi.h   |  402 ++++++++++
+ include/asm-m68k/mcf5445x_dtim.h   |   87 +++
+ include/asm-m68k/mcf5445x_edma.h   | 1458 ++++++++++++++++++++++++++++++++++++
+ include/asm-m68k/mcf5445x_eport.h  |  117 +++
+ include/asm-m68k/mcf5445x_fbcs.h   |  182 +++++
+ include/asm-m68k/mcf5445x_gpio.h   | 1257 +++++++++++++++++++++++++++++++
+ include/asm-m68k/mcf5445x_i2c.h    |   39 +
+ include/asm-m68k/mcf5445x_intc.h   |  724 ++++++++++++++++++
+ include/asm-m68k/mcf5445x_pci.h    |  238 ++++++
+ include/asm-m68k/mcf5445x_pciarb.h |   40 +
+ include/asm-m68k/mcf5445x_sdramc.h |  115 +++
+ include/asm-m68k/mcf5445x_ssi.h    |  187 +++++
+ include/asm-m68k/mcf5445x_usb.h    |   49 ++
+ 14 files changed, 5056 insertions(+), 0 deletions(-)
+ create mode 100644 include/asm-m68k/mcf5445x_ccm.h
+ create mode 100644 include/asm-m68k/mcf5445x_dspi.h
+ create mode 100644 include/asm-m68k/mcf5445x_dtim.h
+ create mode 100644 include/asm-m68k/mcf5445x_edma.h
+ create mode 100644 include/asm-m68k/mcf5445x_eport.h
+ create mode 100644 include/asm-m68k/mcf5445x_fbcs.h
+ create mode 100644 include/asm-m68k/mcf5445x_gpio.h
+ create mode 100644 include/asm-m68k/mcf5445x_i2c.h
+ create mode 100644 include/asm-m68k/mcf5445x_intc.h
+ create mode 100644 include/asm-m68k/mcf5445x_pci.h
+ create mode 100644 include/asm-m68k/mcf5445x_pciarb.h
+ create mode 100644 include/asm-m68k/mcf5445x_sdramc.h
+ create mode 100644 include/asm-m68k/mcf5445x_ssi.h
+ create mode 100644 include/asm-m68k/mcf5445x_usb.h
+
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_ccm.h
+@@ -0,0 +1,161 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_CCM_H__
++#define __MCF5445X_CCM_H__
++
++/*********************************************************************
++*
++* Chip Configuration Module (CCM)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_CCM_CCR   MCF_REG16(0xFC0A0004)   /* Chip Configuration Register (Read-only) (256 or 360 TEPBGA) */
++#define MCF_CCM_RCON  MCF_REG16(0xFC0A0008)   /* Reset Configuration (Read-only) (256 or 360 TEPBGA) */
++#define MCF_CCM_CIR   MCF_REG16(0xFC0A000A)   /* Chip Identification Register (Read-only) */
++#define MCF_CCM_MISCCR        MCF_REG16(0xFC0A0010)   /* Miscellaneous Control Register */
++#define MCF_CCM_CDR   MCF_REG16(0xFC0A0012)   /* Clock Divider Register */
++#define MCF_CCM_UOCSR MCF_REG16(0xFC0A0014)   /* USB On-the-Go Controller Status Register */
++#define MCF_CCM_SBFSR MCF_REG16(0xFC0A0018)   /* Serial Boot Facility Status Register (Read Only) */
++#define MCF_CCM_SBFCR MCF_REG16(0xFC0A0020)   /* Serial Boot Facility Control Register */
++
++/* Bit definitions and macros for CCR_360 */
++#define MCF_CCM_CCR_360_PLLMULT2(x)         (((x) & 0x0003))  /* 2-Bit PLL clock mode */
++#define MCF_CCM_CCR_360_PCISLEW             (0x0004)          /* PCI pad slew rate mode */
++#define MCF_CCM_CCR_360_PCIMODE             (0x0008)          /* PCI host/agent mode */
++#define MCF_CCM_CCR_360_PLLMODE             (0x0010)          /* PLL Mode */
++#define MCF_CCM_CCR_360_FBCONFIG(x)         (((x) & 0x0007) << 5)  /* Flexbus/PCI port size configuration */
++#define MCF_CCM_CCR_360_PLLMULT3(x)         (((x) & 0x0007))  /* 3-Bit PLL Clock Mode */
++#define MCF_CCM_CCR_360_OSCMODE             (0x0008)          /* Oscillator Clock Mode */
++#define MCF_CCM_CCR_360_FBCONFIG_MASK       (0x00E0)
++#define MCF_CCM_CCR_360_PLLMULT2_MASK       (0x0003)
++#define MCF_CCM_CCR_360_PLLMULT3_MASK       (0x0007)
++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_32   (0x0000)
++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_8    (0x0020)
++#define MCF_CCM_CCR_360_FBCONFIG_NM_NP_16   (0x0040)
++#define MCF_CCM_CCR_360_FBCONFIG_M_P_16     (0x0060)
++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_32    (0x0080)
++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_8     (0x00A0)
++#define MCF_CCM_CCR_360_FBCONFIG_M_NP_16    (0x00C0)
++#define MCF_CCM_CCR_360_FBCONFIG_M_P_8      (0x00E0)
++#define MCF_CCM_CCR_360_PLLMULT2_12X        (0x0000)
++#define MCF_CCM_CCR_360_PLLMULT2_6X         (0x0001)
++#define MCF_CCM_CCR_360_PLLMULT2_16X        (0x0002)
++#define MCF_CCM_CCR_360_PLLMULT2_8X         (0x0003)
++#define MCF_CCM_CCR_360_PLLMULT3_20X        (0x0000)
++#define MCF_CCM_CCR_360_PLLMULT3_10X        (0x0001)
++#define MCF_CCM_CCR_360_PLLMULT3_24X        (0x0002)
++#define MCF_CCM_CCR_360_PLLMULT3_18X        (0x0003)
++#define MCF_CCM_CCR_360_PLLMULT3_12X        (0x0004)
++#define MCF_CCM_CCR_360_PLLMULT3_6X         (0x0005)
++#define MCF_CCM_CCR_360_PLLMULT3_16X        (0x0006)
++#define MCF_CCM_CCR_360_PLLMULT3_8X         (0x0007)
++
++/* Bit definitions and macros for CCR_256 */
++#define MCF_CCM_CCR_256_PLLMULT3(x)         (((x) & 0x0007))  /* 3-Bit PLL clock mode */
++#define MCF_CCM_CCR_256_OSCMODE             (0x0008)        /* Oscillator clock mode */
++#define MCF_CCM_CCR_256_PLLMODE             (0x0010)        /* PLL Mode */
++#define MCF_CCM_CCR_256_FBCONFIG(x)         (((x) & 0x0007) << 5)  /* Flexbus/PCI port size configuration */
++#define MCF_CCM_CCR_256_FBCONFIG_MASK       (0x00E0)
++#define MCF_CCM_CCR_256_FBCONFIG_NM_32      (0x0000)
++#define MCF_CCM_CCR_256_FBCONFIG_NM_8       (0x0020)
++#define MCF_CCM_CCR_256_FBCONFIG_NM_16      (0x0040)
++#define MCF_CCM_CCR_256_FBCONFIG_M_32       (0x0080)
++#define MCF_CCM_CCR_256_FBCONFIG_M_8        (0x00A0)
++#define MCF_CCM_CCR_256_FBCONFIG_M_16       (0x00C0)
++#define MCF_CCM_CCR_256_PLLMULT3_MASK       (0x0007)
++#define MCF_CCM_CCR_256_PLLMULT3_20X        (0x0000)
++#define MCF_CCM_CCR_256_PLLMULT3_10X        (0x0001)
++#define MCF_CCM_CCR_256_PLLMULT3_24X        (0x0002)
++#define MCF_CCM_CCR_256_PLLMULT3_18X        (0x0003)
++#define MCF_CCM_CCR_256_PLLMULT3_12X        (0x0004)
++#define MCF_CCM_CCR_256_PLLMULT3_6X         (0x0005)
++#define MCF_CCM_CCR_256_PLLMULT3_16X        (0x0006)
++#define MCF_CCM_CCR_256_PLLMULT3_8X         (0x0007)
++
++/* Bit definitions and macros for RCON_360 */
++#define MCF_CCM_RCON_360_PLLMULT(x)     (((x)&0x0003))        /* PLL clock mode */
++#define MCF_CCM_RCON_360_PCISLEW        (0x0004)      /* PCI pad slew rate mode */
++#define MCF_CCM_RCON_360_PCIMODE        (0x0008)      /* PCI host/agent mode */
++#define MCF_CCM_RCON_360_PLLMODE        (0x0010)      /* PLL Mode */
++#define MCF_CCM_RCON_360_FBCONFIG(x)    (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */
++
++/* Bit definitions and macros for RCON_256 */
++#define MCF_CCM_RCON_256_PLLMULT(x)     (((x) & 0x0007)) /* PLL clock mode */
++#define MCF_CCM_RCON_256_OSCMODE        (0x0008)      /* Oscillator clock mode */
++#define MCF_CCM_RCON_256_PLLMODE        (0x0010)      /* PLL Mode */
++#define MCF_CCM_RCON_256_FBCONFIG(x)    (((x) & 0x0007) << 5) /* Flexbus/PCI port size configuration */
++
++/* Bit definitions and macros for CIR */
++#define MCF_CCM_CIR_PRN(x)          (((x) & 0x003F))  /* Part revision number */
++#define MCF_CCM_CIR_PIN(x)          (((x) & 0x03FF) << 6)     /* Part identification number */
++#define MCF_CCM_CIR_PIN_MASK        (0xFFC0)
++#define MCF_CCM_CIR_PRN_MASK        (0x003F)
++#define MCF_CCM_CIR_PIN_MCF54450    (0x4F << 6)
++#define MCF_CCM_CIR_PIN_MCF54451    (0x4D << 6)
++#define MCF_CCM_CIR_PIN_MCF54452    (0x4B << 6)
++#define MCF_CCM_CIR_PIN_MCF54453    (0x49 << 6)
++#define MCF_CCM_CIR_PIN_MCF54454    (0x4A << 6)
++#define MCF_CCM_CIR_PIN_MCF54455    (0x48 << 6)
++
++/* Bit definitions and macros for MISCCR */
++#define MCF_CCM_MISCCR_USBSRC           (0x0001)      /* USB clock source */
++#define MCF_CCM_MISCCR_USBOC            (0x0002)      /* USB VBUS over-current sense polarity */
++#define MCF_CCM_MISCCR_USBPUE           (0x0004)      /* USB transceiver pull-up enable */
++#define MCF_CCM_MISCCR_SSISRC           (0x0010)      /* SSI clock source */
++#define MCF_CCM_MISCCR_TIMDMA           (0x0020)      /* Timer DMA mux selection */
++#define MCF_CCM_MISCCR_SSIPUS           (0x0040)      /* SSI RXD/TXD pull select */
++#define MCF_CCM_MISCCR_SSIPUE           (0x0080)      /* SSI RXD/TXD pull enable */
++#define MCF_CCM_MISCCR_BMT(x)           (((x) & 0x0007) << 8) /* Bus monitor timing field */
++#define MCF_CCM_MISCCR_BME              (0x0800)      /* Bus monitor external enable bit */
++#define MCF_CCM_MISCCR_LIMP             (0x1000)      /* Limp mode enable */
++#define MCF_CCM_MISCCR_BMT_65536        (0)
++#define MCF_CCM_MISCCR_BMT_32768        (1)
++#define MCF_CCM_MISCCR_BMT_16384        (2)
++#define MCF_CCM_MISCCR_BMT_8192         (3)
++#define MCF_CCM_MISCCR_BMT_4096         (4)
++#define MCF_CCM_MISCCR_BMT_2048         (5)
++#define MCF_CCM_MISCCR_BMT_1024         (6)
++#define MCF_CCM_MISCCR_BMT_512          (7)
++#define MCF_CCM_MISCCR_SSIPUS_UP        (1)
++#define MCF_CCM_MISCCR_SSIPUS_DOWN      (0)
++#define MCF_CCM_MISCCR_TIMDMA_TIM       (1)
++#define MCF_CCM_MISCCR_TIMDMA_SSI       (0)
++#define MCF_CCM_MISCCR_SSISRC_CLKIN     (0)
++#define MCF_CCM_MISCCR_SSISRC_PLL       (1)
++#define MCF_CCM_MISCCR_USBOC_ACTHI      (0)
++#define MCF_CCM_MISCCR_USBOV_ACTLO      (1)
++#define MCF_CCM_MISCCR_USBSRC_CLKIN     (0)
++#define MCF_CCM_MISCCR_USBSRC_PLL       (1)
++
++/* Bit definitions and macros for CDR */
++#define MCF_CCM_CDR_SSIDIV(x)   (((x) & 0x00FF))      /* SSI oversampling clock divider */
++#define MCF_CCM_CDR_LPDIV(x)    (((x) & 0x000F) << 8) /* Low power clock divider */
++
++/* Bit definitions and macros for UOCSR */
++#define MCF_CCM_UOCSR_XPDE          (0x0001)  /* On-chip transceiver pull-down enable */
++#define MCF_CCM_UOCSR_UOMIE         (0x0002)  /* USB OTG misc interrupt enable */
++#define MCF_CCM_UOCSR_WKUP          (0x0004)  /* USB OTG controller wake-up event */
++#define MCF_CCM_UOCSR_PWRFLT        (0x0008)  /* VBUS power fault */
++#define MCF_CCM_UOCSR_SEND          (0x0010)  /* Session end */
++#define MCF_CCM_UOCSR_VVLD          (0x0020)  /* VBUS valid indicator */
++#define MCF_CCM_UOCSR_BVLD          (0x0040)  /* B-peripheral valid indicator */
++#define MCF_CCM_UOCSR_AVLD          (0x0080)  /* A-peripheral valid indicator */
++#define MCF_CCM_UOCSR_DPPU          (0x0100)  /* D+ pull-up for FS enabled (read-only) */
++#define MCF_CCM_UOCSR_DCR_VBUS      (0x0200)  /* VBUS discharge resistor enabled (read-only) */
++#define MCF_CCM_UOCSR_CRG_VBUS      (0x0400)  /* VBUS charge resistor enabled (read-only) */
++#define MCF_CCM_UOCSR_DMPD          (0x1000)  /* D- 15Kohm pull-down (read-only) */
++#define MCF_CCM_UOCSR_DPPD          (0x2000)  /* D+ 15Kohm pull-down (read-only) */
++
++/********************************************************************/
++
++#endif /* __MCF5445X_CCM_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_dspi.h
+@@ -0,0 +1,402 @@
++/*
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_DSPI_H__
++#define __MCF5445X_DSPI_H__
++
++/*********************************************************************
++*
++* DMA Serial Peripheral Interface (DSPI)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_DSPI_DMCR           MCF_REG32(0xFC05C000)   /* DSPI Module Configuration Register */
++#define MCF_DSPI_DTCR           MCF_REG32(0xFC05C008)   /* DSPI Transfer Count Register */
++#define MCF_DSPI_DCTAR0         MCF_REG32(0xFC05C00C)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR1         MCF_REG32(0xFC05C010)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR2         MCF_REG32(0xFC05C014)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR3         MCF_REG32(0xFC05C018)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR4         MCF_REG32(0xFC05C01C)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR5         MCF_REG32(0xFC05C020)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR6         MCF_REG32(0xFC05C024)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DCTAR7         MCF_REG32(0xFC05C028)   /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DSR            MCF_REG32(0xFC05C02C)   /* DSPI Status Register */
++#define MCF_DSPI_DRSER          MCF_REG32(0xFC05C030)   /* DSPI DMA/Interrupt Request Select and Enable Register */
++#define MCF_DSPI_DTFR           MCF_REG32(0xFC05C034)   /* DSPI Transmit FIFO Register */
++#define MCF_DSPI_DRFR           MCF_REG32(0xFC05C038)   /* DSPI Receive FIFO Register */
++#define MCF_DSPI_DTFDR0         MCF_REG32(0xFC05C03C)   /* DSPI Transmit FIFO Debugging Registers */
++#define MCF_DSPI_DTFDR1         MCF_REG32(0xFC05C040)   /* DSPI Transmit FIFO Debugging Registers */
++#define MCF_DSPI_DTFDR2         MCF_REG32(0xFC05C044)   /* DSPI Transmit FIFO Debugging Registers */
++#define MCF_DSPI_DTFDR3         MCF_REG32(0xFC05C048)   /* DSPI Transmit FIFO Debugging Registers */
++#define MCF_DSPI_DRFDR0         MCF_REG32(0xFC05C07C)   /* DSPI Receive FIFO Debugging Registers */
++#define MCF_DSPI_DRFDR1         MCF_REG32(0xFC05C080)   /* DSPI Receive FIFO Debugging Registers */
++#define MCF_DSPI_DRFDR2         MCF_REG32(0xFC05C084)   /* DSPI Receive FIFO Debugging Registers */
++#define MCF_DSPI_DRFDR3         MCF_REG32(0xFC05C088)   /* DSPI Receive FIFO Debugging Registers */
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_DSPI_DCTAR(x)       MCF_REG32(0xFC05C00C+((x)*0x004))     /* DSPI Clock and Transfer Attributes Register */
++#define MCF_DSPI_DTFDR(x)       MCF_REG32(0xFC05C03C+((x)*0x004))     /* DSPI Transmit FIFO Debugging Registers */
++#define MCF_DSPI_DRFDR(x)       MCF_REG32(0xFC05C07C+((x)*0x004))     /* DSPI Receive FIFO Debugging Registers */
++
++/* Bit definitions and macros for DMCR */
++#define MCF_DSPI_DMCR_HALT          (0x00000001)            /* Halt -- stops and starts DSPI transfers */
++#define MCF_DSPI_DMCR_SMPLPT(x)     (((x)&0x00000003)<<8)   /* Sample point selection */
++#define MCF_DSPI_DMCR_CLRRXF        (0x00000400)            /* Clear receive FIFO */
++#define MCF_DSPI_DMCR_CLRTXF        (0x00000800)            /* Clear transmit FIFO */
++#define MCF_DSPI_DMCR_DISRXF        (0x00001000)            /* Disable receive FIFO */
++#define MCF_DSPI_DMCR_DISTXF        (0x00002000)            /* Disable transmit FIFO */
++#define MCF_DSPI_DMCR_MDIS          (0x00004000)            /* Module Disable */
++#define MCF_DSPI_DMCR_PCSIS0        (0x00010000)            /* Peripheral chip-select 0 inactive state */
++#define MCF_DSPI_DMCR_PCSIS1        (0x00020000)            /* Peripheral chip-select 1 inactive state */
++#define MCF_DSPI_DMCR_PCSIS2        (0x00040000)            /* Peripheral chip-select 2 inactive state */
++#define MCF_DSPI_DMCR_PCSIS3        (0x00080000)            /* Peripheral chip-select 3 inactive state */
++#define MCF_DSPI_DMCR_PCSIS4        (0x00100000)            /* Peripheral chip-select 4 inactive state */
++#define MCF_DSPI_DMCR_PCSIS5        (0x00200000)            /* Peripheral chip-select 5 inactive state */
++#define MCF_DSPI_DMCR_PCSIS6        (0x00400000)            /* Peripheral chip-select 6 inactive state */
++#define MCF_DSPI_DMCR_PCSIS7        (0x00800000)            /* Peripheral chip-select 7 inactive state */
++#define MCF_DSPI_DMCR_ROOE          (0x01000000)            /* Receive FIFO overflow overwrite enable */
++#define MCF_DSPI_DMCR_PCSSE         (0x02000000)            /* Peripheral chip select strobe enable */
++#define MCF_DSPI_DMCR_MTFE          (0x04000000)            /* Modified timing format enable */
++#define MCF_DSPI_DMCR_FRZ           (0x08000000)            /* Freeze */
++#define MCF_DSPI_DMCR_DCONF(x)      (((x)&0x00000003)<<28)  /* DSPI configuration */
++#define MCF_DSPI_DMCR_CONT_SCKE     (0x40000000)            /* Continuous SCK enable */
++#define MCF_DSPI_DMCR_MSTR          (0x80000000)            /* Master/Slave mode select */
++#define MCF_DSPI_DMCR_DCONF_SPI     (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS7_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS7_HIGH   (0x00800000)
++#define MCF_DSPI_DMCR_PCSIS6_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS6_HIGH   (0x00400000)
++#define MCF_DSPI_DMCR_PCSIS5_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS5_HIGH   (0x00200000)
++#define MCF_DSPI_DMCR_PCSIS4_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS4_HIGH   (0x00100000)
++#define MCF_DSPI_DMCR_PCSIS3_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS3_HIGH   (0x00080000)
++#define MCF_DSPI_DMCR_PCSIS2_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS2_HIGH   (0x00040000)
++#define MCF_DSPI_DMCR_PCSIS1_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS1_HIGH   (0x00020000)
++#define MCF_DSPI_DMCR_PCSIS0_LOW    (0x00000000)
++#define MCF_DSPI_DMCR_PCSIS0_HIGH   (0x00010000)
++
++/* Bit definitions and macros for DTCR */
++#define MCF_DSPI_DTCR_SPI_TCNT(x)   (((x)&0x0000FFFF)<<16)  /* SPI transfer count */
++
++/* Bit definitions and macros for DCTAR group */
++#define MCF_DSPI_DCTAR_BR(x)                (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR_DT(x)                (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR_ASC(x)               (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR_CSSCK(x)             (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR_PBR(x)               (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR_PDT(x)               (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR_PASC(x)              (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR_PCSSCK(x)            (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR_LSBFE                (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR_CPHA                 (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR_CPOL                 (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR_FMSZ(x)              (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR_DBR                  (0x80000000)            /* Double baud rate */
++#define MCF_DSPI_DCTAR_CPOL_LOW             (0x00000000)
++#define MCF_DSPI_DCTAR_CPOL_HIGH            (0x04000000)
++#define MCF_DSPI_DCTAR_CPHA_LATCH_RISING    (0x00000000)
++#define MCF_DSPI_DCTAR_CPHA_LATCH_FALLING   (0x02000000)
++#define MCF_DSPI_DCTAR_PCSSCK_1CLK          (0x00000000)
++#define MCF_DSPI_DCTAR_PCSSCK_3CLK          (0x00400000)
++#define MCF_DSPI_DCTAR_PCSSCK_5CLK          (0x00800000)
++#define MCF_DSPI_DCTAR_PCSSCK_7CLK          (0x00C00000)
++#define MCF_DSPI_DCTAR_PASC_1CLK            (0x00000000)
++#define MCF_DSPI_DCTAR_PASC_3CLK            (0x00100000)
++#define MCF_DSPI_DCTAR_PASC_5CLK            (0x00200000)
++#define MCF_DSPI_DCTAR_PASC_7CLK            (0x00300000)
++#define MCF_DSPI_DCTAR_PDT_1CLK             (0x00000000)
++#define MCF_DSPI_DCTAR_PDT_3CLK             (0x00040000)
++#define MCF_DSPI_DCTAR_PDT_5CLK             (0x00080000)
++#define MCF_DSPI_DCTAR_PDT_7CLK             (0x000C0000)
++#define MCF_DSPI_DCTAR_PBR_2CLK             (0x00000000)
++#define MCF_DSPI_DCTAR_PBR_3CLK             (0x00010000)
++#define MCF_DSPI_DCTAR_PBR_5CLK             (0x00020000)
++#define MCF_DSPI_DCTAR_PBR_7CLK             (0x00030000)
++
++/* Bit definitions and macros for DCTAR0 */
++#define MCF_DSPI_DCTAR0_BR(x)                   (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR0_DT(x)                   (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR0_ASC(x)                  (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR0_CSSCK(x)                (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR0_PBR(x)                  (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR0_PDT(x)                  (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR0_PASC(x)                 (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR0_PCSSCK(x)               (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR0_LSBFE                   (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR0_CPHA                    (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR0_CPOL                    (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR0_FMSZ(x)                 (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR0_DBR                     (0x80000000)            /* Double baud rate */
++#define MCF_DSPI_DCTAR0_CPOL_LOW                (0x00000000)
++#define MCF_DSPI_DCTAR0_CPOL_HIGH               (0x04000000)
++#define MCF_DSPI_DCTAR0_CPHA_LATCH_RISING       (0x00000000)
++#define MCF_DSPI_DCTAR0_CPHA_LATCH_FALLING      (0x02000000)
++#define MCF_DSPI_DCTAR0_PCSSCK_1CLK             (0x00000000)
++#define MCF_DSPI_DCTAR0_PCSSCK_3CLK             (0x00400000)
++#define MCF_DSPI_DCTAR0_PCSSCK_5CLK             (0x00800000)
++#define MCF_DSPI_DCTAR0_PCSSCK_7CLK             (0x00C00000)
++#define MCF_DSPI_DCTAR0_PASC_1CLK               (0x00000000)
++#define MCF_DSPI_DCTAR0_PASC_3CLK               (0x00100000)
++#define MCF_DSPI_DCTAR0_PASC_5CLK               (0x00200000)
++#define MCF_DSPI_DCTAR0_PASC_7CLK               (0x00300000)
++#define MCF_DSPI_DCTAR0_PDT_1CLK                (0x00000000)
++#define MCF_DSPI_DCTAR0_PDT_3CLK                (0x00040000)
++#define MCF_DSPI_DCTAR0_PDT_5CLK                (0x00080000)
++#define MCF_DSPI_DCTAR0_PDT_7CLK                (0x000C0000)
++#define MCF_DSPI_DCTAR0_PBR_2CLK                (0x00000000)
++#define MCF_DSPI_DCTAR0_PBR_3CLK                (0x00010000)
++#define MCF_DSPI_DCTAR0_PBR_5CLK                (0x00020000)
++#define MCF_DSPI_DCTAR0_PBR_7CLK                (0x00030000)
++
++/* Bit definitions and macros for DCTAR1 */
++#define MCF_DSPI_DCTAR1_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR1_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR1_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR1_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR1_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR1_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR1_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR1_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR1_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR1_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR1_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR1_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR1_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR2 */
++#define MCF_DSPI_DCTAR2_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR2_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR2_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR2_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR2_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR2_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR2_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR2_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR2_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR2_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR2_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR2_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR2_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR3 */
++#define MCF_DSPI_DCTAR3_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR3_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR3_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR3_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR3_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR3_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR3_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR3_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR3_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR3_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR3_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR3_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR3_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR4 */
++#define MCF_DSPI_DCTAR4_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR4_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR4_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR4_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR4_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR4_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR4_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR4_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR4_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR4_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR4_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR4_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR4_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR5 */
++#define MCF_DSPI_DCTAR5_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR5_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR5_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR5_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR5_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR5_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR5_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR5_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR5_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR5_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR5_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR5_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR5_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR6 */
++#define MCF_DSPI_DCTAR6_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR6_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR6_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR6_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR6_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR6_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR6_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR6_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR6_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR6_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR6_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR6_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR6_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DCTAR7 */
++#define MCF_DSPI_DCTAR7_BR(x)       (((x)&0x0000000F))      /* Baud rate scaler */
++#define MCF_DSPI_DCTAR7_DT(x)       (((x)&0x0000000F)<<4)   /* Delay after transfer scaler */
++#define MCF_DSPI_DCTAR7_ASC(x)      (((x)&0x0000000F)<<8)   /* After SCK delay scaler */
++#define MCF_DSPI_DCTAR7_CSSCK(x)    (((x)&0x0000000F)<<12)  /* PCS to SCK delay scaler */
++#define MCF_DSPI_DCTAR7_PBR(x)      (((x)&0x00000003)<<16)  /* Baud rate prescaler */
++#define MCF_DSPI_DCTAR7_PDT(x)      (((x)&0x00000003)<<18)  /* Delay after transfer prescaler */
++#define MCF_DSPI_DCTAR7_PASC(x)     (((x)&0x00000003)<<20)  /* After SCK delay prescaler */
++#define MCF_DSPI_DCTAR7_PCSSCK(x)   (((x)&0x00000003)<<22)  /* PCS to SCK delay prescaler */
++#define MCF_DSPI_DCTAR7_LSBFE       (0x01000000)            /* LSB first enable */
++#define MCF_DSPI_DCTAR7_CPHA        (0x02000000)            /* Clock phase */
++#define MCF_DSPI_DCTAR7_CPOL        (0x04000000)            /* Clock polarity */
++#define MCF_DSPI_DCTAR7_FMSZ(x)     (((x)&0x0000000F)<<27)  /* Frame size */
++#define MCF_DSPI_DCTAR7_DBR         (0x80000000)            /* Double baud rate */
++
++/* Bit definitions and macros for DSR */
++#define MCF_DSPI_DSR_RXPTR(x)   (((x)&0x0000000F))      /* Receive next pointer */
++#define MCF_DSPI_DSR_RXCTR(x)   (((x)&0x0000000F)<<4)   /* Receive FIFO counter */
++#define MCF_DSPI_DSR_TXPTR(x)   (((x)&0x0000000F)<<8)   /* Transmit next pointer */
++#define MCF_DSPI_DSR_TXCTR(x)   (((x)&0x0000000F)<<12)  /* Transmit FIFO counter */
++#define MCF_DSPI_DSR_RFDF       (0x00020000)            /* Receive FIFO drain flag */
++#define MCF_DSPI_DSR_RFOF       (0x00080000)            /* Receive FIFO overflow flag */
++#define MCF_DSPI_DSR_TFFF       (0x02000000)            /* Transmit FIFO fill flag */
++#define MCF_DSPI_DSR_TFUF       (0x08000000)            /* Transmit FIFO underflow flag */
++#define MCF_DSPI_DSR_EOQF       (0x10000000)            /* End of queue flag */
++#define MCF_DSPI_DSR_TXRXS      (0x40000000)            /* Tx and Rx status (enabled | disabled) */
++#define MCF_DSPI_DSR_TCF        (0x80000000)            /* Transfer complete flag */
++
++/* Bit definitions and macros for DRSER */
++#define MCF_DSPI_DRSER_RFDFS    (0x00010000)    /* Receive FIFO drain DMA or interrupt select */
++#define MCF_DSPI_DRSER_RFDFE    (0x00020000)    /* Receive FIFO drain request enable */
++#define MCF_DSPI_DRSER_RFOFE    (0x00080000)    /* Receive FIFO overflow request enable */
++#define MCF_DSPI_DRSER_TFFFS    (0x01000000)    /* Transmit FIFO fill DMA or interrupt select */
++#define MCF_DSPI_DRSER_TFFFE    (0x02000000)    /* Transmit FIFO fill request enable */
++#define MCF_DSPI_DRSER_TFUFE    (0x08000000)    /* Transmit FIFO underflow request enable */
++#define MCF_DSPI_DRSER_EOQFE    (0x10000000)    /* DSPI finished request enable */
++#define MCF_DSPI_DRSER_TCFE     (0x80000000)    /* Transmission complete request enable */
++
++/* Bit definitions and macros for DTFR */
++#define MCF_DSPI_DTFR_TXDATA(x)     (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFR_PCS0          (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFR_PCS1          (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFR_PCS2          (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFR_PCS3          (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFR_PCS4          (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFR_PCS5          (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFR_PCS6          (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFR_PCS7          (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFR_CTCNT         (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFR_EOQ           (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFR_CTAS(x)       (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFR_CONT          (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DRFR */
++#define MCF_DSPI_DRFR_RXDATA(x)     (((x)&0x0000FFFF))  /* Receive data */
++
++/* Bit definitions and macros for DTFDR group */
++#define MCF_DSPI_DTFDR_TXDATA(x)    (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFDR_PCS0         (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFDR_PCS1         (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFDR_PCS2         (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFDR_PCS3         (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFDR_PCS4         (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFDR_PCS5         (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFDR_PCS6         (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFDR_PCS7         (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFDR_CTCNT        (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFDR_EOQ          (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFDR_CTAS(x)      (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFDR_CONT         (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DTFDR0 */
++#define MCF_DSPI_DTFDR0_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFDR0_PCS0        (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFDR0_PCS1        (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFDR0_PCS2        (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFDR0_PCS3        (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFDR0_PCS4        (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFDR0_PCS5        (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFDR0_PCS6        (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFDR0_PCS7        (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFDR0_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFDR0_EOQ         (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFDR0_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFDR0_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DTFDR1 */
++#define MCF_DSPI_DTFDR1_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFDR1_PCS0        (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFDR1_PCS1        (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFDR1_PCS2        (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFDR1_PCS3        (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFDR1_PCS4        (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFDR1_PCS5        (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFDR1_PCS6        (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFDR1_PCS7        (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFDR1_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFDR1_EOQ         (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFDR1_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFDR1_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DTFDR2 */
++#define MCF_DSPI_DTFDR2_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFDR2_PCS0        (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFDR2_PCS1        (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFDR2_PCS2        (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFDR2_PCS3        (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFDR2_PCS4        (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFDR2_PCS5        (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFDR2_PCS6        (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFDR2_PCS7        (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFDR2_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFDR2_EOQ         (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFDR2_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFDR2_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DTFDR3 */
++#define MCF_DSPI_DTFDR3_TXDATA(x)   (((x)&0x0000FFFF))      /* Transmit data */
++#define MCF_DSPI_DTFDR3_PCS0        (0x00010000)            /* Peripheral chip select 0 */
++#define MCF_DSPI_DTFDR3_PCS1        (0x00020000)            /* Peripheral chip select 1 */
++#define MCF_DSPI_DTFDR3_PCS2        (0x00040000)            /* Peripheral chip select 2 */
++#define MCF_DSPI_DTFDR3_PCS3        (0x00080000)            /* Peripheral chip select 3 */
++#define MCF_DSPI_DTFDR3_PCS4        (0x00100000)            /* Peripheral chip select 4 */
++#define MCF_DSPI_DTFDR3_PCS5        (0x00200000)            /* Peripheral chip select 5 */
++#define MCF_DSPI_DTFDR3_PCS6        (0x00400000)            /* Peripheral chip select 6 */
++#define MCF_DSPI_DTFDR3_PCS7        (0x00800000)            /* Peripheral chip select 7 */
++#define MCF_DSPI_DTFDR3_CTCNT       (0x04000000)            /* Clear SPI transfer counter */
++#define MCF_DSPI_DTFDR3_EOQ         (0x08000000)            /* End of queue */
++#define MCF_DSPI_DTFDR3_CTAS(x)     (((x)&0x00000007)<<28)  /* Clock and transfer attributes select */
++#define MCF_DSPI_DTFDR3_CONT        (0x80000000)            /* Continuous peripheral chip-select enable */
++
++/* Bit definitions and macros for DRFDR group */
++#define MCF_DSPI_DRFDR_RXDATA(x)    (((x)&0x0000FFFF))  /* Receive data */
++
++/* Bit definitions and macros for DRFDR0 */
++#define MCF_DSPI_DRFDR0_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
++
++/* Bit definitions and macros for DRFDR1 */
++#define MCF_DSPI_DRFDR1_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
++
++/* Bit definitions and macros for DRFDR2 */
++#define MCF_DSPI_DRFDR2_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
++
++/* Bit definitions and macros for DRFDR3 */
++#define MCF_DSPI_DRFDR3_RXDATA(x)   (((x)&0x0000FFFF))  /* Receive data */
++
++/********************************************************************/
++
++#endif /* __MCF5445X_DSPI_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_dtim.h
+@@ -0,0 +1,87 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_DTIM_H__
++#define __MCF5445X_DTIM_H__
++
++/*********************************************************************
++*
++* DMA Timers (DTIM)
++*
++*********************************************************************/
++/* Register read/write macros */
++#define MCF_DTIM0_DTMR        0xFC070000      /* DMA Timer Mode Register */
++#define MCF_DTIM0_DTXMR       0xFC070002      /* DMA Timer Extended Mode Register */
++#define MCF_DTIM0_DTER        0xFC070003      /* DMA Timer Event Register */
++#define MCF_DTIM0_DTRR        0xFC070004      /* DMA Timer Reference Register */
++#define MCF_DTIM0_DTCR        0xFC070008      /* DMA Timer Capture Register */
++#define MCF_DTIM0_DTCN        0xFC07000C      /* DMA Timer Counter Register */
++#define MCF_DTIM1_DTMR        0xFC074000      /* DMA Timer Mode Register */
++#define MCF_DTIM1_DTXMR       0xFC074002      /* DMA Timer Extended Mode Register */
++#define MCF_DTIM1_DTER        0xFC074003      /* DMA Timer Event Register */
++#define MCF_DTIM1_DTRR        0xFC074004      /* DMA Timer Reference Register */
++#define MCF_DTIM1_DTCR        0xFC074008      /* DMA Timer Capture Register */
++#define MCF_DTIM1_DTCN        0xFC07400C      /* DMA Timer Counter Register */
++#define MCF_DTIM2_DTMR        0xFC078000      /* DMA Timer Mode Register */
++#define MCF_DTIM2_DTXMR       0xFC078002      /* DMA Timer Extended Mode Register */
++#define MCF_DTIM2_DTER        0xFC078003      /* DMA Timer Event Register */
++#define MCF_DTIM2_DTRR        0xFC078004      /* DMA Timer Reference Register */
++#define MCF_DTIM2_DTCR        0xFC078008      /* DMA Timer Capture Register */
++#define MCF_DTIM2_DTCN        0xFC07800C      /* DMA Timer Counter Register */
++#define MCF_DTIM3_DTMR        0xFC07C000      /* DMA Timer Mode Register */
++#define MCF_DTIM3_DTXMR       0xFC07C002      /* DMA Timer Extended Mode Register */
++#define MCF_DTIM3_DTER        0xFC07C003      /* DMA Timer Event Register */
++#define MCF_DTIM3_DTRR        0xFC07C004      /* DMA Timer Reference Register */
++#define MCF_DTIM3_DTCR        0xFC07C008      /* DMA Timer Capture Register */
++#define MCF_DTIM3_DTCN        0xFC07C00C      /* DMA Timer Counter Register */
++
++/* Parameterized register read/write macros for multiple modules */
++#define MCF_DTIM_DTMR(x)      0xFC070000+((x)*0x4000)  /* DMA Timer Mode Register */
++#define MCF_DTIM_DTXMR(x)     0xFC070002+((x)*0x4000)  /* DMA Timer Extended Mode Register */
++#define MCF_DTIM_DTER(x)      0xFC070003+((x)*0x4000)  /* DMA Timer Event Register */
++#define MCF_DTIM_DTRR(x)      0xFC070004+((x)*0x4000)  /* DMA Timer Reference Register */
++#define MCF_DTIM_DTCR(x)      0xFC070008+((x)*0x4000)  /* DMA Timer Capture Register */
++#define MCF_DTIM_DTCN(x)      0xFC07000C+((x)*0x4000)  /* DMA Timer Counter Register */
++
++/* Bit definitions and macros for DTMR */
++#define MCF_DTIM_DTMR_RST     (0x0001)                /* Reset */
++#define MCF_DTIM_DTMR_CLK(x)  (((x)&0x0003)<<1)       /* Input clock source */
++#define MCF_DTIM_DTMR_FRR     (0x0008)                /* Free run/restart */
++#define MCF_DTIM_DTMR_ORRI    (0x0010)                /* Output reference request/interrupt enable */
++#define MCF_DTIM_DTMR_OM      (0x0020)                /* Output Mode */
++#define MCF_DTIM_DTMR_CE(x)   (((x)&0x0003)<<6)       /* Capture Edge */
++#define MCF_DTIM_DTMR_PS(x)   (((x)&0x00FF)<<8)       /* Prescaler value */
++#define MCF_DTIM_DTMR_RST_EN  (0x0001)
++#define MCF_DTIM_DTMR_RST_RST (0x0000)
++#define MCF_DTIM_DTMR_CE_ANY  (0x00C0)
++#define MCF_DTIM_DTMR_CE_FALL (0x0080)
++#define MCF_DTIM_DTMR_CE_RISE (0x0040)
++#define MCF_DTIM_DTMR_CE_NONE (0x0000)
++#define MCF_DTIM_DTMR_CLK_DTIN        (0x0006)
++#define MCF_DTIM_DTMR_CLK_DIV16       (0x0004)
++#define MCF_DTIM_DTMR_CLK_DIV1        (0x0002)
++#define MCF_DTIM_DTMR_CLK_STOP        (0x0000)
++
++/* Bit definitions and macros for DTXMR */
++#define MCF_DTIM_DTXMR_MODE16 (0x01)  /* Increment Mode */
++#define MCF_DTIM_DTXMR_DMAEN  (0x80)  /* DMA request */
++
++/* Bit definitions and macros for DTER */
++#define MCF_DTIM_DTER_CAP     (0x01)  /* Capture event */
++#define MCF_DTIM_DTER_REF     (0x02)  /* Output reference event */
++
++/* Interrupts used for system timers */
++#define MCFSIM_ICR_TIMER1       (0xFC048040+32)
++#define MCFSIM_ICR_TIMER2       (0xFC048040+33)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_DTIM_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_edma.h
+@@ -0,0 +1,1458 @@
++/*
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++#ifndef __MCF5445X_EDMA_H__
++#define __MCF5445X_EDMA_H__
++
++/*********************************************************************
++*
++* Enhanced DMA (EDMA)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_EDMA_CR                     MCF_REG32(0xFC044000)
++#define MCF_EDMA_ES                     MCF_REG32(0xFC044004)
++#define MCF_EDMA_ERQ                    MCF_REG16(0xFC04400E)
++#define MCF_EDMA_EEI                    MCF_REG16(0xFC044016)
++#define MCF_EDMA_SERQ                   MCF_REG08(0xFC044018)
++#define MCF_EDMA_CERQ                   MCF_REG08(0xFC044019)
++#define MCF_EDMA_SEEI                   MCF_REG08(0xFC04401A)
++#define MCF_EDMA_CEEI                   MCF_REG08(0xFC04401B)
++#define MCF_EDMA_CINT                   MCF_REG08(0xFC04401C)
++#define MCF_EDMA_CERR                   MCF_REG08(0xFC04401D)
++#define MCF_EDMA_SSRT                   MCF_REG08(0xFC04401E)
++#define MCF_EDMA_CDNE                   MCF_REG08(0xFC04401F)
++#define MCF_EDMA_INTR                   MCF_REG16(0xFC044026)
++#define MCF_EDMA_ERR                    MCF_REG16(0xFC04402E)
++#define MCF_EDMA_DCHPRI0                MCF_REG08(0xFC044100)
++#define MCF_EDMA_DCHPRI1                MCF_REG08(0xFC044101)
++#define MCF_EDMA_DCHPRI2                MCF_REG08(0xFC044102)
++#define MCF_EDMA_DCHPRI3                MCF_REG08(0xFC044103)
++#define MCF_EDMA_DCHPRI4                MCF_REG08(0xFC044104)
++#define MCF_EDMA_DCHPRI5                MCF_REG08(0xFC044105)
++#define MCF_EDMA_DCHPRI6                MCF_REG08(0xFC044106)
++#define MCF_EDMA_DCHPRI7                MCF_REG08(0xFC044107)
++#define MCF_EDMA_DCHPRI8                MCF_REG08(0xFC044108)
++#define MCF_EDMA_DCHPRI9                MCF_REG08(0xFC044109)
++#define MCF_EDMA_DCHPRI10               MCF_REG08(0xFC04410A)
++#define MCF_EDMA_DCHPRI11               MCF_REG08(0xFC04410B)
++#define MCF_EDMA_DCHPRI12               MCF_REG08(0xFC04410C)
++#define MCF_EDMA_DCHPRI13               MCF_REG08(0xFC04410D)
++#define MCF_EDMA_DCHPRI14               MCF_REG08(0xFC04410E)
++#define MCF_EDMA_DCHPRI15               MCF_REG08(0xFC04410F)
++#define MCF_EDMA_TCD0_SADDR             MCF_REG32(0xFC045000)
++#define MCF_EDMA_TCD0_ATTR              MCF_REG16(0xFC045004)
++#define MCF_EDMA_TCD0_SOFF              MCF_REG16(0xFC045006)
++#define MCF_EDMA_TCD0_NBYTES            MCF_REG32(0xFC045008)
++#define MCF_EDMA_TCD0_SLAST             MCF_REG32(0xFC04500C)
++#define MCF_EDMA_TCD0_DADDR             MCF_REG32(0xFC045010)
++#define MCF_EDMA_TCD0_CITER_ELINK       MCF_REG16(0xFC045014)
++#define MCF_EDMA_TCD0_CITER             MCF_REG16(0xFC045014)
++#define MCF_EDMA_TCD0_DOFF              MCF_REG16(0xFC045016)
++#define MCF_EDMA_TCD0_DLAST_SGA         MCF_REG32(0xFC045018)
++#define MCF_EDMA_TCD0_BITER_ELINK       MCF_REG16(0xFC04501C)
++#define MCF_EDMA_TCD0_BITER             MCF_REG16(0xFC04501C)
++#define MCF_EDMA_TCD0_CSR               MCF_REG16(0xFC04501E)
++#define MCF_EDMA_TCD1_SADDR             MCF_REG32(0xFC045020)
++#define MCF_EDMA_TCD1_ATTR              MCF_REG16(0xFC045024)
++#define MCF_EDMA_TCD1_SOFF              MCF_REG16(0xFC045026)
++#define MCF_EDMA_TCD1_NBYTES            MCF_REG32(0xFC045028)
++#define MCF_EDMA_TCD1_SLAST             MCF_REG32(0xFC04502C)
++#define MCF_EDMA_TCD1_DADDR             MCF_REG32(0xFC045030)
++#define MCF_EDMA_TCD1_CITER_ELINK       MCF_REG16(0xFC045034)
++#define MCF_EDMA_TCD1_CITER             MCF_REG16(0xFC045034)
++#define MCF_EDMA_TCD1_DOFF              MCF_REG16(0xFC045036)
++#define MCF_EDMA_TCD1_DLAST_SGA         MCF_REG32(0xFC045038)
++#define MCF_EDMA_TCD1_BITER             MCF_REG16(0xFC04503C)
++#define MCF_EDMA_TCD1_BITER_ELINK       MCF_REG16(0xFC04503C)
++#define MCF_EDMA_TCD1_CSR               MCF_REG16(0xFC04503E)
++#define MCF_EDMA_TCD2_SADDR             MCF_REG32(0xFC045040)
++#define MCF_EDMA_TCD2_ATTR              MCF_REG16(0xFC045044)
++#define MCF_EDMA_TCD2_SOFF              MCF_REG16(0xFC045046)
++#define MCF_EDMA_TCD2_NBYTES            MCF_REG32(0xFC045048)
++#define MCF_EDMA_TCD2_SLAST             MCF_REG32(0xFC04504C)
++#define MCF_EDMA_TCD2_DADDR             MCF_REG32(0xFC045050)
++#define MCF_EDMA_TCD2_CITER             MCF_REG16(0xFC045054)
++#define MCF_EDMA_TCD2_CITER_ELINK       MCF_REG16(0xFC045054)
++#define MCF_EDMA_TCD2_DOFF              MCF_REG16(0xFC045056)
++#define MCF_EDMA_TCD2_DLAST_SGA         MCF_REG32(0xFC045058)
++#define MCF_EDMA_TCD2_BITER_ELINK       MCF_REG16(0xFC04505C)
++#define MCF_EDMA_TCD2_BITER             MCF_REG16(0xFC04505C)
++#define MCF_EDMA_TCD2_CSR               MCF_REG16(0xFC04505E)
++#define MCF_EDMA_TCD3_SADDR             MCF_REG32(0xFC045060)
++#define MCF_EDMA_TCD3_ATTR              MCF_REG16(0xFC045064)
++#define MCF_EDMA_TCD3_SOFF              MCF_REG16(0xFC045066)
++#define MCF_EDMA_TCD3_NBYTES            MCF_REG32(0xFC045068)
++#define MCF_EDMA_TCD3_SLAST             MCF_REG32(0xFC04506C)
++#define MCF_EDMA_TCD3_DADDR             MCF_REG32(0xFC045070)
++#define MCF_EDMA_TCD3_CITER             MCF_REG16(0xFC045074)
++#define MCF_EDMA_TCD3_CITER_ELINK       MCF_REG16(0xFC045074)
++#define MCF_EDMA_TCD3_DOFF              MCF_REG16(0xFC045076)
++#define MCF_EDMA_TCD3_DLAST_SGA         MCF_REG32(0xFC045078)
++#define MCF_EDMA_TCD3_BITER_ELINK       MCF_REG16(0xFC04507C)
++#define MCF_EDMA_TCD3_BITER             MCF_REG16(0xFC04507C)
++#define MCF_EDMA_TCD3_CSR               MCF_REG16(0xFC04507E)
++#define MCF_EDMA_TCD4_SADDR             MCF_REG32(0xFC045080)
++#define MCF_EDMA_TCD4_ATTR              MCF_REG16(0xFC045084)
++#define MCF_EDMA_TCD4_SOFF              MCF_REG16(0xFC045086)
++#define MCF_EDMA_TCD4_NBYTES            MCF_REG32(0xFC045088)
++#define MCF_EDMA_TCD4_SLAST             MCF_REG32(0xFC04508C)
++#define MCF_EDMA_TCD4_DADDR             MCF_REG32(0xFC045090)
++#define MCF_EDMA_TCD4_CITER             MCF_REG16(0xFC045094)
++#define MCF_EDMA_TCD4_CITER_ELINK       MCF_REG16(0xFC045094)
++#define MCF_EDMA_TCD4_DOFF              MCF_REG16(0xFC045096)
++#define MCF_EDMA_TCD4_DLAST_SGA         MCF_REG32(0xFC045098)
++#define MCF_EDMA_TCD4_BITER             MCF_REG16(0xFC04509C)
++#define MCF_EDMA_TCD4_BITER_ELINK       MCF_REG16(0xFC04509C)
++#define MCF_EDMA_TCD4_CSR               MCF_REG16(0xFC04509E)
++#define MCF_EDMA_TCD5_SADDR             MCF_REG32(0xFC0450A0)
++#define MCF_EDMA_TCD5_ATTR              MCF_REG16(0xFC0450A4)
++#define MCF_EDMA_TCD5_SOFF              MCF_REG16(0xFC0450A6)
++#define MCF_EDMA_TCD5_NBYTES            MCF_REG32(0xFC0450A8)
++#define MCF_EDMA_TCD5_SLAST             MCF_REG32(0xFC0450AC)
++#define MCF_EDMA_TCD5_DADDR             MCF_REG32(0xFC0450B0)
++#define MCF_EDMA_TCD5_CITER             MCF_REG16(0xFC0450B4)
++#define MCF_EDMA_TCD5_CITER_ELINK       MCF_REG16(0xFC0450B4)
++#define MCF_EDMA_TCD5_DOFF              MCF_REG16(0xFC0450B6)
++#define MCF_EDMA_TCD5_DLAST_SGA         MCF_REG32(0xFC0450B8)
++#define MCF_EDMA_TCD5_BITER_ELINK       MCF_REG16(0xFC0450BC)
++#define MCF_EDMA_TCD5_BITER             MCF_REG16(0xFC0450BC)
++#define MCF_EDMA_TCD5_CSR               MCF_REG16(0xFC0450BE)
++#define MCF_EDMA_TCD6_SADDR             MCF_REG32(0xFC0450C0)
++#define MCF_EDMA_TCD6_ATTR              MCF_REG16(0xFC0450C4)
++#define MCF_EDMA_TCD6_SOFF              MCF_REG16(0xFC0450C6)
++#define MCF_EDMA_TCD6_NBYTES            MCF_REG32(0xFC0450C8)
++#define MCF_EDMA_TCD6_SLAST             MCF_REG32(0xFC0450CC)
++#define MCF_EDMA_TCD6_DADDR             MCF_REG32(0xFC0450D0)
++#define MCF_EDMA_TCD6_CITER             MCF_REG16(0xFC0450D4)
++#define MCF_EDMA_TCD6_CITER_ELINK       MCF_REG16(0xFC0450D4)
++#define MCF_EDMA_TCD6_DOFF              MCF_REG16(0xFC0450D6)
++#define MCF_EDMA_TCD6_DLAST_SGA         MCF_REG32(0xFC0450D8)
++#define MCF_EDMA_TCD6_BITER_ELINK       MCF_REG16(0xFC0450DC)
++#define MCF_EDMA_TCD6_BITER             MCF_REG16(0xFC0450DC)
++#define MCF_EDMA_TCD6_CSR               MCF_REG16(0xFC0450DE)
++#define MCF_EDMA_TCD7_SADDR             MCF_REG32(0xFC0450E0)
++#define MCF_EDMA_TCD7_ATTR              MCF_REG16(0xFC0450E4)
++#define MCF_EDMA_TCD7_SOFF              MCF_REG16(0xFC0450E6)
++#define MCF_EDMA_TCD7_NBYTES            MCF_REG32(0xFC0450E8)
++#define MCF_EDMA_TCD7_SLAST             MCF_REG32(0xFC0450EC)
++#define MCF_EDMA_TCD7_DADDR             MCF_REG32(0xFC0450F0)
++#define MCF_EDMA_TCD7_CITER             MCF_REG16(0xFC0450F4)
++#define MCF_EDMA_TCD7_CITER_ELINK       MCF_REG16(0xFC0450F4)
++#define MCF_EDMA_TCD7_DOFF              MCF_REG16(0xFC0450F6)
++#define MCF_EDMA_TCD7_DLAST_SGA         MCF_REG32(0xFC0450F8)
++#define MCF_EDMA_TCD7_BITER_ELINK       MCF_REG16(0xFC0450FC)
++#define MCF_EDMA_TCD7_BITER             MCF_REG16(0xFC0450FC)
++#define MCF_EDMA_TCD7_CSR               MCF_REG16(0xFC0450FE)
++#define MCF_EDMA_TCD8_SADDR             MCF_REG32(0xFC045100)
++#define MCF_EDMA_TCD8_ATTR              MCF_REG16(0xFC045104)
++#define MCF_EDMA_TCD8_SOFF              MCF_REG16(0xFC045106)
++#define MCF_EDMA_TCD8_NBYTES            MCF_REG32(0xFC045108)
++#define MCF_EDMA_TCD8_SLAST             MCF_REG32(0xFC04510C)
++#define MCF_EDMA_TCD8_DADDR             MCF_REG32(0xFC045110)
++#define MCF_EDMA_TCD8_CITER             MCF_REG16(0xFC045114)
++#define MCF_EDMA_TCD8_CITER_ELINK       MCF_REG16(0xFC045114)
++#define MCF_EDMA_TCD8_DOFF              MCF_REG16(0xFC045116)
++#define MCF_EDMA_TCD8_DLAST_SGA         MCF_REG32(0xFC045118)
++#define MCF_EDMA_TCD8_BITER_ELINK       MCF_REG16(0xFC04511C)
++#define MCF_EDMA_TCD8_BITER             MCF_REG16(0xFC04511C)
++#define MCF_EDMA_TCD8_CSR               MCF_REG16(0xFC04511E)
++#define MCF_EDMA_TCD9_SADDR             MCF_REG32(0xFC045120)
++#define MCF_EDMA_TCD9_ATTR              MCF_REG16(0xFC045124)
++#define MCF_EDMA_TCD9_SOFF              MCF_REG16(0xFC045126)
++#define MCF_EDMA_TCD9_NBYTES            MCF_REG32(0xFC045128)
++#define MCF_EDMA_TCD9_SLAST             MCF_REG32(0xFC04512C)
++#define MCF_EDMA_TCD9_DADDR             MCF_REG32(0xFC045130)
++#define MCF_EDMA_TCD9_CITER_ELINK       MCF_REG16(0xFC045134)
++#define MCF_EDMA_TCD9_CITER             MCF_REG16(0xFC045134)
++#define MCF_EDMA_TCD9_DOFF              MCF_REG16(0xFC045136)
++#define MCF_EDMA_TCD9_DLAST_SGA         MCF_REG32(0xFC045138)
++#define MCF_EDMA_TCD9_BITER_ELINK       MCF_REG16(0xFC04513C)
++#define MCF_EDMA_TCD9_BITER             MCF_REG16(0xFC04513C)
++#define MCF_EDMA_TCD9_CSR               MCF_REG16(0xFC04513E)
++#define MCF_EDMA_TCD10_SADDR            MCF_REG32(0xFC045140)
++#define MCF_EDMA_TCD10_ATTR             MCF_REG16(0xFC045144)
++#define MCF_EDMA_TCD10_SOFF             MCF_REG16(0xFC045146)
++#define MCF_EDMA_TCD10_NBYTES           MCF_REG32(0xFC045148)
++#define MCF_EDMA_TCD10_SLAST            MCF_REG32(0xFC04514C)
++#define MCF_EDMA_TCD10_DADDR            MCF_REG32(0xFC045150)
++#define MCF_EDMA_TCD10_CITER_ELINK      MCF_REG16(0xFC045154)
++#define MCF_EDMA_TCD10_CITER            MCF_REG16(0xFC045154)
++#define MCF_EDMA_TCD10_DOFF             MCF_REG16(0xFC045156)
++#define MCF_EDMA_TCD10_DLAST_SGA        MCF_REG32(0xFC045158)
++#define MCF_EDMA_TCD10_BITER            MCF_REG16(0xFC04515C)
++#define MCF_EDMA_TCD10_BITER_ELINK      MCF_REG16(0xFC04515C)
++#define MCF_EDMA_TCD10_CSR              MCF_REG16(0xFC04515E)
++#define MCF_EDMA_TCD11_SADDR            MCF_REG32(0xFC045160)
++#define MCF_EDMA_TCD11_ATTR             MCF_REG16(0xFC045164)
++#define MCF_EDMA_TCD11_SOFF             MCF_REG16(0xFC045166)
++#define MCF_EDMA_TCD11_NBYTES           MCF_REG32(0xFC045168)
++#define MCF_EDMA_TCD11_SLAST            MCF_REG32(0xFC04516C)
++#define MCF_EDMA_TCD11_DADDR            MCF_REG32(0xFC045170)
++#define MCF_EDMA_TCD11_CITER            MCF_REG16(0xFC045174)
++#define MCF_EDMA_TCD11_CITER_ELINK      MCF_REG16(0xFC045174)
++#define MCF_EDMA_TCD11_DOFF             MCF_REG16(0xFC045176)
++#define MCF_EDMA_TCD11_DLAST_SGA        MCF_REG32(0xFC045178)
++#define MCF_EDMA_TCD11_BITER            MCF_REG16(0xFC04517C)
++#define MCF_EDMA_TCD11_BITER_ELINK      MCF_REG16(0xFC04517C)
++#define MCF_EDMA_TCD11_CSR              MCF_REG16(0xFC04517E)
++#define MCF_EDMA_TCD12_SADDR            MCF_REG32(0xFC045180)
++#define MCF_EDMA_TCD12_ATTR             MCF_REG16(0xFC045184)
++#define MCF_EDMA_TCD12_SOFF             MCF_REG16(0xFC045186)
++#define MCF_EDMA_TCD12_NBYTES           MCF_REG32(0xFC045188)
++#define MCF_EDMA_TCD12_SLAST            MCF_REG32(0xFC04518C)
++#define MCF_EDMA_TCD12_DADDR            MCF_REG32(0xFC045190)
++#define MCF_EDMA_TCD12_CITER            MCF_REG16(0xFC045194)
++#define MCF_EDMA_TCD12_CITER_ELINK      MCF_REG16(0xFC045194)
++#define MCF_EDMA_TCD12_DOFF             MCF_REG16(0xFC045196)
++#define MCF_EDMA_TCD12_DLAST_SGA        MCF_REG32(0xFC045198)
++#define MCF_EDMA_TCD12_BITER            MCF_REG16(0xFC04519C)
++#define MCF_EDMA_TCD12_BITER_ELINK      MCF_REG16(0xFC04519C)
++#define MCF_EDMA_TCD12_CSR              MCF_REG16(0xFC04519E)
++#define MCF_EDMA_TCD13_SADDR            MCF_REG32(0xFC0451A0)
++#define MCF_EDMA_TCD13_ATTR             MCF_REG16(0xFC0451A4)
++#define MCF_EDMA_TCD13_SOFF             MCF_REG16(0xFC0451A6)
++#define MCF_EDMA_TCD13_NBYTES           MCF_REG32(0xFC0451A8)
++#define MCF_EDMA_TCD13_SLAST            MCF_REG32(0xFC0451AC)
++#define MCF_EDMA_TCD13_DADDR            MCF_REG32(0xFC0451B0)
++#define MCF_EDMA_TCD13_CITER_ELINK      MCF_REG16(0xFC0451B4)
++#define MCF_EDMA_TCD13_CITER            MCF_REG16(0xFC0451B4)
++#define MCF_EDMA_TCD13_DOFF             MCF_REG16(0xFC0451B6)
++#define MCF_EDMA_TCD13_DLAST_SGA        MCF_REG32(0xFC0451B8)
++#define MCF_EDMA_TCD13_BITER_ELINK      MCF_REG16(0xFC0451BC)
++#define MCF_EDMA_TCD13_BITER            MCF_REG16(0xFC0451BC)
++#define MCF_EDMA_TCD13_CSR              MCF_REG16(0xFC0451BE)
++#define MCF_EDMA_TCD14_SADDR            MCF_REG32(0xFC0451C0)
++#define MCF_EDMA_TCD14_ATTR             MCF_REG16(0xFC0451C4)
++#define MCF_EDMA_TCD14_SOFF             MCF_REG16(0xFC0451C6)
++#define MCF_EDMA_TCD14_NBYTES           MCF_REG32(0xFC0451C8)
++#define MCF_EDMA_TCD14_SLAST            MCF_REG32(0xFC0451CC)
++#define MCF_EDMA_TCD14_DADDR            MCF_REG32(0xFC0451D0)
++#define MCF_EDMA_TCD14_CITER            MCF_REG16(0xFC0451D4)
++#define MCF_EDMA_TCD14_CITER_ELINK      MCF_REG16(0xFC0451D4)
++#define MCF_EDMA_TCD14_DOFF             MCF_REG16(0xFC0451D6)
++#define MCF_EDMA_TCD14_DLAST_SGA        MCF_REG32(0xFC0451D8)
++#define MCF_EDMA_TCD14_BITER_ELINK      MCF_REG16(0xFC0451DC)
++#define MCF_EDMA_TCD14_BITER            MCF_REG16(0xFC0451DC)
++#define MCF_EDMA_TCD14_CSR              MCF_REG16(0xFC0451DE)
++#define MCF_EDMA_TCD15_SADDR            MCF_REG32(0xFC0451E0)
++#define MCF_EDMA_TCD15_ATTR             MCF_REG16(0xFC0451E4)
++#define MCF_EDMA_TCD15_SOFF             MCF_REG16(0xFC0451E6)
++#define MCF_EDMA_TCD15_NBYTES           MCF_REG32(0xFC0451E8)
++#define MCF_EDMA_TCD15_SLAST            MCF_REG32(0xFC0451EC)
++#define MCF_EDMA_TCD15_DADDR            MCF_REG32(0xFC0451F0)
++#define MCF_EDMA_TCD15_CITER_ELINK      MCF_REG16(0xFC0451F4)
++#define MCF_EDMA_TCD15_CITER            MCF_REG16(0xFC0451F4)
++#define MCF_EDMA_TCD15_DOFF             MCF_REG16(0xFC0451F6)
++#define MCF_EDMA_TCD15_DLAST_SGA        MCF_REG32(0xFC0451F8)
++#define MCF_EDMA_TCD15_BITER            MCF_REG16(0xFC0451FC)
++#define MCF_EDMA_TCD15_BITER_ELINK      MCF_REG16(0xFC0451FC)
++#define MCF_EDMA_TCD15_CSR              MCF_REG16(0xFC0451FE)
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_EDMA_DCHPRI(x)              MCF_REG08(0xFC044100+((x)*0x001))
++#define MCF_EDMA_TCD_SADDR(x)           MCF_REG32(0xFC045000+((x)*0x020))
++#define MCF_EDMA_TCD_ATTR(x)            MCF_REG16(0xFC045004+((x)*0x020))
++#define MCF_EDMA_TCD_SOFF(x)            MCF_REG16(0xFC045006+((x)*0x020))
++#define MCF_EDMA_TCD_NBYTES(x)          MCF_REG32(0xFC045008+((x)*0x020))
++#define MCF_EDMA_TCD_SLAST(x)           MCF_REG32(0xFC04500C+((x)*0x020))
++#define MCF_EDMA_TCD_DADDR(x)           MCF_REG32(0xFC045010+((x)*0x020))
++#define MCF_EDMA_TCD_CITER_ELINK(x)     MCF_REG16(0xFC045014+((x)*0x020))
++#define MCF_EDMA_TCD_CITER(x)           MCF_REG16(0xFC045014+((x)*0x020))
++#define MCF_EDMA_TCD_DOFF(x)            MCF_REG16(0xFC045016+((x)*0x020))
++#define MCF_EDMA_TCD_DLAST_SGA(x)       MCF_REG32(0xFC045018+((x)*0x020))
++#define MCF_EDMA_TCD_BITER_ELINK(x)     MCF_REG16(0xFC04501C+((x)*0x020))
++#define MCF_EDMA_TCD_BITER(x)           MCF_REG16(0xFC04501C+((x)*0x020))
++#define MCF_EDMA_TCD_CSR(x)             MCF_REG16(0xFC04501e +((x)*0x020))
++
++/* Bit definitions and macros for CR */
++#define MCF_EDMA_CR_EDBG        (0x00000002)
++#define MCF_EDMA_CR_ERCA        (0x00000004)
++
++/* Bit definitions and macros for ES */
++#define MCF_EDMA_ES_DBE         (0x00000001)
++#define MCF_EDMA_ES_SBE         (0x00000002)
++#define MCF_EDMA_ES_SGE         (0x00000004)
++#define MCF_EDMA_ES_NCE         (0x00000008)
++#define MCF_EDMA_ES_DOE         (0x00000010)
++#define MCF_EDMA_ES_DAE         (0x00000020)
++#define MCF_EDMA_ES_SOE         (0x00000040)
++#define MCF_EDMA_ES_SAE         (0x00000080)
++#define MCF_EDMA_ES_ERRCHN(x)   (((x)&0x0000000F)<<8)
++#define MCF_EDMA_ES_CPE         (0x00004000)
++#define MCF_EDMA_ES_VLD         (0x80000000)
++
++/* Bit definitions and macros for ERQ */
++#define MCF_EDMA_ERQ_ERQ0       (0x0001)
++#define MCF_EDMA_ERQ_ERQ1       (0x0002)
++#define MCF_EDMA_ERQ_ERQ2       (0x0004)
++#define MCF_EDMA_ERQ_ERQ3       (0x0008)
++#define MCF_EDMA_ERQ_ERQ4       (0x0010)
++#define MCF_EDMA_ERQ_ERQ5       (0x0020)
++#define MCF_EDMA_ERQ_ERQ6       (0x0040)
++#define MCF_EDMA_ERQ_ERQ7       (0x0080)
++#define MCF_EDMA_ERQ_ERQ8       (0x0100)
++#define MCF_EDMA_ERQ_ERQ9       (0x0200)
++#define MCF_EDMA_ERQ_ERQ10      (0x0400)
++#define MCF_EDMA_ERQ_ERQ11      (0x0800)
++#define MCF_EDMA_ERQ_ERQ12      (0x1000)
++#define MCF_EDMA_ERQ_ERQ13      (0x2000)
++#define MCF_EDMA_ERQ_ERQ14      (0x4000)
++#define MCF_EDMA_ERQ_ERQ15      (0x8000)
++
++/* Bit definitions and macros for EEI */
++#define MCF_EDMA_EEI_EEI0       (0x0001)
++#define MCF_EDMA_EEI_EEI1       (0x0002)
++#define MCF_EDMA_EEI_EEI2       (0x0004)
++#define MCF_EDMA_EEI_EEI3       (0x0008)
++#define MCF_EDMA_EEI_EEI4       (0x0010)
++#define MCF_EDMA_EEI_EEI5       (0x0020)
++#define MCF_EDMA_EEI_EEI6       (0x0040)
++#define MCF_EDMA_EEI_EEI7       (0x0080)
++#define MCF_EDMA_EEI_EEI8       (0x0100)
++#define MCF_EDMA_EEI_EEI9       (0x0200)
++#define MCF_EDMA_EEI_EEI10      (0x0400)
++#define MCF_EDMA_EEI_EEI11      (0x0800)
++#define MCF_EDMA_EEI_EEI12      (0x1000)
++#define MCF_EDMA_EEI_EEI13      (0x2000)
++#define MCF_EDMA_EEI_EEI14      (0x4000)
++#define MCF_EDMA_EEI_EEI15      (0x8000)
++
++/* Bit definitions and macros for SERQ */
++#define MCF_EDMA_SERQ_SERQ(x)   (((x)&0x0F))
++#define MCF_EDMA_SERQ_SAER      (0x40)
++
++/* Bit definitions and macros for CERQ */
++#define MCF_EDMA_CERQ_CERQ(x)   (((x)&0x0F))
++#define MCF_EDMA_CERQ_CAER      (0x40)
++
++/* Bit definitions and macros for SEEI */
++#define MCF_EDMA_SEEI_SEEI(x)   (((x)&0x0F))
++#define MCF_EDMA_SEEI_SAEE      (0x40)
++
++/* Bit definitions and macros for CEEI */
++#define MCF_EDMA_CEEI_CEEI(x)   (((x)&0x0F))
++#define MCF_EDMA_CEEI_CAEE      (0x40)
++
++/* Bit definitions and macros for CINT */
++#define MCF_EDMA_CINT_CINT(x)   (((x)&0x0F))
++#define MCF_EDMA_CINT_CAIR      (0x40)
++
++/* Bit definitions and macros for CERR */
++#define MCF_EDMA_CERR_CERR(x)   (((x)&0x0F))
++#define MCF_EDMA_CERR_CAER      (0x40)
++
++/* Bit definitions and macros for SSRT */
++#define MCF_EDMA_SSRT_SSRT(x)   (((x)&0x0F))
++#define MCF_EDMA_SSRT_SAST      (0x40)
++
++/* Bit definitions and macros for CDNE */
++#define MCF_EDMA_CDNE_CDNE(x)   (((x)&0x0F))
++#define MCF_EDMA_CDNE_CADN      (0x40)
++
++/* Bit definitions and macros for INTR */
++#define MCF_EDMA_INTR_INT0      (0x0001)
++#define MCF_EDMA_INTR_INT1      (0x0002)
++#define MCF_EDMA_INTR_INT2      (0x0004)
++#define MCF_EDMA_INTR_INT3      (0x0008)
++#define MCF_EDMA_INTR_INT4      (0x0010)
++#define MCF_EDMA_INTR_INT5      (0x0020)
++#define MCF_EDMA_INTR_INT6      (0x0040)
++#define MCF_EDMA_INTR_INT7      (0x0080)
++#define MCF_EDMA_INTR_INT8      (0x0100)
++#define MCF_EDMA_INTR_INT9      (0x0200)
++#define MCF_EDMA_INTR_INT10     (0x0400)
++#define MCF_EDMA_INTR_INT11     (0x0800)
++#define MCF_EDMA_INTR_INT12     (0x1000)
++#define MCF_EDMA_INTR_INT13     (0x2000)
++#define MCF_EDMA_INTR_INT14     (0x4000)
++#define MCF_EDMA_INTR_INT15     (0x8000)
++
++/* Bit definitions and macros for ERR */
++#define MCF_EDMA_ERR_ERR0       (0x0001)
++#define MCF_EDMA_ERR_ERR1       (0x0002)
++#define MCF_EDMA_ERR_ERR2       (0x0004)
++#define MCF_EDMA_ERR_ERR3       (0x0008)
++#define MCF_EDMA_ERR_ERR4       (0x0010)
++#define MCF_EDMA_ERR_ERR5       (0x0020)
++#define MCF_EDMA_ERR_ERR6       (0x0040)
++#define MCF_EDMA_ERR_ERR7       (0x0080)
++#define MCF_EDMA_ERR_ERR8       (0x0100)
++#define MCF_EDMA_ERR_ERR9       (0x0200)
++#define MCF_EDMA_ERR_ERR10      (0x0400)
++#define MCF_EDMA_ERR_ERR11      (0x0800)
++#define MCF_EDMA_ERR_ERR12      (0x1000)
++#define MCF_EDMA_ERR_ERR13      (0x2000)
++#define MCF_EDMA_ERR_ERR14      (0x4000)
++#define MCF_EDMA_ERR_ERR15      (0x8000)
++
++/* Bit definitions and macros for DCHPRI group */
++#define MCF_EDMA_DCHPRI_CHPRI(x)    (((x)&0x0F))
++#define MCF_EDMA_DCHPRI_ECP         (0x80)
++
++/* Bit definitions and macros for DCHPRI0 */
++#define MCF_EDMA_DCHPRI0_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI0_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI1 */
++#define MCF_EDMA_DCHPRI1_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI1_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI2 */
++#define MCF_EDMA_DCHPRI2_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI2_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI3 */
++#define MCF_EDMA_DCHPRI3_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI3_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI4 */
++#define MCF_EDMA_DCHPRI4_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI4_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI5 */
++#define MCF_EDMA_DCHPRI5_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI5_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI6 */
++#define MCF_EDMA_DCHPRI6_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI6_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI7 */
++#define MCF_EDMA_DCHPRI7_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI7_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI8 */
++#define MCF_EDMA_DCHPRI8_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI8_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI9 */
++#define MCF_EDMA_DCHPRI9_CHPRI(x)   (((x)&0x0F))
++#define MCF_EDMA_DCHPRI9_ECP        (0x80)
++
++/* Bit definitions and macros for DCHPRI10 */
++#define MCF_EDMA_DCHPRI10_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI10_ECP           (0x80)
++
++/* Bit definitions and macros for DCHPRI11 */
++#define MCF_EDMA_DCHPRI11_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI11_ECP           (0x80)
++
++/* Bit definitions and macros for DCHPRI12 */
++#define MCF_EDMA_DCHPRI12_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI12_ECP           (0x80)
++
++/* Bit definitions and macros for DCHPRI13 */
++#define MCF_EDMA_DCHPRI13_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI13_ECP           (0x80)
++
++/* Bit definitions and macros for DCHPRI14 */
++#define MCF_EDMA_DCHPRI14_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI14_ECP           (0x80)
++
++/* Bit definitions and macros for DCHPRI15 */
++#define MCF_EDMA_DCHPRI15_CHPRI(x)      (((x)&0x0F))
++#define MCF_EDMA_DCHPRI15_ECP           (0x80)
++
++/* Bit definitions and macros for TCD_SADDR group */
++#define MCF_EDMA_TCD_SADDR_SADDR(x)     (x)
++
++/* Bit definitions and macros for TCD0_SADDR */
++#define MCF_EDMA_TCD0_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD_ATTR group */
++#define MCF_EDMA_TCD_ATTR_DSIZE(x)          (((x)&0x0007))
++#define MCF_EDMA_TCD_ATTR_DMOD(x)           (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD_ATTR_SSIZE(x)          (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD_ATTR_SMOD(x)           (((x)&0x001F)<<11)
++#define MCF_EDMA_TCD_ATTR_SSIZE_8BIT        (0x0000)
++#define MCF_EDMA_TCD_ATTR_SSIZE_16BIT       (0x0100)
++#define MCF_EDMA_TCD_ATTR_SSIZE_32BIT       (0x0200)
++#define MCF_EDMA_TCD_ATTR_SSIZE_16BYTE      (0x0400)
++#define MCF_EDMA_TCD_ATTR_DSIZE_8BIT        (0x0000)
++#define MCF_EDMA_TCD_ATTR_DSIZE_16BIT       (0x0001)
++#define MCF_EDMA_TCD_ATTR_DSIZE_32BIT       (0x0002)
++#define MCF_EDMA_TCD_ATTR_DSIZE_16BYTE      (0x0004)
++
++/* Bit definitions and macros for TCD0_ATTR */
++#define MCF_EDMA_TCD0_ATTR_DSIZE(x)         (((x)&0x0007))
++#define MCF_EDMA_TCD0_ATTR_DMOD(x)          (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD0_ATTR_SSIZE(x)         (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD0_ATTR_SMOD(x)          (((x)&0x001F)<<11)
++#define MCF_EDMA_TCD0_ATTR_SSIZE_8BIT       (0x0000)
++#define MCF_EDMA_TCD0_ATTR_SSIZE_16BIT      (0x0100)
++#define MCF_EDMA_TCD0_ATTR_SSIZE_32BIT      (0x0200)
++#define MCF_EDMA_TCD0_ATTR_SSIZE_16BYTE     (0x0400)
++#define MCF_EDMA_TCD0_ATTR_DSIZE_8BIT       (0x0000)
++#define MCF_EDMA_TCD0_ATTR_DSIZE_16BIT      (0x0001)
++#define MCF_EDMA_TCD0_ATTR_DSIZE_32BIT      (0x0002)
++#define MCF_EDMA_TCD0_ATTR_DSIZE_16BYTE     (0x0004)
++
++/* Bit definitions and macros for TCD_SOFF group */
++#define MCF_EDMA_TCD_SOFF_SOFF(x)   (x)
++
++/* Bit definitions and macros for TCD0_SOFF */
++#define MCF_EDMA_TCD0_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD_NBYTES group */
++#define MCF_EDMA_TCD_NBYTES_NBYTES(x)   (x)
++
++/* Bit definitions and macros for TCD0_NBYTES */
++#define MCF_EDMA_TCD0_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD_SLAST group */
++#define MCF_EDMA_TCD_SLAST_SLAST(x)     (x)
++
++/* Bit definitions and macros for TCD0_SLAST */
++#define MCF_EDMA_TCD0_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD_DADDR group */
++#define MCF_EDMA_TCD_DADDR_DADDR(x)     (x)
++
++/* Bit definitions and macros for TCD0_DADDR */
++#define MCF_EDMA_TCD0_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD_CITER_ELINK group */
++#define MCF_EDMA_TCD_CITER_ELINK_CITER(x)       (((x)&0x01FF))
++#define MCF_EDMA_TCD_CITER_ELINK_LINKCH(x)      (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD_CITER_ELINK_E_LINK         (0x8000)
++
++/* Bit definitions and macros for TCD0_CITER_ELINK */
++#define MCF_EDMA_TCD0_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD0_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD0_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD_CITER group */
++#define MCF_EDMA_TCD_CITER_CITER(x)     (((x)&0x7FFF))
++#define MCF_EDMA_TCD_CITER_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD0_CITER */
++#define MCF_EDMA_TCD0_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD0_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD_DOFF group */
++#define MCF_EDMA_TCD_DOFF_DOFF(x)   (x)
++
++/* Bit definitions and macros for TCD0_DOFF */
++#define MCF_EDMA_TCD0_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD_DLAST_SGA group */
++#define MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(x)     (x)
++
++/* Bit definitions and macros for TCD0_DLAST_SGA */
++#define MCF_EDMA_TCD0_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD_BITER_ELINK group */
++#define MCF_EDMA_TCD_BITER_ELINK_BITER(x)       (((x)&0x01FF))
++#define MCF_EDMA_TCD_BITER_ELINK_LINKCH(x)      (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD_BITER_ELINK_E_LINK         (0x8000)
++
++/* Bit definitions and macros for TCD0_BITER_ELINK */
++#define MCF_EDMA_TCD0_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD0_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD0_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD_BITER group */
++#define MCF_EDMA_TCD_BITER_BITER(x)     (((x)&0x7FFF))
++#define MCF_EDMA_TCD_BITER_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD0_BITER */
++#define MCF_EDMA_TCD0_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD0_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD_CSR group */
++#define MCF_EDMA_TCD_CSR_START              (0x0001)
++#define MCF_EDMA_TCD_CSR_INT_MAJOR          (0x0002)
++#define MCF_EDMA_TCD_CSR_INT_HALF           (0x0004)
++#define MCF_EDMA_TCD_CSR_D_REQ              (0x0008)
++#define MCF_EDMA_TCD_CSR_E_SG               (0x0010)
++#define MCF_EDMA_TCD_CSR_E_LINK             (0x0020)
++#define MCF_EDMA_TCD_CSR_ACTIVE             (0x0040)
++#define MCF_EDMA_TCD_CSR_DONE               (0x0080)
++#define MCF_EDMA_TCD_CSR_LINKCH(x)          (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD_CSR_BWC(x)             (((x)&0x0003)<<14)
++#define MCF_EDMA_TCD_CSR_BWC_NO_STALL       (0x0000)
++#define MCF_EDMA_TCD_CSR_BWC_4CYC_STALL     (0x8000)
++#define MCF_EDMA_TCD_CSR_BWC_8CYC_STALL     (0xC000)
++
++/* Bit definitions and macros for TCD0_CSR */
++#define MCF_EDMA_TCD0_CSR_START             (0x0001)
++#define MCF_EDMA_TCD0_CSR_INT_MAJOR         (0x0002)
++#define MCF_EDMA_TCD0_CSR_INT_HALF          (0x0004)
++#define MCF_EDMA_TCD0_CSR_D_REQ             (0x0008)
++#define MCF_EDMA_TCD0_CSR_E_SG              (0x0010)
++#define MCF_EDMA_TCD0_CSR_E_LINK            (0x0020)
++#define MCF_EDMA_TCD0_CSR_ACTIVE            (0x0040)
++#define MCF_EDMA_TCD0_CSR_DONE              (0x0080)
++#define MCF_EDMA_TCD0_CSR_LINKCH(x)         (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD0_CSR_BWC(x)            (((x)&0x0003)<<14)
++#define MCF_EDMA_TCD0_CSR_BWC_NO_STALL      (0x0000)
++#define MCF_EDMA_TCD0_CSR_BWC_4CYC_STALL    (0x8000)
++#define MCF_EDMA_TCD0_CSR_BWC_8CYC_STALL    (0xC000)
++
++/* Bit definitions and macros for TCD1_SADDR */
++#define MCF_EDMA_TCD1_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD1_ATTR */
++#define MCF_EDMA_TCD1_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD1_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD1_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD1_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD1_SOFF */
++#define MCF_EDMA_TCD1_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD1_NBYTES */
++#define MCF_EDMA_TCD1_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD1_SLAST */
++#define MCF_EDMA_TCD1_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD1_DADDR */
++#define MCF_EDMA_TCD1_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD1_CITER_ELINK */
++#define MCF_EDMA_TCD1_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD1_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD1_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD1_CITER */
++#define MCF_EDMA_TCD1_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD1_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD1_DOFF */
++#define MCF_EDMA_TCD1_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD1_DLAST_SGA */
++#define MCF_EDMA_TCD1_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD1_BITER */
++#define MCF_EDMA_TCD1_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD1_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD1_BITER_ELINK */
++#define MCF_EDMA_TCD1_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD1_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD1_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD1_CSR */
++#define MCF_EDMA_TCD1_CSR_START         (0x0001)
++#define MCF_EDMA_TCD1_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD1_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD1_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD1_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD1_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD1_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD1_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD1_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD1_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD2_SADDR */
++#define MCF_EDMA_TCD2_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD2_ATTR */
++#define MCF_EDMA_TCD2_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD2_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD2_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD2_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD2_SOFF */
++#define MCF_EDMA_TCD2_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD2_NBYTES */
++#define MCF_EDMA_TCD2_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD2_SLAST */
++#define MCF_EDMA_TCD2_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD2_DADDR */
++#define MCF_EDMA_TCD2_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD2_CITER */
++#define MCF_EDMA_TCD2_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD2_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD2_CITER_ELINK */
++#define MCF_EDMA_TCD2_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD2_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD2_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD2_DOFF */
++#define MCF_EDMA_TCD2_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD2_DLAST_SGA */
++#define MCF_EDMA_TCD2_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD2_BITER_ELINK */
++#define MCF_EDMA_TCD2_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD2_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD2_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD2_BITER */
++#define MCF_EDMA_TCD2_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD2_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD2_CSR */
++#define MCF_EDMA_TCD2_CSR_START         (0x0001)
++#define MCF_EDMA_TCD2_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD2_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD2_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD2_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD2_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD2_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD2_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD2_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD2_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD3_SADDR */
++#define MCF_EDMA_TCD3_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD3_ATTR */
++#define MCF_EDMA_TCD3_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD3_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD3_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD3_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD3_SOFF */
++#define MCF_EDMA_TCD3_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD3_NBYTES */
++#define MCF_EDMA_TCD3_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD3_SLAST */
++#define MCF_EDMA_TCD3_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD3_DADDR */
++#define MCF_EDMA_TCD3_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD3_CITER */
++#define MCF_EDMA_TCD3_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD3_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD3_CITER_ELINK */
++#define MCF_EDMA_TCD3_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD3_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD3_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD3_DOFF */
++#define MCF_EDMA_TCD3_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD3_DLAST_SGA */
++#define MCF_EDMA_TCD3_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD3_BITER_ELINK */
++#define MCF_EDMA_TCD3_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD3_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD3_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD3_BITER */
++#define MCF_EDMA_TCD3_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD3_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD3_CSR */
++#define MCF_EDMA_TCD3_CSR_START         (0x0001)
++#define MCF_EDMA_TCD3_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD3_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD3_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD3_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD3_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD3_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD3_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD3_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD3_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD4_SADDR */
++#define MCF_EDMA_TCD4_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD4_ATTR */
++#define MCF_EDMA_TCD4_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD4_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD4_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD4_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD4_SOFF */
++#define MCF_EDMA_TCD4_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD4_NBYTES */
++#define MCF_EDMA_TCD4_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD4_SLAST */
++#define MCF_EDMA_TCD4_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD4_DADDR */
++#define MCF_EDMA_TCD4_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD4_CITER */
++#define MCF_EDMA_TCD4_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD4_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD4_CITER_ELINK */
++#define MCF_EDMA_TCD4_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD4_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD4_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD4_DOFF */
++#define MCF_EDMA_TCD4_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD4_DLAST_SGA */
++#define MCF_EDMA_TCD4_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD4_BITER */
++#define MCF_EDMA_TCD4_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD4_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD4_BITER_ELINK */
++#define MCF_EDMA_TCD4_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD4_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD4_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD4_CSR */
++#define MCF_EDMA_TCD4_CSR_START         (0x0001)
++#define MCF_EDMA_TCD4_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD4_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD4_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD4_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD4_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD4_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD4_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD4_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD4_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD5_SADDR */
++#define MCF_EDMA_TCD5_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD5_ATTR */
++#define MCF_EDMA_TCD5_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD5_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD5_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD5_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD5_SOFF */
++#define MCF_EDMA_TCD5_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD5_NBYTES */
++#define MCF_EDMA_TCD5_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD5_SLAST */
++#define MCF_EDMA_TCD5_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD5_DADDR */
++#define MCF_EDMA_TCD5_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD5_CITER */
++#define MCF_EDMA_TCD5_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD5_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD5_CITER_ELINK */
++#define MCF_EDMA_TCD5_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD5_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD5_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD5_DOFF */
++#define MCF_EDMA_TCD5_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD5_DLAST_SGA */
++#define MCF_EDMA_TCD5_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD5_BITER_ELINK */
++#define MCF_EDMA_TCD5_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD5_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD5_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD5_BITER */
++#define MCF_EDMA_TCD5_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD5_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD5_CSR */
++#define MCF_EDMA_TCD5_CSR_START         (0x0001)
++#define MCF_EDMA_TCD5_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD5_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD5_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD5_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD5_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD5_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD5_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD5_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD5_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD6_SADDR */
++#define MCF_EDMA_TCD6_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD6_ATTR */
++#define MCF_EDMA_TCD6_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD6_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD6_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD6_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD6_SOFF */
++#define MCF_EDMA_TCD6_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD6_NBYTES */
++#define MCF_EDMA_TCD6_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD6_SLAST */
++#define MCF_EDMA_TCD6_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD6_DADDR */
++#define MCF_EDMA_TCD6_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD6_CITER */
++#define MCF_EDMA_TCD6_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD6_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD6_CITER_ELINK */
++#define MCF_EDMA_TCD6_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD6_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD6_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD6_DOFF */
++#define MCF_EDMA_TCD6_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD6_DLAST_SGA */
++#define MCF_EDMA_TCD6_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD6_BITER_ELINK */
++#define MCF_EDMA_TCD6_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD6_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD6_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD6_BITER */
++#define MCF_EDMA_TCD6_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD6_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD6_CSR */
++#define MCF_EDMA_TCD6_CSR_START         (0x0001)
++#define MCF_EDMA_TCD6_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD6_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD6_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD6_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD6_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD6_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD6_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD6_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD6_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD7_SADDR */
++#define MCF_EDMA_TCD7_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD7_ATTR */
++#define MCF_EDMA_TCD7_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD7_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD7_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD7_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD7_SOFF */
++#define MCF_EDMA_TCD7_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD7_NBYTES */
++#define MCF_EDMA_TCD7_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD7_SLAST */
++#define MCF_EDMA_TCD7_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD7_DADDR */
++#define MCF_EDMA_TCD7_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD7_CITER */
++#define MCF_EDMA_TCD7_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD7_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD7_CITER_ELINK */
++#define MCF_EDMA_TCD7_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD7_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD7_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD7_DOFF */
++#define MCF_EDMA_TCD7_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD7_DLAST_SGA */
++#define MCF_EDMA_TCD7_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD7_BITER_ELINK */
++#define MCF_EDMA_TCD7_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD7_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD7_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD7_BITER */
++#define MCF_EDMA_TCD7_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD7_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD7_CSR */
++#define MCF_EDMA_TCD7_CSR_START         (0x0001)
++#define MCF_EDMA_TCD7_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD7_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD7_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD7_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD7_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD7_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD7_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD7_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD7_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD8_SADDR */
++#define MCF_EDMA_TCD8_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD8_ATTR */
++#define MCF_EDMA_TCD8_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD8_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD8_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD8_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD8_SOFF */
++#define MCF_EDMA_TCD8_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD8_NBYTES */
++#define MCF_EDMA_TCD8_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD8_SLAST */
++#define MCF_EDMA_TCD8_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD8_DADDR */
++#define MCF_EDMA_TCD8_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD8_CITER */
++#define MCF_EDMA_TCD8_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD8_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD8_CITER_ELINK */
++#define MCF_EDMA_TCD8_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD8_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD8_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD8_DOFF */
++#define MCF_EDMA_TCD8_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD8_DLAST_SGA */
++#define MCF_EDMA_TCD8_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD8_BITER_ELINK */
++#define MCF_EDMA_TCD8_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD8_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD8_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD8_BITER */
++#define MCF_EDMA_TCD8_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD8_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD8_CSR */
++#define MCF_EDMA_TCD8_CSR_START         (0x0001)
++#define MCF_EDMA_TCD8_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD8_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD8_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD8_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD8_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD8_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD8_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD8_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD8_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD9_SADDR */
++#define MCF_EDMA_TCD9_SADDR_SADDR(x)    (x)
++
++/* Bit definitions and macros for TCD9_ATTR */
++#define MCF_EDMA_TCD9_ATTR_DSIZE(x)     (((x)&0x0007))
++#define MCF_EDMA_TCD9_ATTR_DMOD(x)      (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD9_ATTR_SSIZE(x)     (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD9_ATTR_SMOD(x)      (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD9_SOFF */
++#define MCF_EDMA_TCD9_SOFF_SOFF(x)      (x)
++
++/* Bit definitions and macros for TCD9_NBYTES */
++#define MCF_EDMA_TCD9_NBYTES_NBYTES(x)      (x)
++
++/* Bit definitions and macros for TCD9_SLAST */
++#define MCF_EDMA_TCD9_SLAST_SLAST(x)    (x)
++
++/* Bit definitions and macros for TCD9_DADDR */
++#define MCF_EDMA_TCD9_DADDR_DADDR(x)    (x)
++
++/* Bit definitions and macros for TCD9_CITER_ELINK */
++#define MCF_EDMA_TCD9_CITER_ELINK_CITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD9_CITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD9_CITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD9_CITER */
++#define MCF_EDMA_TCD9_CITER_CITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD9_CITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD9_DOFF */
++#define MCF_EDMA_TCD9_DOFF_DOFF(x)      (x)
++
++/* Bit definitions and macros for TCD9_DLAST_SGA */
++#define MCF_EDMA_TCD9_DLAST_SGA_DLAST_SGA(x)    (x)
++
++/* Bit definitions and macros for TCD9_BITER_ELINK */
++#define MCF_EDMA_TCD9_BITER_ELINK_BITER(x)      (((x)&0x01FF))
++#define MCF_EDMA_TCD9_BITER_ELINK_LINKCH(x)     (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD9_BITER_ELINK_E_LINK        (0x8000)
++
++/* Bit definitions and macros for TCD9_BITER */
++#define MCF_EDMA_TCD9_BITER_BITER(x)    (((x)&0x7FFF))
++#define MCF_EDMA_TCD9_BITER_E_LINK      (0x8000)
++
++/* Bit definitions and macros for TCD9_CSR */
++#define MCF_EDMA_TCD9_CSR_START         (0x0001)
++#define MCF_EDMA_TCD9_CSR_INT_MAJOR     (0x0002)
++#define MCF_EDMA_TCD9_CSR_INT_HALF      (0x0004)
++#define MCF_EDMA_TCD9_CSR_D_REQ         (0x0008)
++#define MCF_EDMA_TCD9_CSR_E_SG          (0x0010)
++#define MCF_EDMA_TCD9_CSR_E_LINK        (0x0020)
++#define MCF_EDMA_TCD9_CSR_ACTIVE        (0x0040)
++#define MCF_EDMA_TCD9_CSR_DONE          (0x0080)
++#define MCF_EDMA_TCD9_CSR_LINKCH(x)     (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD9_CSR_BWC(x)        (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD10_SADDR */
++#define MCF_EDMA_TCD10_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD10_ATTR */
++#define MCF_EDMA_TCD10_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD10_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD10_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD10_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD10_SOFF */
++#define MCF_EDMA_TCD10_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD10_NBYTES */
++#define MCF_EDMA_TCD10_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD10_SLAST */
++#define MCF_EDMA_TCD10_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD10_DADDR */
++#define MCF_EDMA_TCD10_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD10_CITER_ELINK */
++#define MCF_EDMA_TCD10_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD10_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD10_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD10_CITER */
++#define MCF_EDMA_TCD10_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD10_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD10_DOFF */
++#define MCF_EDMA_TCD10_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD10_DLAST_SGA */
++#define MCF_EDMA_TCD10_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD10_BITER */
++#define MCF_EDMA_TCD10_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD10_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD10_BITER_ELINK */
++#define MCF_EDMA_TCD10_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD10_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD10_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD10_CSR */
++#define MCF_EDMA_TCD10_CSR_START        (0x0001)
++#define MCF_EDMA_TCD10_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD10_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD10_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD10_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD10_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD10_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD10_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD10_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD10_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD11_SADDR */
++#define MCF_EDMA_TCD11_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD11_ATTR */
++#define MCF_EDMA_TCD11_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD11_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD11_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD11_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD11_SOFF */
++#define MCF_EDMA_TCD11_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD11_NBYTES */
++#define MCF_EDMA_TCD11_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD11_SLAST */
++#define MCF_EDMA_TCD11_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD11_DADDR */
++#define MCF_EDMA_TCD11_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD11_CITER */
++#define MCF_EDMA_TCD11_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD11_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD11_CITER_ELINK */
++#define MCF_EDMA_TCD11_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD11_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD11_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD11_DOFF */
++#define MCF_EDMA_TCD11_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD11_DLAST_SGA */
++#define MCF_EDMA_TCD11_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD11_BITER */
++#define MCF_EDMA_TCD11_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD11_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD11_BITER_ELINK */
++#define MCF_EDMA_TCD11_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD11_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD11_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD11_CSR */
++#define MCF_EDMA_TCD11_CSR_START        (0x0001)
++#define MCF_EDMA_TCD11_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD11_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD11_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD11_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD11_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD11_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD11_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD11_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD11_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD12_SADDR */
++#define MCF_EDMA_TCD12_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD12_ATTR */
++#define MCF_EDMA_TCD12_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD12_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD12_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD12_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD12_SOFF */
++#define MCF_EDMA_TCD12_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD12_NBYTES */
++#define MCF_EDMA_TCD12_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD12_SLAST */
++#define MCF_EDMA_TCD12_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD12_DADDR */
++#define MCF_EDMA_TCD12_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD12_CITER */
++#define MCF_EDMA_TCD12_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD12_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD12_CITER_ELINK */
++#define MCF_EDMA_TCD12_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD12_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD12_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD12_DOFF */
++#define MCF_EDMA_TCD12_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD12_DLAST_SGA */
++#define MCF_EDMA_TCD12_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD12_BITER */
++#define MCF_EDMA_TCD12_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD12_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD12_BITER_ELINK */
++#define MCF_EDMA_TCD12_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD12_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD12_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD12_CSR */
++#define MCF_EDMA_TCD12_CSR_START        (0x0001)
++#define MCF_EDMA_TCD12_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD12_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD12_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD12_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD12_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD12_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD12_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD12_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD12_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD13_SADDR */
++#define MCF_EDMA_TCD13_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD13_ATTR */
++#define MCF_EDMA_TCD13_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD13_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD13_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD13_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD13_SOFF */
++#define MCF_EDMA_TCD13_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD13_NBYTES */
++#define MCF_EDMA_TCD13_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD13_SLAST */
++#define MCF_EDMA_TCD13_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD13_DADDR */
++#define MCF_EDMA_TCD13_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD13_CITER_ELINK */
++#define MCF_EDMA_TCD13_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD13_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD13_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD13_CITER */
++#define MCF_EDMA_TCD13_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD13_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD13_DOFF */
++#define MCF_EDMA_TCD13_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD13_DLAST_SGA */
++#define MCF_EDMA_TCD13_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD13_BITER_ELINK */
++#define MCF_EDMA_TCD13_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD13_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD13_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD13_BITER */
++#define MCF_EDMA_TCD13_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD13_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD13_CSR */
++#define MCF_EDMA_TCD13_CSR_START        (0x0001)
++#define MCF_EDMA_TCD13_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD13_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD13_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD13_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD13_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD13_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD13_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD13_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD13_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD14_SADDR */
++#define MCF_EDMA_TCD14_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD14_ATTR */
++#define MCF_EDMA_TCD14_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD14_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD14_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD14_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD14_SOFF */
++#define MCF_EDMA_TCD14_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD14_NBYTES */
++#define MCF_EDMA_TCD14_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD14_SLAST */
++#define MCF_EDMA_TCD14_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD14_DADDR */
++#define MCF_EDMA_TCD14_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD14_CITER */
++#define MCF_EDMA_TCD14_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD14_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD14_CITER_ELINK */
++#define MCF_EDMA_TCD14_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD14_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD14_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD14_DOFF */
++#define MCF_EDMA_TCD14_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD14_DLAST_SGA */
++#define MCF_EDMA_TCD14_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD14_BITER_ELINK */
++#define MCF_EDMA_TCD14_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD14_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD14_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD14_BITER */
++#define MCF_EDMA_TCD14_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD14_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD14_CSR */
++#define MCF_EDMA_TCD14_CSR_START        (0x0001)
++#define MCF_EDMA_TCD14_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD14_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD14_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD14_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD14_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD14_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD14_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD14_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD14_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/* Bit definitions and macros for TCD15_SADDR */
++#define MCF_EDMA_TCD15_SADDR_SADDR(x)   (x)
++
++/* Bit definitions and macros for TCD15_ATTR */
++#define MCF_EDMA_TCD15_ATTR_DSIZE(x)    (((x)&0x0007))
++#define MCF_EDMA_TCD15_ATTR_DMOD(x)     (((x)&0x001F)<<3)
++#define MCF_EDMA_TCD15_ATTR_SSIZE(x)    (((x)&0x0007)<<8)
++#define MCF_EDMA_TCD15_ATTR_SMOD(x)     (((x)&0x001F)<<11)
++
++/* Bit definitions and macros for TCD15_SOFF */
++#define MCF_EDMA_TCD15_SOFF_SOFF(x)     (x)
++
++/* Bit definitions and macros for TCD15_NBYTES */
++#define MCF_EDMA_TCD15_NBYTES_NBYTES(x)     (x)
++
++/* Bit definitions and macros for TCD15_SLAST */
++#define MCF_EDMA_TCD15_SLAST_SLAST(x)   (x)
++
++/* Bit definitions and macros for TCD15_DADDR */
++#define MCF_EDMA_TCD15_DADDR_DADDR(x)   (x)
++
++/* Bit definitions and macros for TCD15_CITER_ELINK */
++#define MCF_EDMA_TCD15_CITER_ELINK_CITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD15_CITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD15_CITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD15_CITER */
++#define MCF_EDMA_TCD15_CITER_CITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD15_CITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD15_DOFF */
++#define MCF_EDMA_TCD15_DOFF_DOFF(x)     (x)
++
++/* Bit definitions and macros for TCD15_DLAST_SGA */
++#define MCF_EDMA_TCD15_DLAST_SGA_DLAST_SGA(x)   (x)
++
++/* Bit definitions and macros for TCD15_BITER */
++#define MCF_EDMA_TCD15_BITER_BITER(x)   (((x)&0x7FFF))
++#define MCF_EDMA_TCD15_BITER_E_LINK     (0x8000)
++
++/* Bit definitions and macros for TCD15_BITER_ELINK */
++#define MCF_EDMA_TCD15_BITER_ELINK_BITER(x)     (((x)&0x01FF))
++#define MCF_EDMA_TCD15_BITER_ELINK_LINKCH(x)    (((x)&0x003F)<<9)
++#define MCF_EDMA_TCD15_BITER_ELINK_E_LINK       (0x8000)
++
++/* Bit definitions and macros for TCD15_CSR */
++#define MCF_EDMA_TCD15_CSR_START        (0x0001)
++#define MCF_EDMA_TCD15_CSR_INT_MAJOR    (0x0002)
++#define MCF_EDMA_TCD15_CSR_INT_HALF     (0x0004)
++#define MCF_EDMA_TCD15_CSR_D_REQ        (0x0008)
++#define MCF_EDMA_TCD15_CSR_E_SG         (0x0010)
++#define MCF_EDMA_TCD15_CSR_E_LINK       (0x0020)
++#define MCF_EDMA_TCD15_CSR_ACTIVE       (0x0040)
++#define MCF_EDMA_TCD15_CSR_DONE         (0x0080)
++#define MCF_EDMA_TCD15_CSR_LINKCH(x)    (((x)&0x003F)<<8)
++#define MCF_EDMA_TCD15_CSR_BWC(x)       (((x)&0x0003)<<14)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_EDMA_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_eport.h
+@@ -0,0 +1,117 @@
++/*
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_EPORT_H__
++#define __MCF5445X_EPORT_H__
++
++/*********************************************************************
++*
++* Edge Port Module (EPORT)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_EPORT_EPPAR         MCF_REG16(0xFC094000)
++#define MCF_EPORT_EPDDR         MCF_REG08(0xFC094002)
++#define MCF_EPORT_EPIER         MCF_REG08(0xFC094003)
++#define MCF_EPORT_EPDR          MCF_REG08(0xFC094004)
++#define MCF_EPORT_EPPDR         MCF_REG08(0xFC094005)
++#define MCF_EPORT_EPFR          MCF_REG08(0xFC094006)
++
++/* Bit definitions and macros for EPPAR */
++#define MCF_EPORT_EPPAR_EPPA1(x)        (((x)&0x0003)<<2)
++#define MCF_EPORT_EPPAR_EPPA2(x)        (((x)&0x0003)<<4)
++#define MCF_EPORT_EPPAR_EPPA3(x)        (((x)&0x0003)<<6)
++#define MCF_EPORT_EPPAR_EPPA4(x)        (((x)&0x0003)<<8)
++#define MCF_EPORT_EPPAR_EPPA5(x)        (((x)&0x0003)<<10)
++#define MCF_EPORT_EPPAR_EPPA6(x)        (((x)&0x0003)<<12)
++#define MCF_EPORT_EPPAR_EPPA7(x)        (((x)&0x0003)<<14)
++#define MCF_EPORT_EPPAR_LEVEL           (0)
++#define MCF_EPORT_EPPAR_RISING          (1)
++#define MCF_EPORT_EPPAR_FALLING         (2)
++#define MCF_EPORT_EPPAR_BOTH            (3)
++#define MCF_EPORT_EPPAR_EPPA7_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA7_RISING    (0x4000)
++#define MCF_EPORT_EPPAR_EPPA7_FALLING   (0x8000)
++#define MCF_EPORT_EPPAR_EPPA7_BOTH      (0xC000)
++#define MCF_EPORT_EPPAR_EPPA6_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA6_RISING    (0x1000)
++#define MCF_EPORT_EPPAR_EPPA6_FALLING   (0x2000)
++#define MCF_EPORT_EPPAR_EPPA6_BOTH      (0x3000)
++#define MCF_EPORT_EPPAR_EPPA5_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA5_RISING    (0x0400)
++#define MCF_EPORT_EPPAR_EPPA5_FALLING   (0x0800)
++#define MCF_EPORT_EPPAR_EPPA5_BOTH      (0x0C00)
++#define MCF_EPORT_EPPAR_EPPA4_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA4_RISING    (0x0100)
++#define MCF_EPORT_EPPAR_EPPA4_FALLING   (0x0200)
++#define MCF_EPORT_EPPAR_EPPA4_BOTH      (0x0300)
++#define MCF_EPORT_EPPAR_EPPA3_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA3_RISING    (0x0040)
++#define MCF_EPORT_EPPAR_EPPA3_FALLING   (0x0080)
++#define MCF_EPORT_EPPAR_EPPA3_BOTH      (0x00C0)
++#define MCF_EPORT_EPPAR_EPPA2_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA2_RISING    (0x0010)
++#define MCF_EPORT_EPPAR_EPPA2_FALLING   (0x0020)
++#define MCF_EPORT_EPPAR_EPPA2_BOTH      (0x0030)
++#define MCF_EPORT_EPPAR_EPPA1_LEVEL     (0x0000)
++#define MCF_EPORT_EPPAR_EPPA1_RISING    (0x0004)
++#define MCF_EPORT_EPPAR_EPPA1_FALLING   (0x0008)
++#define MCF_EPORT_EPPAR_EPPA1_BOTH      (0x000C)
++
++/* Bit definitions and macros for EPDDR */
++#define MCF_EPORT_EPDDR_EPDD1   (0x02)
++#define MCF_EPORT_EPDDR_EPDD2   (0x04)
++#define MCF_EPORT_EPDDR_EPDD3   (0x08)
++#define MCF_EPORT_EPDDR_EPDD4   (0x10)
++#define MCF_EPORT_EPDDR_EPDD5   (0x20)
++#define MCF_EPORT_EPDDR_EPDD6   (0x40)
++#define MCF_EPORT_EPDDR_EPDD7   (0x80)
++
++/* Bit definitions and macros for EPIER */
++#define MCF_EPORT_EPIER_EPIE1   (0x02)
++#define MCF_EPORT_EPIER_EPIE2   (0x04)
++#define MCF_EPORT_EPIER_EPIE3   (0x08)
++#define MCF_EPORT_EPIER_EPIE4   (0x10)
++#define MCF_EPORT_EPIER_EPIE5   (0x20)
++#define MCF_EPORT_EPIER_EPIE6   (0x40)
++#define MCF_EPORT_EPIER_EPIE7   (0x80)
++
++/* Bit definitions and macros for EPDR */
++#define MCF_EPORT_EPDR_EPD1     (0x02)
++#define MCF_EPORT_EPDR_EPD2     (0x04)
++#define MCF_EPORT_EPDR_EPD3     (0x08)
++#define MCF_EPORT_EPDR_EPD4     (0x10)
++#define MCF_EPORT_EPDR_EPD5     (0x20)
++#define MCF_EPORT_EPDR_EPD6     (0x40)
++#define MCF_EPORT_EPDR_EPD7     (0x80)
++
++/* Bit definitions and macros for EPPDR */
++#define MCF_EPORT_EPPDR_EPPD1   (0x02)
++#define MCF_EPORT_EPPDR_EPPD2   (0x04)
++#define MCF_EPORT_EPPDR_EPPD3   (0x08)
++#define MCF_EPORT_EPPDR_EPPD4   (0x10)
++#define MCF_EPORT_EPPDR_EPPD5   (0x20)
++#define MCF_EPORT_EPPDR_EPPD6   (0x40)
++#define MCF_EPORT_EPPDR_EPPD7   (0x80)
++
++/* Bit definitions and macros for EPFR */
++#define MCF_EPORT_EPFR_EPF1     (0x02)
++#define MCF_EPORT_EPFR_EPF2     (0x04)
++#define MCF_EPORT_EPFR_EPF3     (0x08)
++#define MCF_EPORT_EPFR_EPF4     (0x10)
++#define MCF_EPORT_EPFR_EPF5     (0x20)
++#define MCF_EPORT_EPFR_EPF6     (0x40)
++#define MCF_EPORT_EPFR_EPF7     (0x80)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_EPORT_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_fbcs.h
+@@ -0,0 +1,182 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_FBCS_H__
++#define __MCF5445X_FBCS_H__
++
++/*********************************************************************
++*
++* FlexBus Chip Selects (FBCS)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_FBCS_CSAR0        MCF_REG32(0xFC008000)   /* Chip-select Addr Register */
++#define MCF_FBCS_CSMR0        MCF_REG32(0xFC008004)   /* Chip-select Mask Register */
++#define MCF_FBCS_CSCR0        MCF_REG32(0xFC008008)   /* Chip-select Cntl Register */
++#define MCF_FBCS_CSAR1        MCF_REG32(0xFC00800C)   /* Chip-select Addr Register */
++#define MCF_FBCS_CSMR1        MCF_REG32(0xFC008010)   /* Chip-select Mask Register */
++#define MCF_FBCS_CSCR1        MCF_REG32(0xFC008014)   /* Chip-select Cntl Register */
++#define MCF_FBCS_CSAR2        MCF_REG32(0xFC008018)   /* Chip-select Addr Register */
++#define MCF_FBCS_CSMR2        MCF_REG32(0xFC00801C)   /* Chip-select Mask Register */
++#define MCF_FBCS_CSCR2        MCF_REG32(0xFC008020)   /* Chip-select Cntl Register */
++#define MCF_FBCS_CSAR3        MCF_REG32(0xFC008024)   /* Chip-select Addr Register */
++#define MCF_FBCS_CSMR3        MCF_REG32(0xFC008028)   /* Chip-select Mask Register */
++#define MCF_FBCS_CSCR3        MCF_REG32(0xFC00802C)   /* Chip-select Cntl Register */
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_FBCS_CSAR(x)      MCF_REG32(0xFC008000+((x)*0x00C))   /* Chip-select Addr Register */
++#define MCF_FBCS_CSMR(x)      MCF_REG32(0xFC008004+((x)*0x00C))   /* Chip-select Mask Register */
++#define MCF_FBCS_CSCR(x)      MCF_REG32(0xFC008008+((x)*0x00C))   /* Chip-select Cntl Register */
++
++/* Bit definitions and macros for CSAR group */
++#define MCF_FBCS_CSAR_BA(x)     ((x)&0xFFFF0000)
++
++/* Bit definitions and macros for CSAR0 */
++#define MCF_FBCS_CSAR0_BA(x)    ((x)&0xFFFF0000)
++
++/* Bit definitions and macros for CSMR group */
++#define MCF_FBCS_CSMR_V             (0x00000001)            /* Valid bit */
++#define MCF_FBCS_CSMR_WP            (0x00000100)            /* Write protect */
++#define MCF_FBCS_CSMR_BAM(x)        (((x)&0x0000FFFF)<<16)  /* Base addr mask */
++#define MCF_FBCS_CSMR_BAM_4G        (0xFFFF0000)
++#define MCF_FBCS_CSMR_BAM_2G        (0x7FFF0000)
++#define MCF_FBCS_CSMR_BAM_1G        (0x3FFF0000)
++#define MCF_FBCS_CSMR_BAM_1024M     (0x3FFF0000)
++#define MCF_FBCS_CSMR_BAM_512M      (0x1FFF0000)
++#define MCF_FBCS_CSMR_BAM_256M      (0x0FFF0000)
++#define MCF_FBCS_CSMR_BAM_128M      (0x07FF0000)
++#define MCF_FBCS_CSMR_BAM_64M       (0x03FF0000)
++#define MCF_FBCS_CSMR_BAM_32M       (0x01FF0000)
++#define MCF_FBCS_CSMR_BAM_16M       (0x00FF0000)
++#define MCF_FBCS_CSMR_BAM_8M        (0x007F0000)
++#define MCF_FBCS_CSMR_BAM_4M        (0x003F0000)
++#define MCF_FBCS_CSMR_BAM_2M        (0x001F0000)
++#define MCF_FBCS_CSMR_BAM_1M        (0x000F0000)
++#define MCF_FBCS_CSMR_BAM_1024K     (0x000F0000)
++#define MCF_FBCS_CSMR_BAM_512K      (0x00070000)
++#define MCF_FBCS_CSMR_BAM_256K      (0x00030000)
++#define MCF_FBCS_CSMR_BAM_128K      (0x00010000)
++#define MCF_FBCS_CSMR_BAM_64K       (0x00000000)
++
++/* Bit definitions and macros for CSMR0 */
++#define MCF_FBCS_CSMR0_V            (0x00000001)            /* Valid bit */
++#define MCF_FBCS_CSMR0_WP           (0x00000100)            /* Write protect */
++#define MCF_FBCS_CSMR0_BAM(x)       (((x)&0x0000FFFF)<<16)  /* Base addr mask */
++#define MCF_FBCS_CSMR0_BAM_4G       (0xFFFF0000)
++#define MCF_FBCS_CSMR0_BAM_2G       (0x7FFF0000)
++#define MCF_FBCS_CSMR0_BAM_1G       (0x3FFF0000)
++#define MCF_FBCS_CSMR0_BAM_1024M    (0x3FFF0000)
++#define MCF_FBCS_CSMR0_BAM_512M     (0x1FFF0000)
++#define MCF_FBCS_CSMR0_BAM_256M     (0x0FFF0000)
++#define MCF_FBCS_CSMR0_BAM_128M     (0x07FF0000)
++#define MCF_FBCS_CSMR0_BAM_64M      (0x03FF0000)
++#define MCF_FBCS_CSMR0_BAM_32M      (0x01FF0000)
++#define MCF_FBCS_CSMR0_BAM_16M      (0x00FF0000)
++#define MCF_FBCS_CSMR0_BAM_8M       (0x007F0000)
++#define MCF_FBCS_CSMR0_BAM_4M       (0x003F0000)
++#define MCF_FBCS_CSMR0_BAM_2M       (0x001F0000)
++#define MCF_FBCS_CSMR0_BAM_1M       (0x000F0000)
++#define MCF_FBCS_CSMR0_BAM_1024K    (0x000F0000)
++#define MCF_FBCS_CSMR0_BAM_512K     (0x00070000)
++#define MCF_FBCS_CSMR0_BAM_256K     (0x00030000)
++#define MCF_FBCS_CSMR0_BAM_128K     (0x00010000)
++#define MCF_FBCS_CSMR0_BAM_64K      (0x00000000)
++
++/* Bit definitions and macros for CSCR group */
++#define MCF_FBCS_CSCR_BSTW      (0x00000008)            /* Burst-write enable */
++#define MCF_FBCS_CSCR_BSTR      (0x00000010)            /* Burst-read enable */
++#define MCF_FBCS_CSCR_BEM       (0x00000020)            /* Byte-enable mode */
++#define MCF_FBCS_CSCR_PS(x)     (((x)&0x00000003)<<6)   /* Port size */
++#define MCF_FBCS_CSCR_AA        (0x00000100)            /* Auto-acknowledge */
++#define MCF_FBCS_CSCR_WS(x)     (((x)&0x0000003F)<<10)  /* Wait states */
++#define MCF_FBCS_CSCR_WRAH(x)   (((x)&0x00000003)<<16)  /* Write address hold or deselect */
++#define MCF_FBCS_CSCR_RDAH(x)   (((x)&0x00000003)<<18)  /* Read address hold or deselect */
++#define MCF_FBCS_CSCR_ASET(x)   (((x)&0x00000003)<<20)  /* Address setup */
++#define MCF_FBCS_CSCR_SWSEN     (0x00800000)            /* Secondary wait state enable */
++#define MCF_FBCS_CSCR_SWS(x)    (((x)&0x0000003F)<<26)  /* Secondary wait states */
++#define MCF_FBCS_CSCR_PS_8      (0x00000040)
++#define MCF_FBCS_CSCR_PS_16     (0x00000080)
++#define MCF_FBCS_CSCR_PS_32     (0x00000000)
++
++/* Bit definitions and macros for CSCR0 */
++#define MCF_FBCS_CSCR0_BSTW   (0x00000008)            /* Burst-write enable */
++#define MCF_FBCS_CSCR0_BSTR   (0x00000010)            /* Burst-read enable */
++#define MCF_FBCS_CSCR0_BEM    (0x00000020)            /* Byte-enable mode */
++#define MCF_FBCS_CSCR0_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
++#define MCF_FBCS_CSCR0_AA     (0x00000100)            /* Auto-acknowledge */
++#define MCF_FBCS_CSCR0_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
++#define MCF_FBCS_CSCR0_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
++#define MCF_FBCS_CSCR0_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
++#define MCF_FBCS_CSCR0_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
++#define MCF_FBCS_CSCR0_SWSEN  (0x00800000)            /* Secondary wait state enable */
++#define MCF_FBCS_CSCR0_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
++#define MCF_FBCS_CSCR0_PS_8   (0x00000040)
++#define MCF_FBCS_CSCR0_PS_16  (0x00000080)
++#define MCF_FBCS_CSCR0_PS_32  (0x00000000)
++
++/* Bit definitions and macros for CSMR1 */
++#define MCF_FBCS_CSMR1_V      (0x00000001)            /* Valid bit */
++#define MCF_FBCS_CSMR1_WP     (0x00000100)            /* Write protect */
++#define MCF_FBCS_CSMR1_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
++
++/* Bit definitions and macros for CSCR1 */
++#define MCF_FBCS_CSCR1_BSTW   (0x00000008)            /* Burst-write enable */
++#define MCF_FBCS_CSCR1_BSTR   (0x00000010)            /* Burst-read enable */
++#define MCF_FBCS_CSCR1_BEM    (0x00000020)            /* Byte-enable mode */
++#define MCF_FBCS_CSCR1_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
++#define MCF_FBCS_CSCR1_AA     (0x00000100)            /* Auto-acknowledge */
++#define MCF_FBCS_CSCR1_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
++#define MCF_FBCS_CSCR1_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
++#define MCF_FBCS_CSCR1_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
++#define MCF_FBCS_CSCR1_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
++#define MCF_FBCS_CSCR1_SWSEN  (0x00800000)            /* Secondary wait state enable */
++#define MCF_FBCS_CSCR1_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
++
++/* Bit definitions and macros for CSMR2 */
++#define MCF_FBCS_CSMR2_V      (0x00000001)            /* Valid bit */
++#define MCF_FBCS_CSMR2_WP     (0x00000100)            /* Write protect */
++#define MCF_FBCS_CSMR2_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
++
++/* Bit definitions and macros for CSCR2 */
++#define MCF_FBCS_CSCR2_BSTW   (0x00000008)            /* Burst-write enable */
++#define MCF_FBCS_CSCR2_BSTR   (0x00000010)            /* Burst-read enable */
++#define MCF_FBCS_CSCR2_BEM    (0x00000020)            /* Byte-enable mode */
++#define MCF_FBCS_CSCR2_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
++#define MCF_FBCS_CSCR2_AA     (0x00000100)            /* Auto-acknowledge */
++#define MCF_FBCS_CSCR2_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
++#define MCF_FBCS_CSCR2_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
++#define MCF_FBCS_CSCR2_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
++#define MCF_FBCS_CSCR2_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
++#define MCF_FBCS_CSCR2_SWSEN  (0x00800000)            /* Secondary wait state enable */
++#define MCF_FBCS_CSCR2_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
++
++/* Bit definitions and macros for CSMR3 */
++#define MCF_FBCS_CSMR3_V      (0x00000001)            /* Valid bit */
++#define MCF_FBCS_CSMR3_WP     (0x00000100)            /* Write protect */
++#define MCF_FBCS_CSMR3_BAM(x) (((x)&0x0000FFFF)<<16)  /* Base address mask */
++
++/* Bit definitions and macros for CSCR3 */
++#define MCF_FBCS_CSCR3_BSTW   (0x00000008)            /* Burst-write enable */
++#define MCF_FBCS_CSCR3_BSTR   (0x00000010)            /* Burst-read enable */
++#define MCF_FBCS_CSCR3_BEM    (0x00000020)            /* Byte-enable mode */
++#define MCF_FBCS_CSCR3_PS(x)  (((x)&0x00000003)<<6)   /* Port size */
++#define MCF_FBCS_CSCR3_AA     (0x00000100)            /* Auto-acknowledge */
++#define MCF_FBCS_CSCR3_WS(x)  (((x)&0x0000003F)<<10)  /* Wait states */
++#define MCF_FBCS_CSCR3_WRAH(x)        (((x)&0x00000003)<<16)  /* Write address hold or deselect */
++#define MCF_FBCS_CSCR3_RDAH(x)        (((x)&0x00000003)<<18)  /* Read address hold or deselect */
++#define MCF_FBCS_CSCR3_ASET(x)        (((x)&0x00000003)<<20)  /* Address setup */
++#define MCF_FBCS_CSCR3_SWSEN  (0x00800000)            /* Secondary wait state enable */
++#define MCF_FBCS_CSCR3_SWS(x) (((x)&0x0000003F)<<26)  /* Secondary wait states */
++
++/********************************************************************/
++
++#endif /* __MCF5445X_FBCS_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_gpio.h
+@@ -0,0 +1,1257 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_GPIO_H__
++#define __MCF5445X_GPIO_H__
++
++/*********************************************************************
++*
++* General Purpose I/O Module (GPIO)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_GPIO_PODR_FEC0H   MCF_REG08(0xFC0A4000)   /* FEC0 High Port Output Data Register */
++#define MCF_GPIO_PODR_FEC0L   MCF_REG08(0xFC0A4001)   /* FEC0 Low Port Output Data Register */
++#define MCF_GPIO_PODR_SSI     MCF_REG08(0xFC0A4002)   /* SSI Port Output Data Register */
++#define MCF_GPIO_PODR_FBCTL   MCF_REG08(0xFC0A4003)   /* Flexbus Control Port Output Data Register */
++#define MCF_GPIO_PODR_BE      MCF_REG08(0xFC0A4004)   /* Flexbus Byte Enable Port Output Data Register */
++#define MCF_GPIO_PODR_CS      MCF_REG08(0xFC0A4005)   /* Flexbus Chip-Select Port Output Data Register */
++#define MCF_GPIO_PODR_DMA     MCF_REG08(0xFC0A4006)   /* DMA Port Output Data Register */
++#define MCF_GPIO_PODR_FECI2C  MCF_REG08(0xFC0A4007)   /* FEC1 / I2C Port Output Data Register */
++#define MCF_GPIO_PODR_UART    MCF_REG08(0xFC0A4009)   /* UART Port Output Data Register */
++#define MCF_GPIO_PODR_DSPI    MCF_REG08(0xFC0A400A)   /* DSPI Port Output Data Register */
++#define MCF_GPIO_PODR_TIMER   MCF_REG08(0xFC0A400B)   /* Timer Port Output Data Register */
++#define MCF_GPIO_PODR_PCI     MCF_REG08(0xFC0A400C)   /* PCI Port Output Data Register */
++#define MCF_GPIO_PODR_USB     MCF_REG08(0xFC0A400D)   /* USB Port Output Data Register */
++#define MCF_GPIO_PODR_ATAH    MCF_REG08(0xFC0A400E)   /* ATA High Port Output Data Register */
++#define MCF_GPIO_PODR_ATAL    MCF_REG08(0xFC0A400F)   /* ATA Low Port Output Data Register */
++#define MCF_GPIO_PODR_FEC1H   MCF_REG08(0xFC0A4010)   /* FEC1 High Port Output Data Register */
++#define MCF_GPIO_PODR_FEC1L   MCF_REG08(0xFC0A4011)   /* FEC1 Low Port Output Data Register */
++#define MCF_GPIO_PODR_FBADH   MCF_REG08(0xFC0A4014)   /* Flexbus AD High Port Output Data Register */
++#define MCF_GPIO_PODR_FBADMH  MCF_REG08(0xFC0A4015)   /* Flexbus AD Med-High Port Output Data Register */
++#define MCF_GPIO_PODR_FBADML  MCF_REG08(0xFC0A4016)   /* Flexbus AD Med-Low Port Output Data Register */
++#define MCF_GPIO_PODR_FBADL   MCF_REG08(0xFC0A4017)   /* Flexbus AD Low Port Output Data Register */
++#define MCF_GPIO_PDDR_FEC0H   MCF_REG08(0xFC0A4018)   /* FEC0 High Port Data Direction Register */
++#define MCF_GPIO_PDDR_FEC0L   MCF_REG08(0xFC0A4019)   /* FEC0 Low Port Data Direction Register */
++#define MCF_GPIO_PDDR_SSI     MCF_REG08(0xFC0A401A)   /* SSI Port Data Direction Register */
++#define MCF_GPIO_PDDR_FBCTL   MCF_REG08(0xFC0A401B)   /* Flexbus Control Port Data Direction Register */
++#define MCF_GPIO_PDDR_BE      MCF_REG08(0xFC0A401C)   /* Flexbus Byte Enable Port Data Direction Register */
++#define MCF_GPIO_PDDR_CS      MCF_REG08(0xFC0A401D)   /* Flexbus Chip-Select Port Data Direction Register */
++#define MCF_GPIO_PDDR_DMA     MCF_REG08(0xFC0A401E)   /* DMA Port Data Direction Register */
++#define MCF_GPIO_PDDR_FECI2C  MCF_REG08(0xFC0A401F)   /* FEC1 / I2C Port Data Direction Register */
++#define MCF_GPIO_PDDR_UART    MCF_REG08(0xFC0A4021)   /* UART Port Data Direction Register */
++#define MCF_GPIO_PDDR_DSPI    MCF_REG08(0xFC0A4022)   /* DSPI Port Data Direction Register */
++#define MCF_GPIO_PDDR_TIMER   MCF_REG08(0xFC0A4023)   /* Timer Port Data Direction Register */
++#define MCF_GPIO_PDDR_PCI     MCF_REG08(0xFC0A4024)   /* PCI Port Data Direction Register */
++#define MCF_GPIO_PDDR_USB     MCF_REG08(0xFC0A4025)   /* USB Port Data Direction Register */
++#define MCF_GPIO_PDDR_ATAH    MCF_REG08(0xFC0A4026)   /* ATA High Port Data Direction Register */
++#define MCF_GPIO_PDDR_ATAL    MCF_REG08(0xFC0A4027)   /* ATA Low Port Data Direction Register */
++#define MCF_GPIO_PDDR_FEC1H   MCF_REG08(0xFC0A4028)   /* FEC1 High Port Data Direction Register */
++#define MCF_GPIO_PDDR_FEC1L   MCF_REG08(0xFC0A4029)   /* FEC1 Low Port Data Direction Register */
++#define MCF_GPIO_PDDR_FBADH   MCF_REG08(0xFC0A402C)   /* Flexbus AD High Port Data Direction Register */
++#define MCF_GPIO_PDDR_FBADMH  MCF_REG08(0xFC0A402D)   /* Flexbus AD Med-High Port Data Direction Register */
++#define MCF_GPIO_PDDR_FBADML  MCF_REG08(0xFC0A402E)   /* Flexbus AD Med-Low Port Data Direction Register */
++#define MCF_GPIO_PDDR_FBADL   MCF_REG08(0xFC0A402F)   /* Flexbus AD Low Port Data Direction Register */
++#define MCF_GPIO_PPDSDR_FEC0H MCF_REG08(0xFC0A4030)   /* FEC0 High Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FEC0L MCF_REG08(0xFC0A4031)   /* FEC0 Low Port Clear Output Data Register */
++#define MCF_GPIO_PPDSDR_SSI   MCF_REG08(0xFC0A4032)   /* SSI Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FBCTL MCF_REG08(0xFC0A4033)   /* Flexbus Control Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_BE    MCF_REG08(0xFC0A4034)   /* Flexbus Byte Enable Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_CS    MCF_REG08(0xFC0A4035)   /* Flexbus Chip-Select Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_DMA   MCF_REG08(0xFC0A4036)   /* DMA Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FECI2C        MCF_REG08(0xFC0A4037)   /* FEC1 / I2C Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_UART  MCF_REG08(0xFC0A4039)   /* UART Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_DSPI  MCF_REG08(0xFC0A403A)   /* DSPI Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_TIMER MCF_REG08(0xFC0A403B)   /* FTimer Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_PCI   MCF_REG08(0xFC0A403C)   /* PCI Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_USB   MCF_REG08(0xFC0A403D)   /* USB Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_ATAH  MCF_REG08(0xFC0A403E)   /* ATA High Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_ATAL  MCF_REG08(0xFC0A403F)   /* ATA Low Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FEC1H MCF_REG08(0xFC0A4040)   /* FEC1 High Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FEC1L MCF_REG08(0xFC0A4041)   /* FEC1 Low Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FBADH MCF_REG08(0xFC0A4044)   /* Flexbus AD High Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FBADMH        MCF_REG08(0xFC0A4045)   /* Flexbus AD Med-High Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FBADML        MCF_REG08(0xFC0A4046)   /* Flexbus AD Med-Low Port Pin Data/Set Data Register */
++#define MCF_GPIO_PPDSDR_FBADL MCF_REG08(0xFC0A4047)   /* Flexbus AD Low Port Pin Data/Set Data Register */
++#define MCF_GPIO_PCLRR_FEC0H  MCF_REG08(0xFC0A4048)   /* FEC0 High Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FEC0L  MCF_REG08(0xFC0A4049)   /* FEC0 Low Port Pin Data/Set Data Register */
++#define MCF_GPIO_PCLRR_SSI    MCF_REG08(0xFC0A404A)   /* SSI Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FBCTL  MCF_REG08(0xFC0A404B)   /* Flexbus Control Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_BE     MCF_REG08(0xFC0A404C)   /* Flexbus Byte Enable Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_CS     MCF_REG08(0xFC0A404D)   /* Flexbus Chip-Select Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_DMA    MCF_REG08(0xFC0A404E)   /* DMA Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FECI2C MCF_REG08(0xFC0A404F)   /* FEC1 / I2C Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_UART   MCF_REG08(0xFC0A4051)   /* UART Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_DSPI   MCF_REG08(0xFC0A4052)   /* DSPI Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_TIMER  MCF_REG08(0xFC0A4053)   /* Timer Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_PCI    MCF_REG08(0xFC0A4054)   /* PCI Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_USB    MCF_REG08(0xFC0A4055)   /* USB Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_ATAH   MCF_REG08(0xFC0A4056)   /* ATA High Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_ATAL   MCF_REG08(0xFC0A4057)   /* ATA Low Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FEC1H  MCF_REG08(0xFC0A4058)   /* FEC1 High Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FEC1L  MCF_REG08(0xFC0A4059)   /* FEC1 Low Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FBADH  MCF_REG08(0xFC0A405C)   /* Flexbus AD High Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FBADMH MCF_REG08(0xFC0A405D)   /* Flexbus AD Med-High Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FBADML MCF_REG08(0xFC0A405E)   /* Flexbus AD Med-Low Port Clear Output Data Register */
++#define MCF_GPIO_PCLRR_FBADL  MCF_REG08(0xFC0A405F)   /* Flexbus AD Low Port Clear Output Data Register */
++#define MCF_GPIO_PAR_FEC      MCF_REG08(0xFC0A4060)   /* FEC Pin Assignment Register */
++#define MCF_GPIO_PAR_DMA      MCF_REG08(0xFC0A4061)   /* DMA Pin Assignment Register */
++#define MCF_GPIO_PAR_FBCTL    MCF_REG08(0xFC0A4062)   /* Flexbus Control Pin Assignment Register */
++#define MCF_GPIO_PAR_DSPI     MCF_REG08(0xFC0A4063)   /* DSPI Pin Assignment Register */
++#define MCF_GPIO_PAR_BE               MCF_REG08(0xFC0A4064)   /* Flexbus Byte-Enable Pin Assignment Register */
++#define MCF_GPIO_PAR_CS               MCF_REG08(0xFC0A4065)   /* Flexbus Chip-Select Pin Assignment Register */
++#define MCF_GPIO_PAR_TIMER    MCF_REG08(0xFC0A4066)   /* Time Pin Assignment Register */
++#define MCF_GPIO_PAR_USB      MCF_REG08(0xFC0A4067)   /* USB Pin Assignment Register */
++#define MCF_GPIO_PAR_UART     MCF_REG08(0xFC0A4069)   /* UART Pin Assignment Register */
++#define MCF_GPIO_PAR_FECI2C   MCF_REG16(0xFC0A406A)   /* FEC / I2C Pin Assignment Register */
++#define MCF_GPIO_PAR_SSI      MCF_REG16(0xFC0A406C)   /* SSI Pin Assignment Register */
++#define MCF_GPIO_PAR_ATA      MCF_REG16(0xFC0A406E)   /* ATA Pin Assignment Register */
++#define MCF_GPIO_PAR_IRQ      MCF_REG08(0xFC0A4070)   /* IRQ Pin Assignment Register */
++#define MCF_GPIO_PAR_PCI      MCF_REG16(0xFC0A4072)   /* PCI Pin Assignment Register */
++#define MCF_GPIO_MSCR_SDRAM   MCF_REG08(0xFC0A4074)   /* SDRAM Mode Select Control Register */
++#define MCF_GPIO_MSCR_PCI     MCF_REG08(0xFC0A4075)   /* PCI Mode Select Control Register */
++#define MCF_GPIO_DSCR_I2C     MCF_REG08(0xFC0A4078)   /* I2C Drive Strength Control Register */
++#define MCF_GPIO_DSCR_FLEXBUS MCF_REG08(0xFC0A4079)   /* FLEXBUS Drive Strength Control Register */
++#define MCF_GPIO_DSCR_FEC     MCF_REG08(0xFC0A407A)   /* FEC Drive Strength Control Register */
++#define MCF_GPIO_DSCR_UART    MCF_REG08(0xFC0A407B)   /* UART Drive Strength Control Register */
++#define MCF_GPIO_DSCR_DSPI    MCF_REG08(0xFC0A407C)   /* DSPI Drive Strength Control Register */
++#define MCF_GPIO_DSCR_TIMER   MCF_REG08(0xFC0A407D)   /* TIMER Drive Strength Control Register */
++#define MCF_GPIO_DSCR_SSI     MCF_REG08(0xFC0A407E)   /* SSI Drive Strength Control Register */
++#define MCF_GPIO_DSCR_DMA     MCF_REG08(0xFC0A407F)   /* DMA Drive Strength Control Register */
++#define MCF_GPIO_DSCR_DEBUG   MCF_REG08(0xFC0A4080)   /* DEBUG Drive Strength Control Register */
++#define MCF_GPIO_DSCR_RESET   MCF_REG08(0xFC0A4081)   /* RESET Drive Strength Control Register */
++#define MCF_GPIO_DSCR_IRQ     MCF_REG08(0xFC0A4082)   /* IRQ Drive Strength Control Register */
++#define MCF_GPIO_DSCR_USB     MCF_REG08(0xFC0A4083)   /* USB Drive Strength Control Register */
++#define MCF_GPIO_DSCR_ATA     MCF_REG08(0xFC0A4084)   /* ATA Drive Strength Control Register */
++
++/* Bit definitions and macros for PODR_FEC0H */
++#define MCF_GPIO_PODR_FEC0H_PODR0     (0x01)  /* FEC0_CRS / ULPI_DATA6 */
++#define MCF_GPIO_PODR_FEC0H_PODR1     (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
++#define MCF_GPIO_PODR_FEC0H_PODR2     (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
++#define MCF_GPIO_PODR_FEC0H_PODR3     (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
++#define MCF_GPIO_PODR_FEC0H_PODR4     (0x10)  /* FEC0_COL / ULPI_DATA7 */
++#define MCF_GPIO_PODR_FEC0H_PODR5     (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
++#define MCF_GPIO_PODR_FEC0H_PODR6     (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
++#define MCF_GPIO_PODR_FEC0H_PODR7     (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
++
++/* Bit definitions and macros for PODR_FEC0L */
++#define MCF_GPIO_PODR_FEC0L_PODR0     (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
++#define MCF_GPIO_PODR_FEC0L_PODR1     (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
++#define MCF_GPIO_PODR_FEC0L_PODR2     (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
++#define MCF_GPIO_PODR_FEC0L_PODR3     (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
++#define MCF_GPIO_PODR_FEC0L_PODR4     (0x10)  /* FEC0_TXER / ULPI_DATA0 */
++#define MCF_GPIO_PODR_FEC0L_PODR5     (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
++#define MCF_GPIO_PODR_FEC0L_PODR6     (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
++#define MCF_GPIO_PODR_FEC0L_PODR7     (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
++
++/* Bit definitions and macros for PODR_SSI */
++#define MCF_GPIO_PODR_SSI_PODR0               (0x01)  /* SSI_TXD / U1TXD */
++#define MCF_GPIO_PODR_SSI_PODR1               (0x02)  /* SSI_RXD / U1RXD */
++#define MCF_GPIO_PODR_SSI_PODR2               (0x04)  /* SSI_FS / U1RTS */
++#define MCF_GPIO_PODR_SSI_PODR3               (0x08)  /* SSI_BCLK / U1CTS */
++#define MCF_GPIO_PODR_SSI_PODR4               (0x10)  /* SSI_MCLK */
++
++/* Bit definitions and macros for PODR_FBCTL */
++#define MCF_GPIO_PODR_FBCTL_PODR0     (0x01)  /* FB_TS / FB_ALE / FB_TBST */
++#define MCF_GPIO_PODR_FBCTL_PODR1     (0x02)  /* FB_RW */
++#define MCF_GPIO_PODR_FBCTL_PODR2     (0x04)  /* FB_TA */
++#define MCF_GPIO_PODR_FBCTL_PODR3     (0x08)  /* FB_OE */
++
++/* Bit definitions and macros for PODR_BE */
++#define MCF_GPIO_PODR_BE_PODR0                (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
++#define MCF_GPIO_PODR_BE_PODR1                (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
++#define MCF_GPIO_PODR_BE_PODR2                (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
++#define MCF_GPIO_PODR_BE_PODR3                (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
++
++/* Bit definitions and macros for PODR_CS */
++#define MCF_GPIO_PODR_CS_PODR1                (0x02)  /* FB_CS1 */
++#define MCF_GPIO_PODR_CS_PODR2                (0x04)  /* FB_CS2 */
++#define MCF_GPIO_PODR_CS_PODR3                (0x08)  /* FB_CS3 */
++
++/* Bit definitions and macros for PODR_DMA */
++#define MCF_GPIO_PODR_DMA_PODR0               (0x01)  /* DREQ0 */
++#define MCF_GPIO_PODR_DMA_PODR1               (0x02)  /* DACK0 / DSPI_PCS3 */
++#define MCF_GPIO_PODR_DMA_PODR2               (0x04)  /* DREQ1 / USB_CLKIN */
++#define MCF_GPIO_PODR_DMA_PODR3               (0x08)  /* DACK1 / ULPI_DIR */
++
++/* Bit definitions and macros for PODR_FECI2C */
++#define MCF_GPIO_PODR_FECI2C_PODR0    (0x01)  /* I2C_SDA / U2RXD */
++#define MCF_GPIO_PODR_FECI2C_PODR1    (0x02)  /* I2C_SCL / U2TXD */
++#define MCF_GPIO_PODR_FECI2C_PODR2    (0x04)  /* FEC0_MDIO */
++#define MCF_GPIO_PODR_FECI2C_PODR3    (0x08)  /* FEC0_MDC */
++#define MCF_GPIO_PODR_FECI2C_PODR4    (0x10)  /* FEC1_MDIO / ATA_DIOW */
++#define MCF_GPIO_PODR_FECI2C_PODR5    (0x20)  /* FEC1_MDC / ATA_DIOR */
++
++/* Bit definitions and macros for PODR_UART */
++#define MCF_GPIO_PODR_UART_PODR0      (0x01)  /* U1TXD */
++#define MCF_GPIO_PODR_UART_PODR1      (0x02)  /* U1RXD */
++#define MCF_GPIO_PODR_UART_PODR2      (0x04)  /* U1RTS */
++#define MCF_GPIO_PODR_UART_PODR3      (0x08)  /* U0CTS */
++#define MCF_GPIO_PODR_UART_PODR4      (0x10)  /* U1TXD */
++#define MCF_GPIO_PODR_UART_PODR5      (0x20)  /* U1RXD */
++#define MCF_GPIO_PODR_UART_PODR6      (0x40)  /* U1RTS */
++#define MCF_GPIO_PODR_UART_PODR7      (0x80)  /* U1CTS */
++
++/* Bit definitions and macros for PODR_DSPI */
++#define MCF_GPIO_PODR_DSPI_PODR0      (0x01)  /* DSPI_SOUT / SBF_DO */
++#define MCF_GPIO_PODR_DSPI_PODR1      (0x02)  /* DSPI_SIN / SBF_DI */
++#define MCF_GPIO_PODR_DSPI_PODR2      (0x04)  /* DSPI_SCK / SBF_CK */
++#define MCF_GPIO_PODR_DSPI_PODR3      (0x08)  /* DSPI_PCS0/SS */
++#define MCF_GPIO_PODR_DSPI_PODR4      (0x10)  /* DSPI_PCS1 / SBF_CS */
++#define MCF_GPIO_PODR_DSPI_PODR5      (0x20)  /* DSPI_PCS2 */
++#define MCF_GPIO_PODR_DSPI_PODR6      (0x40)  /* DSPI_PCS5/SS */
++
++/* Bit definitions and macros for PODR_TIMER */
++#define MCF_GPIO_PODR_TIMER_PODR0     (0x01)  /* T0IN / T0OUT / U2RTS */
++#define MCF_GPIO_PODR_TIMER_PODR1     (0x02)  /* T1IN / T1OUT / U2CTS */
++#define MCF_GPIO_PODR_TIMER_PODR2     (0x04)  /* T2IN / T2OUT / U2TXD */
++#define MCF_GPIO_PODR_TIMER_PODR3     (0x08)  /* T3IN / T3OUT / U2RXD */
++
++/* Bit definitions and macros for PODR_PCI */
++#define MCF_GPIO_PODR_PCI_PODR0               (0x01)  /* PCI_REQ0/PCI_EXTGNT */
++#define MCF_GPIO_PODR_PCI_PODR1               (0x02)  /* PCI_REQ1 */
++#define MCF_GPIO_PODR_PCI_PODR2               (0x04)  /* PCI_REQ2 */
++#define MCF_GPIO_PODR_PCI_PODR3               (0x08)  /* PCI_REQ3 / ATA_INTR */
++#define MCF_GPIO_PODR_PCI_PODR4               (0x10)  /* PCI_GNT0/PCI_EXTREQ */
++#define MCF_GPIO_PODR_PCI_PODR5               (0x20)  /* PCI_GNT1 /  */
++#define MCF_GPIO_PODR_PCI_PODR6               (0x40)  /* PCI_GNT2 /  */
++#define MCF_GPIO_PODR_PCI_PODR7               (0x80)  /* PCI_GNT3 / ATA_DMACK */
++
++/* Bit definitions and macros for PODR_USB */
++#define MCF_GPIO_PODR_USB_PODR0               (0x01)  /* USB_VBUS_OC / ULPI_STP */
++#define MCF_GPIO_PODR_USB_PODR1               (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
++
++/* Bit definitions and macros for PODR_ATAH */
++#define MCF_GPIO_PODR_ATAH_PODR0      (0x01)  /* ATA_DA0 */
++#define MCF_GPIO_PODR_ATAH_PODR1      (0x02)  /* ATA_DA1 */
++#define MCF_GPIO_PODR_ATAH_PODR2      (0x04)  /* ATA_DA2 */
++#define MCF_GPIO_PODR_ATAH_PODR3      (0x08)  /* ATA_CS0 */
++#define MCF_GPIO_PODR_ATAH_PODR4      (0x10)  /* ATA_CS1 */
++#define MCF_GPIO_PODR_ATAH_PODR5      (0x20)  /* ATA_BUFFER_EN */
++
++/* Bit definitions and macros for PODR_ATAL */
++#define MCF_GPIO_PODR_ATAL_PODR0      (0x01)  /* ATA_IORDY */
++#define MCF_GPIO_PODR_ATAL_PODR1      (0x02)  /* ATA_DMARQ */
++#define MCF_GPIO_PODR_ATAL_PODR2      (0x04)  /* ATA_RESET */
++
++/* Bit definitions and macros for PODR_FEC1H */
++#define MCF_GPIO_PODR_FEC1H_PODR0     (0x01)  /* FEC1_CRS / ATA_DATA6 */
++#define MCF_GPIO_PODR_FEC1H_PODR1     (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
++#define MCF_GPIO_PODR_FEC1H_PODR2     (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
++#define MCF_GPIO_PODR_FEC1H_PODR3     (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
++#define MCF_GPIO_PODR_FEC1H_PODR4     (0x10)  /* FEC1_COL / ATA_DATA7 */
++#define MCF_GPIO_PODR_FEC1H_PODR5     (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
++#define MCF_GPIO_PODR_FEC1H_PODR6     (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
++#define MCF_GPIO_PODR_FEC1H_PODR7     (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
++
++/* Bit definitions and macros for PODR_FEC1L */
++#define MCF_GPIO_PODR_FEC1L_PODR0     (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
++#define MCF_GPIO_PODR_FEC1L_PODR1     (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
++#define MCF_GPIO_PODR_FEC1L_PODR2     (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
++#define MCF_GPIO_PODR_FEC1L_PODR3     (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
++#define MCF_GPIO_PODR_FEC1L_PODR4     (0x10)  /* FEC1_TXER / ATA_DATA0 */
++#define MCF_GPIO_PODR_FEC1L_PODR5     (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
++#define MCF_GPIO_PODR_FEC1L_PODR6     (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
++#define MCF_GPIO_PODR_FEC1L_PODR7     (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
++
++/* Bit definitions and macros for PODR_FBADH */
++#define MCF_GPIO_PODR_FBADH_PODR0     (0x01)  /* FB_AD24 */
++#define MCF_GPIO_PODR_FBADH_PODR1     (0x02)  /* FB_AD25 */
++#define MCF_GPIO_PODR_FBADH_PODR2     (0x04)  /* FB_AD26 */
++#define MCF_GPIO_PODR_FBADH_PODR3     (0x08)  /* FB_AD27 */
++#define MCF_GPIO_PODR_FBADH_PODR4     (0x10)  /* FB_AD28 */
++#define MCF_GPIO_PODR_FBADH_PODR5     (0x20)  /* FB_AD29 */
++#define MCF_GPIO_PODR_FBADH_PODR6     (0x40)  /* FB_AD30 */
++#define MCF_GPIO_PODR_FBADH_PODR7     (0x80)  /* FB_AD31 */
++
++/* Bit definitions and macros for PODR_FBADMH */
++#define MCF_GPIO_PODR_FBADMH_PODR0    (0x01)  /* FB_AD16 */
++#define MCF_GPIO_PODR_FBADMH_PODR1    (0x02)  /* FB_AD17 */
++#define MCF_GPIO_PODR_FBADMH_PODR2    (0x04)  /* FB_AD18 */
++#define MCF_GPIO_PODR_FBADMH_PODR3    (0x08)  /* FB_AD19 */
++#define MCF_GPIO_PODR_FBADMH_PODR4    (0x10)  /* FB_AD20 */
++#define MCF_GPIO_PODR_FBADMH_PODR5    (0x20)  /* FB_AD21 */
++#define MCF_GPIO_PODR_FBADMH_PODR6    (0x40)  /* FB_AD22 */
++#define MCF_GPIO_PODR_FBADMH_PODR7    (0x80)  /* FB_AD23 */
++
++/* Bit definitions and macros for PODR_FBADML */
++#define MCF_GPIO_PODR_FBADML_PODR0    (0x01)  /* FB_AD8 */
++#define MCF_GPIO_PODR_FBADML_PODR1    (0x02)  /* FB_AD9 */
++#define MCF_GPIO_PODR_FBADML_PODR2    (0x04)  /* FB_AD10 */
++#define MCF_GPIO_PODR_FBADML_PODR3    (0x08)  /* FB_AD11 */
++#define MCF_GPIO_PODR_FBADML_PODR4    (0x10)  /* FB_AD12 */
++#define MCF_GPIO_PODR_FBADML_PODR5    (0x20)  /* FB_AD13 */
++#define MCF_GPIO_PODR_FBADML_PODR6    (0x40)  /* FB_AD14 */
++#define MCF_GPIO_PODR_FBADML_PODR7    (0x80)  /* FB_AD15 */
++
++/* Bit definitions and macros for PODR_FBADL */
++#define MCF_GPIO_PODR_FBADL_PODR0     (0x01)  /* FB_AD0 */
++#define MCF_GPIO_PODR_FBADL_PODR1     (0x02)  /* FB_AD1 */
++#define MCF_GPIO_PODR_FBADL_PODR2     (0x04)  /* FB_AD2 */
++#define MCF_GPIO_PODR_FBADL_PODR3     (0x08)  /* FB_AD3 */
++#define MCF_GPIO_PODR_FBADL_PODR4     (0x10)  /* FB_AD4 */
++#define MCF_GPIO_PODR_FBADL_PODR5     (0x20)  /* FB_AD5 */
++#define MCF_GPIO_PODR_FBADL_PODR6     (0x40)  /* FB_AD6 */
++#define MCF_GPIO_PODR_FBADL_PODR7     (0x80)  /* FB_AD7 */
++
++/* Bit definitions and macros for PDDR_FEC0H */
++#define MCF_GPIO_PDDR_FEC0H_PDDR0     (0x01)  /* FEC0_CRS / ULPI_DATA6 */
++#define MCF_GPIO_PDDR_FEC0H_PDDR1     (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
++#define MCF_GPIO_PDDR_FEC0H_PDDR2     (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
++#define MCF_GPIO_PDDR_FEC0H_PDDR3     (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
++#define MCF_GPIO_PDDR_FEC0H_PDDR4     (0x10)  /* FEC0_COL / ULPI_DATA7 */
++#define MCF_GPIO_PDDR_FEC0H_PDDR5     (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
++#define MCF_GPIO_PDDR_FEC0H_PDDR6     (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
++#define MCF_GPIO_PDDR_FEC0H_PDDR7     (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
++
++/* Bit definitions and macros for PDDR_FEC0L */
++#define MCF_GPIO_PDDR_FEC0L_PDDR0     (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
++#define MCF_GPIO_PDDR_FEC0L_PDDR1     (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR2     (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR3     (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR4     (0x10)  /* FEC0_TXER / ULPI_DATA0 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR5     (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR6     (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
++#define MCF_GPIO_PDDR_FEC0L_PDDR7     (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
++
++/* Bit definitions and macros for PDDR_SSI */
++#define MCF_GPIO_PDDR_SSI_PDDR0               (0x01)  /* SSI_TXD / U1TXD */
++#define MCF_GPIO_PDDR_SSI_PDDR1               (0x02)  /* SSI_RXD / U1RXD */
++#define MCF_GPIO_PDDR_SSI_PDDR2               (0x04)  /* SSI_FS / U1RTS */
++#define MCF_GPIO_PDDR_SSI_PDDR3               (0x08)  /* SSI_BCLK / U1CTS */
++#define MCF_GPIO_PDDR_SSI_PDDR4               (0x10)  /* SSI_MCLK */
++
++/* Bit definitions and macros for PDDR_FBCTL */
++#define MCF_GPIO_PDDR_FBCTL_PDDR0     (0x01)  /* FB_TS / FB_ALE / FB_TBST */
++#define MCF_GPIO_PDDR_FBCTL_PDDR1     (0x02)  /* FB_RW */
++#define MCF_GPIO_PDDR_FBCTL_PDDR2     (0x04)  /* FB_TA */
++#define MCF_GPIO_PDDR_FBCTL_PDDR3     (0x08)  /* FB_OE */
++
++/* Bit definitions and macros for PDDR_BE */
++#define MCF_GPIO_PDDR_BE_PDDR0                (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
++#define MCF_GPIO_PDDR_BE_PDDR1                (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
++#define MCF_GPIO_PDDR_BE_PDDR2                (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
++#define MCF_GPIO_PDDR_BE_PDDR3                (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
++
++/* Bit definitions and macros for PDDR_CS */
++#define MCF_GPIO_PDDR_CS_PDDR1                (0x02)  /* FB_CS1 */
++#define MCF_GPIO_PDDR_CS_PDDR2                (0x04)  /* FB_CS2 */
++#define MCF_GPIO_PDDR_CS_PDDR3                (0x08)  /* FB_CS3 */
++
++/* Bit definitions and macros for PDDR_DMA */
++#define MCF_GPIO_PDDR_DMA_PDDR0               (0x01)  /* DREQ0 */
++#define MCF_GPIO_PDDR_DMA_PDDR1               (0x02)  /* DACK0 / DSPI_PCS3 */
++#define MCF_GPIO_PDDR_DMA_PDDR2               (0x04)  /* DREQ1 / USB_CLKIN */
++#define MCF_GPIO_PDDR_DMA_PDDR3               (0x08)  /* DACK1 / ULPI_DIR */
++
++/* Bit definitions and macros for PDDR_FECI2C */
++#define MCF_GPIO_PDDR_FECI2C_PDDR0    (0x01)  /* I2C_SDA / U2RXD */
++#define MCF_GPIO_PDDR_FECI2C_PDDR1    (0x02)  /* I2C_SCL / U2TXD */
++#define MCF_GPIO_PDDR_FECI2C_PDDR2    (0x04)  /* FEC0_MDIO */
++#define MCF_GPIO_PDDR_FECI2C_PDDR3    (0x08)  /* FEC0_MDC */
++#define MCF_GPIO_PDDR_FECI2C_PDDR4    (0x10)  /* FEC1_MDIO / ATA_DIOW */
++#define MCF_GPIO_PDDR_FECI2C_PDDR5    (0x20)  /* FEC1_MDC / ATA_DIOR */
++
++/* Bit definitions and macros for PDDR_UART */
++#define MCF_GPIO_PDDR_UART_PDDR0      (0x01)  /* U1TXD */
++#define MCF_GPIO_PDDR_UART_PDDR1      (0x02)  /* U1RXD */
++#define MCF_GPIO_PDDR_UART_PDDR2      (0x04)  /* U1RTS */
++#define MCF_GPIO_PDDR_UART_PDDR3      (0x08)  /* U0CTS */
++#define MCF_GPIO_PDDR_UART_PDDR4      (0x10)  /* U1TXD */
++#define MCF_GPIO_PDDR_UART_PDDR5      (0x20)  /* U1RXD */
++#define MCF_GPIO_PDDR_UART_PDDR6      (0x40)  /* U1RTS */
++#define MCF_GPIO_PDDR_UART_PDDR7      (0x80)  /* U1CTS */
++
++/* Bit definitions and macros for PDDR_DSPI */
++#define MCF_GPIO_PDDR_DSPI_PDDR0      (0x01)  /* DSPI_SOUT / SBF_DO */
++#define MCF_GPIO_PDDR_DSPI_PDDR1      (0x02)  /* DSPI_SIN / SBF_DI */
++#define MCF_GPIO_PDDR_DSPI_PDDR2      (0x04)  /* DSPI_SCK / SBF_CK */
++#define MCF_GPIO_PDDR_DSPI_PDDR3      (0x08)  /* DSPI_PCS0/SS */
++#define MCF_GPIO_PDDR_DSPI_PDDR4      (0x10)  /* DSPI_PCS1 / SBF_CS */
++#define MCF_GPIO_PDDR_DSPI_PDDR5      (0x20)  /* DSPI_PCS2 */
++#define MCF_GPIO_PDDR_DSPI_PDDR6      (0x40)  /* DSPI_PCS5/SS */
++
++/* Bit definitions and macros for PDDR_TIMER */
++#define MCF_GPIO_PDDR_TIMER_PDDR0     (0x01)  /* T0IN / T0OUT / U2RTS */
++#define MCF_GPIO_PDDR_TIMER_PDDR1     (0x02)  /* T1IN / T1OUT / U2CTS */
++#define MCF_GPIO_PDDR_TIMER_PDDR2     (0x04)  /* T2IN / T2OUT / U2TXD */
++#define MCF_GPIO_PDDR_TIMER_PDDR3     (0x08)  /* T3IN / T3OUT / U2RXD */
++
++/* Bit definitions and macros for PDDR_PCI */
++#define MCF_GPIO_PDDR_PCI_PDDR0               (0x01)  /* PCI_REQ0/PCI_EXTGNT */
++#define MCF_GPIO_PDDR_PCI_PDDR1               (0x02)  /* PCI_REQ1 */
++#define MCF_GPIO_PDDR_PCI_PDDR2               (0x04)  /* PCI_REQ2 */
++#define MCF_GPIO_PDDR_PCI_PDDR3               (0x08)  /* PCI_REQ3 / ATA_INTR */
++#define MCF_GPIO_PDDR_PCI_PDDR4               (0x10)  /* PCI_GNT0/PCI_EXTREQ */
++#define MCF_GPIO_PDDR_PCI_PDDR5               (0x20)  /* PCI_GNT1 /  */
++#define MCF_GPIO_PDDR_PCI_PDDR6               (0x40)  /* PCI_GNT2 /  */
++#define MCF_GPIO_PDDR_PCI_PDDR7               (0x80)  /* PCI_GNT3 / ATA_DMACK */
++
++/* Bit definitions and macros for PDDR_USB */
++#define MCF_GPIO_PDDR_USB_PDDR0               (0x01)  /* USB_VBUS_OC / ULPI_STP */
++#define MCF_GPIO_PDDR_USB_PDDR1               (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
++
++/* Bit definitions and macros for PDDR_ATAH */
++#define MCF_GPIO_PDDR_ATAH_PDDR0      (0x01)  /* ATA_DA0 */
++#define MCF_GPIO_PDDR_ATAH_PDDR1      (0x02)  /* ATA_DA1 */
++#define MCF_GPIO_PDDR_ATAH_PDDR2      (0x04)  /* ATA_DA2 */
++#define MCF_GPIO_PDDR_ATAH_PDDR3      (0x08)  /* ATA_CS0 */
++#define MCF_GPIO_PDDR_ATAH_PDDR4      (0x10)  /* ATA_CS1 */
++#define MCF_GPIO_PDDR_ATAH_PDDR5      (0x20)  /* ATA_BUFFER_EN */
++
++/* Bit definitions and macros for PDDR_ATAL */
++#define MCF_GPIO_PDDR_ATAL_PDDR0      (0x01)  /* ATA_IORDY */
++#define MCF_GPIO_PDDR_ATAL_PDDR1      (0x02)  /* ATA_DMARQ */
++#define MCF_GPIO_PDDR_ATAL_PDDR2      (0x04)  /* ATA_RESET */
++
++/* Bit definitions and macros for PDDR_FEC1H */
++#define MCF_GPIO_PDDR_FEC1H_PDDR0     (0x01)  /* FEC1_CRS / ATA_DATA6 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR1     (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR2     (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR3     (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR4     (0x10)  /* FEC1_COL / ATA_DATA7 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR5     (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR6     (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
++#define MCF_GPIO_PDDR_FEC1H_PDDR7     (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
++
++/* Bit definitions and macros for PDDR_FEC1L */
++#define MCF_GPIO_PDDR_FEC1L_PDDR0     (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR1     (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR2     (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR3     (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR4     (0x10)  /* FEC1_TXER / ATA_DATA0 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR5     (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR6     (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
++#define MCF_GPIO_PDDR_FEC1L_PDDR7     (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
++
++/* Bit definitions and macros for PDDR_FBADH */
++#define MCF_GPIO_PDDR_FBADH_PDDR0     (0x01)  /* FB_AD24 */
++#define MCF_GPIO_PDDR_FBADH_PDDR1     (0x02)  /* FB_AD25 */
++#define MCF_GPIO_PDDR_FBADH_PDDR2     (0x04)  /* FB_AD26 */
++#define MCF_GPIO_PDDR_FBADH_PDDR3     (0x08)  /* FB_AD27 */
++#define MCF_GPIO_PDDR_FBADH_PDDR4     (0x10)  /* FB_AD28 */
++#define MCF_GPIO_PDDR_FBADH_PDDR5     (0x20)  /* FB_AD29 */
++#define MCF_GPIO_PDDR_FBADH_PDDR6     (0x40)  /* FB_AD30 */
++#define MCF_GPIO_PDDR_FBADH_PDDR7     (0x80)  /* FB_AD31 */
++
++/* Bit definitions and macros for PDDR_FBADMH */
++#define MCF_GPIO_PDDR_FBADMH_PDDR0    (0x01)  /* FB_AD16 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR1    (0x02)  /* FB_AD17 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR2    (0x04)  /* FB_AD18 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR3    (0x08)  /* FB_AD19 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR4    (0x10)  /* FB_AD20 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR5    (0x20)  /* FB_AD21 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR6    (0x40)  /* FB_AD22 */
++#define MCF_GPIO_PDDR_FBADMH_PDDR7    (0x80)  /* FB_AD23 */
++
++/* Bit definitions and macros for PDDR_FBADML */
++#define MCF_GPIO_PDDR_FBADML_PDDR0    (0x01)  /* FB_AD8 */
++#define MCF_GPIO_PDDR_FBADML_PDDR1    (0x02)  /* FB_AD9 */
++#define MCF_GPIO_PDDR_FBADML_PDDR2    (0x04)  /* FB_AD10 */
++#define MCF_GPIO_PDDR_FBADML_PDDR3    (0x08)  /* FB_AD11 */
++#define MCF_GPIO_PDDR_FBADML_PDDR4    (0x10)  /* FB_AD12 */
++#define MCF_GPIO_PDDR_FBADML_PDDR5    (0x20)  /* FB_AD13 */
++#define MCF_GPIO_PDDR_FBADML_PDDR6    (0x40)  /* FB_AD14 */
++#define MCF_GPIO_PDDR_FBADML_PDDR7    (0x80)  /* FB_AD15 */
++
++/* Bit definitions and macros for PDDR_FBADL */
++#define MCF_GPIO_PDDR_FBADL_PDDR0     (0x01)  /* FB_AD0 */
++#define MCF_GPIO_PDDR_FBADL_PDDR1     (0x02)  /* FB_AD1 */
++#define MCF_GPIO_PDDR_FBADL_PDDR2     (0x04)  /* FB_AD2 */
++#define MCF_GPIO_PDDR_FBADL_PDDR3     (0x08)  /* FB_AD3 */
++#define MCF_GPIO_PDDR_FBADL_PDDR4     (0x10)  /* FB_AD4 */
++#define MCF_GPIO_PDDR_FBADL_PDDR5     (0x20)  /* FB_AD5 */
++#define MCF_GPIO_PDDR_FBADL_PDDR6     (0x40)  /* FB_AD6 */
++#define MCF_GPIO_PDDR_FBADL_PDDR7     (0x80)  /* FB_AD7 */
++
++/* Bit definitions and macros for PPDSDR_FEC0H */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR0   (0x01)  /* FEC0_CRS / ULPI_DATA6 */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR1   (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR2   (0x04)  /* FEC0_RXDV / FEC0_RMII_CRS_DV */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR3   (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR4   (0x10)  /* FEC0_COL / ULPI_DATA7 */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR5   (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR6   (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDR7   (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
++
++/* Bit definitions and macros for PPDSDR_FEC0L */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR0  (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR1  (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR2  (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR3  (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR4  (0x10)  /* FEC0_TXER / ULPI_DATA0 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR5  (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR6  (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
++#define MCF_GPIO_PPDSDR_FEC0L_PCLRR7  (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
++
++/* Bit definitions and macros for PPDSDR_SSI */
++#define MCF_GPIO_PPDSDR_SSI_PPDR0     (0x01)  /* SSI_TXD / U1TXD */
++#define MCF_GPIO_PPDSDR_SSI_PPDR1     (0x02)  /* SSI_RXD / U1RXD */
++#define MCF_GPIO_PPDSDR_SSI_PPDR2     (0x04)  /* SSI_FS / U1RTS */
++#define MCF_GPIO_PPDSDR_SSI_PPDR3     (0x08)  /* SSI_BCLK / U1CTS */
++#define MCF_GPIO_PPDSDR_SSI_PPDR4     (0x10)  /* SSI_MCLK */
++
++/* Bit definitions and macros for PPDSDR_FBCTL */
++#define MCF_GPIO_PPDSDR_FBCTL_PPDR0   (0x01)  /* FB_TS / FB_ALE / FB_TBST */
++#define MCF_GPIO_PPDSDR_FBCTL_PPDR1   (0x02)  /* FB_RW */
++#define MCF_GPIO_PPDSDR_FBCTL_PPDR2   (0x04)  /* FB_TA */
++#define MCF_GPIO_PPDSDR_FBCTL_PPDR3   (0x08)  /* FB_OE */
++
++/* Bit definitions and macros for PPDSDR_BE */
++#define MCF_GPIO_PPDSDR_BE_PPDR0      (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
++#define MCF_GPIO_PPDSDR_BE_PPDR1      (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
++#define MCF_GPIO_PPDSDR_BE_PPDR2      (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
++#define MCF_GPIO_PPDSDR_BE_PPDR3      (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
++
++/* Bit definitions and macros for PPDSDR_CS */
++#define MCF_GPIO_PPDSDR_CS_PPDR1      (0x02)  /* FB_CS1 */
++#define MCF_GPIO_PPDSDR_CS_PPDR2      (0x04)  /* FB_CS2 */
++#define MCF_GPIO_PPDSDR_CS_PPDR3      (0x08)  /* FB_CS3 */
++
++/* Bit definitions and macros for PPDSDR_DMA */
++#define MCF_GPIO_PPDSDR_DMA_PPDR0     (0x01)  /* DREQ0 */
++#define MCF_GPIO_PPDSDR_DMA_PPDR1     (0x02)  /* DACK0 / DSPI_PCS3 */
++#define MCF_GPIO_PPDSDR_DMA_PPDR2     (0x04)  /* DREQ1 / USB_CLKIN */
++#define MCF_GPIO_PPDSDR_DMA_PPDR3     (0x08)  /* DACK1 / ULPI_DIR */
++
++/* Bit definitions and macros for PPDSDR_FECI2C */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR0  (0x01)  /* I2C_SDA / U2RXD */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR1  (0x02)  /* I2C_SCL / U2TXD */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR2  (0x04)  /* FEC0_MDIO */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR3  (0x08)  /* FEC0_MDC */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR4  (0x10)  /* FEC1_MDIO / ATA_DIOW */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDR5  (0x20)  /* FEC1_MDC / ATA_DIOR */
++
++/* Bit definitions and macros for PPDSDR_UART */
++#define MCF_GPIO_PPDSDR_UART_PPDR0    (0x01)  /* U1TXD */
++#define MCF_GPIO_PPDSDR_UART_PPDR1    (0x02)  /* U1RXD */
++#define MCF_GPIO_PPDSDR_UART_PPDR2    (0x04)  /* U1RTS */
++#define MCF_GPIO_PPDSDR_UART_PPDR3    (0x08)  /* U0CTS */
++#define MCF_GPIO_PPDSDR_UART_PPDR4    (0x10)  /* U1TXD */
++#define MCF_GPIO_PPDSDR_UART_PPDR5    (0x20)  /* U1RXD */
++#define MCF_GPIO_PPDSDR_UART_PPDR6    (0x40)  /* U1RTS */
++#define MCF_GPIO_PPDSDR_UART_PPDR7    (0x80)  /* U1CTS */
++
++/* Bit definitions and macros for PPDSDR_DSPI */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR0    (0x01)  /* DSPI_SOUT / SBF_DO */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR1    (0x02)  /* DSPI_SIN / SBF_DI */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR2    (0x04)  /* DSPI_SCK / SBF_CK */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR3    (0x08)  /* DSPI_PCS0/SS */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR4    (0x10)  /* DSPI_PCS1 / SBF_CS */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR5    (0x20)  /* DSPI_PCS2 */
++#define MCF_GPIO_PPDSDR_DSPI_PPDR6    (0x40)  /* DSPI_PCS5/SS */
++
++/* Bit definitions and macros for PPDSDR_TIMER */
++#define MCF_GPIO_PPDSDR_TIMER_PPDR0   (0x01)  /* T0IN / T0OUT / U2RTS */
++#define MCF_GPIO_PPDSDR_TIMER_PPDR1   (0x02)  /* T1IN / T1OUT / U2CTS */
++#define MCF_GPIO_PPDSDR_TIMER_PPDR2   (0x04)  /* T2IN / T2OUT / U2TXD */
++#define MCF_GPIO_PPDSDR_TIMER_PPDR3   (0x08)  /* T3IN / T3OUT / U2RXD */
++
++/* Bit definitions and macros for PPDSDR_PCI */
++#define MCF_GPIO_PPDSDR_PCI_PPDR0     (0x01)  /* PCI_REQ0/PCI_EXTGNT */
++#define MCF_GPIO_PPDSDR_PCI_PPDR1     (0x02)  /* PCI_REQ1 */
++#define MCF_GPIO_PPDSDR_PCI_PPDR2     (0x04)  /* PCI_REQ2 */
++#define MCF_GPIO_PPDSDR_PCI_PPDR3     (0x08)  /* PCI_REQ3 / ATA_INTR */
++#define MCF_GPIO_PPDSDR_PCI_PPDR4     (0x10)  /* PCI_GNT0/PCI_EXTREQ */
++#define MCF_GPIO_PPDSDR_PCI_PPDR5     (0x20)  /* PCI_GNT1 /  */
++#define MCF_GPIO_PPDSDR_PCI_PPDR6     (0x40)  /* PCI_GNT2 /  */
++#define MCF_GPIO_PPDSDR_PCI_PPDR7     (0x80)  /* PCI_GNT3 / ATA_DMACK */
++
++/* Bit definitions and macros for PPDSDR_USB */
++#define MCF_GPIO_PPDSDR_USB_PPDR0     (0x01)  /* USB_VBUS_OC / ULPI_STP */
++#define MCF_GPIO_PPDSDR_USB_PPDR1     (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
++
++/* Bit definitions and macros for PPDSDR_ATAH */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR0    (0x01)  /* ATA_DA0 */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR1    (0x02)  /* ATA_DA1 */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR2    (0x04)  /* ATA_DA2 */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR3    (0x08)  /* ATA_CS0 */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR4    (0x10)  /* ATA_CS1 */
++#define MCF_GPIO_PPDSDR_ATAH_PPDR5    (0x20)  /* ATA_BUFFER_EN */
++
++/* Bit definitions and macros for PPDSDR_ATAL */
++#define MCF_GPIO_PPDSDR_ATAL_PPDR0    (0x01)  /* ATA_IORDY */
++#define MCF_GPIO_PPDSDR_ATAL_PPDR1    (0x02)  /* ATA_DMARQ */
++#define MCF_GPIO_PPDSDR_ATAL_PPDR2    (0x04)  /* ATA_RESET */
++
++/* Bit definitions and macros for PPDSDR_FEC1H */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR0   (0x01)  /* FEC1_CRS / ATA_DATA6 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR1   (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR2   (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR3   (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR4   (0x10)  /* FEC1_COL / ATA_DATA7 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR5   (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR6   (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDR7   (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
++
++/* Bit definitions and macros for PPDSDR_FEC1L */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR0   (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR1   (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR2   (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR3   (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR4   (0x10)  /* FEC1_TXER / ATA_DATA0 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR5   (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR6   (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDR7   (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
++
++/* Bit definitions and macros for PPDSDR_FBADH */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR0   (0x01)  /* FB_AD24 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR1   (0x02)  /* FB_AD25 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR2   (0x04)  /* FB_AD26 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR3   (0x08)  /* FB_AD27 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR4   (0x10)  /* FB_AD28 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR5   (0x20)  /* FB_AD29 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR6   (0x40)  /* FB_AD30 */
++#define MCF_GPIO_PPDSDR_FBADH_PPDR7   (0x80)  /* FB_AD31 */
++
++/* Bit definitions and macros for PPDSDR_FBADMH */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR0  (0x01)  /* FB_AD16 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR1  (0x02)  /* FB_AD17 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR2  (0x04)  /* FB_AD18 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR3  (0x08)  /* FB_AD19 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR4  (0x10)  /* FB_AD20 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR5  (0x20)  /* FB_AD21 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR6  (0x40)  /* FB_AD22 */
++#define MCF_GPIO_PPDSDR_FBADMH_PPDR7  (0x80)  /* FB_AD23 */
++
++/* Bit definitions and macros for PPDSDR_FBADML */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR0  (0x01)  /* FB_AD8 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR1  (0x02)  /* FB_AD9 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR2  (0x04)  /* FB_AD10 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR3  (0x08)  /* FB_AD11 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR4  (0x10)  /* FB_AD12 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR5  (0x20)  /* FB_AD13 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR6  (0x40)  /* FB_AD14 */
++#define MCF_GPIO_PPDSDR_FBADML_PPDR7  (0x80)  /* FB_AD15 */
++
++/* Bit definitions and macros for PPDSDR_FBADL */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR0   (0x01)  /* FB_AD0 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR1   (0x02)  /* FB_AD1 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR2   (0x04)  /* FB_AD2 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR3   (0x08)  /* FB_AD3 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR4   (0x10)  /* FB_AD4 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR5   (0x20)  /* FB_AD5 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR6   (0x40)  /* FB_AD6 */
++#define MCF_GPIO_PPDSDR_FBADL_PPDR7   (0x80)  /* FB_AD7 */
++
++/* Bit definitions and macros for PCLRR_FEC0H */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR0   (0x01)  /* FEC0_CRS / ULPI_DATA6 */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR1   (0x02)  /* FEC0_RXD0 / FEC0_RMII_RXD0 */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR2   (0x04)  /* FEC0_RXDV/FEC0_RMII_CRS_DV */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR3   (0x08)  /* FEC0_RXCLK / ULPI_DATA1 */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR4   (0x10)  /* FEC0_COL / ULPI_DATA7 */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR5   (0x20)  /* FEC0_TXD0 / FEC0_RMII_TXD0 */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR6   (0x40)  /* FEC0_TXEN / FEC0_RMII_TXEN */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRR7   (0x80)  /* FEC0_TXCLK / FEC0_RMII_REF_CLK */
++
++/* Bit definitions and macros for PCLRR_FEC0L */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR0    (0x01)  /* FEC0_RXER / FEC0_RMII_RXER */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR1    (0x02)  /* FEC0_RXD1 / FEC0_RMII_RXD1 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR2    (0x04)  /* FEC0_RXD2 / ULPI_DATA4 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR3    (0x08)  /* FEC0_RXD3 / ULPI_DATA5 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR4    (0x10)  /* FEC0_TXER / ULPI_DATA0 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR5    (0x20)  /* FEC0_TXD1 / FEC0_RMII_TXD1 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR6    (0x40)  /* FEC0_TXD2 / ULPI_DATA2 */
++#define MCF_GPIO_PCLRR_FEC0L_PPDR7    (0x80)  /* FEC0_TXD3 / ULPI_DATA3 */
++
++/* Bit definitions and macros for PCLRR_SSI */
++#define MCF_GPIO_PCLRR_SSI_PCLRR0     (0x01)  /* SSI_TXD / U1TXD */
++#define MCF_GPIO_PCLRR_SSI_PCLRR1     (0x02)  /* SSI_RXD / U1RXD */
++#define MCF_GPIO_PCLRR_SSI_PCLRR2     (0x04)  /* SSI_FS / U1RTS */
++#define MCF_GPIO_PCLRR_SSI_PCLRR3     (0x08)  /* SSI_BCLK / U1CTS */
++#define MCF_GPIO_PCLRR_SSI_PCLRR4     (0x10)  /* SSI_MCLK */
++
++/* Bit definitions and macros for PCLRR_FBCTL */
++#define MCF_GPIO_PCLRR_FBCTL_PCLRR0   (0x01)  /* FB_TS / FB_ALE / FB_TBST */
++#define MCF_GPIO_PCLRR_FBCTL_PCLRR1   (0x02)  /* FB_RW */
++#define MCF_GPIO_PCLRR_FBCTL_PCLRR2   (0x04)  /* FB_TA */
++#define MCF_GPIO_PCLRR_FBCTL_PCLRR3   (0x08)  /* FB_OE */
++
++/* Bit definitions and macros for PCLRR_BE */
++#define MCF_GPIO_PCLRR_BE_PCLRR0      (0x01)  /* FB_BE/BWE0 / FB_SIZ0 */
++#define MCF_GPIO_PCLRR_BE_PCLRR1      (0x02)  /* FB_BE/BWE1 / FB_SIZ1 */
++#define MCF_GPIO_PCLRR_BE_PCLRR2      (0x04)  /* FB_BE/BWE2 / FB_SIZ2 */
++#define MCF_GPIO_PCLRR_BE_PCLRR3      (0x08)  /* FB_BE/BWE3 / FB_SIZ3 */
++
++/* Bit definitions and macros for PCLRR_CS */
++#define MCF_GPIO_PCLRR_CS_PCLRR1      (0x02)  /* FB_CS1 */
++#define MCF_GPIO_PCLRR_CS_PCLRR2      (0x04)  /* FB_CS2 */
++#define MCF_GPIO_PCLRR_CS_PCLRR3      (0x08)  /* FB_CS3 */
++
++/* Bit definitions and macros for PCLRR_DMA */
++#define MCF_GPIO_PCLRR_DMA_PCLRR0     (0x01)  /* DREQ0 */
++#define MCF_GPIO_PCLRR_DMA_PCLRR1     (0x02)  /* DACK0 / DSPI_PCS3 */
++#define MCF_GPIO_PCLRR_DMA_PCLRR2     (0x04)  /* DREQ1 / USB_CLKIN */
++#define MCF_GPIO_PCLRR_DMA_PCLRR3     (0x08)  /* DACK1 / ULPI_DIR */
++
++/* Bit definitions and macros for PCLRR_FECI2C */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR0  (0x01)  /* I2C_SDA / U2RXD */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR1  (0x02)  /* I2C_SCL / U2TXD */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR2  (0x04)  /* FEC0_MDIO */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR3  (0x08)  /* FEC0_MDC */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR4  (0x10)  /* FEC1_MDIO / ATA_DIOW */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRR5  (0x20)  /* FEC1_MDC / ATA_DIOR */
++
++/* Bit definitions and macros for PCLRR_UART */
++#define MCF_GPIO_PCLRR_UART_PCLRR0    (0x01)  /* U1TXD */
++#define MCF_GPIO_PCLRR_UART_PCLRR1    (0x02)  /* U1RXD */
++#define MCF_GPIO_PCLRR_UART_PCLRR2    (0x04)  /* U1RTS */
++#define MCF_GPIO_PCLRR_UART_PCLRR3    (0x08)  /* U0CTS */
++#define MCF_GPIO_PCLRR_UART_PCLRR4    (0x10)  /* U1TXD */
++#define MCF_GPIO_PCLRR_UART_PCLRR5    (0x20)  /* U1RXD */
++#define MCF_GPIO_PCLRR_UART_PCLRR6    (0x40)  /* U1RTS */
++#define MCF_GPIO_PCLRR_UART_PCLRR7    (0x80)  /* U1CTS */
++
++/* Bit definitions and macros for PCLRR_DSPI */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR0    (0x01)  /* DSPI_SOUT / SBF_DO */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR1    (0x02)  /* DSPI_SIN / SBF_DI */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR2    (0x04)  /* DSPI_SCK / SBF_CK */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR3    (0x08)  /* DSPI_PCS0/SS */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR4    (0x10)  /* DSPI_PCS1 / SBF_CS */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR5    (0x20)  /* DSPI_PCS2 */
++#define MCF_GPIO_PCLRR_DSPI_PCLRR6    (0x40)  /* DSPI_PCS5/SS */
++
++/* Bit definitions and macros for PCLRR_TIMER */
++#define MCF_GPIO_PCLRR_TIMER_PCLRR0   (0x01)  /* T0IN / T0OUT / U2RTS */
++#define MCF_GPIO_PCLRR_TIMER_PCLRR1   (0x02)  /* T1IN / T1OUT / U2CTS */
++#define MCF_GPIO_PCLRR_TIMER_PCLRR2   (0x04)  /* T2IN / T2OUT / U2TXD */
++#define MCF_GPIO_PCLRR_TIMER_PCLRR3   (0x08)  /* T3IN / T3OUT / U2RXD */
++
++/* Bit definitions and macros for PCLRR_PCI */
++#define MCF_GPIO_PCLRR_PCI_PCLRR0     (0x01)  /* PCI_REQ0/PCI_EXTGNT */
++#define MCF_GPIO_PCLRR_PCI_PCLRR1     (0x02)  /* PCI_REQ1 */
++#define MCF_GPIO_PCLRR_PCI_PCLRR2     (0x04)  /* PCI_REQ2 */
++#define MCF_GPIO_PCLRR_PCI_PCLRR3     (0x08)  /* PCI_REQ3 / ATA_INTR */
++#define MCF_GPIO_PCLRR_PCI_PCLRR4     (0x10)  /* PCI_GNT0/PCI_EXTREQ */
++#define MCF_GPIO_PCLRR_PCI_PCLRR5     (0x20)  /* PCI_GNT1 /  */
++#define MCF_GPIO_PCLRR_PCI_PCLRR6     (0x40)  /* PCI_GNT2 /  */
++#define MCF_GPIO_PCLRR_PCI_PCLRR7     (0x80)  /* PCI_GNT3 / ATA_DMACK */
++
++/* Bit definitions and macros for PCLRR_USB */
++#define MCF_GPIO_PCLRR_USB_PCLRR0     (0x01)  /* USB_VBUS_OC / ULPI_STP */
++#define MCF_GPIO_PCLRR_USB_PCLRR1     (0x02)  /* USB_VBUS_EN / USB_PULLUP / ULPI_NXT */
++
++/* Bit definitions and macros for PCLRR_ATAH */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR0    (0x01)  /* ATA_DA0 */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR1    (0x02)  /* ATA_DA1 */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR2    (0x04)  /* ATA_DA2 */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR3    (0x08)  /* ATA_CS0 */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR4    (0x10)  /* ATA_CS1 */
++#define MCF_GPIO_PCLRR_ATAH_PCLRR5    (0x20)  /* ATA_BUFFER_EN */
++
++/* Bit definitions and macros for PCLRR_ATAL */
++#define MCF_GPIO_PCLRR_ATAL_PCLRR0    (0x01)  /* ATA_IORDY */
++#define MCF_GPIO_PCLRR_ATAL_PCLRR1    (0x02)  /* ATA_DMARQ */
++#define MCF_GPIO_PCLRR_ATAL_PCLRR2    (0x04)  /* ATA_RESET */
++
++/* Bit definitions and macros for PCLRR_FEC1H */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR0   (0x01)  /* FEC1_CRS / ATA_DATA6 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR1   (0x02)  /* FEC1_RXD0 / FEC1_RMII_RXD0 / ATA_DATA13 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR2   (0x04)  /* FEC1_RXDV / FEC1_RMII_CRS_DV / ATA_DATA15 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR3   (0x08)  /* FEC1_RXCLK / ATA_DATA5 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR4   (0x10)  /* FEC1_COL / ATA_DATA7 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR5   (0x20)  /* FEC1_TXD0 / FEC1_RMII_TXD0 / ATA_DATA9 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR6   (0x40)  /* FEC1_TXEN / FEC1_RMII_TXEN / ATA_DATA8 */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRR7   (0x80)  /* FEC1_TXCLK / FEC1_RMII_REF_CLK / ATA_DATA11 */
++
++/* Bit definitions and macros for PCLRR_FEC1L */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR0   (0x01)  /* FEC1_RXER / FEC1_RMII_RXER / ATA_DATA12 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR1   (0x02)  /* FEC1_RXD1 / FEC1_RMII_RXD1 / ATA_DATA14 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR2   (0x04)  /* FEC1_RXD2 / ATA_DATA3 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR3   (0x08)  /* FEC1_RXD3 / ATA_DATA4 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR4   (0x10)  /* FEC1_TXER / ATA_DATA0 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR5   (0x20)  /* FEC1_TXD1 / FEC1_RMII_TXD1 / ATA_DATA10 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR6   (0x40)  /* FEC1_TXD2 / ATA_DATA1 */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRR7   (0x80)  /* FEC1_TXD3 / ATA_DATA2 */
++
++/* Bit definitions and macros for PCLRR_FBADH */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR0   (0x01)  /* FB_AD24 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR1   (0x02)  /* FB_AD25 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR2   (0x04)  /* FB_AD26 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR3   (0x08)  /* FB_AD27 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR4   (0x10)  /* FB_AD28 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR5   (0x20)  /* FB_AD29 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR6   (0x40)  /* FB_AD30 */
++#define MCF_GPIO_PCLRR_FBADH_PCLRR7   (0x80)  /* FB_AD31 */
++
++/* Bit definitions and macros for PCLRR_FBADMH */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR0  (0x01)  /* FB_AD16 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR1  (0x02)  /* FB_AD17 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR2  (0x04)  /* FB_AD18 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR3  (0x08)  /* FB_AD19 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR4  (0x10)  /* FB_AD20 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR5  (0x20)  /* FB_AD21 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR6  (0x40)  /* FB_AD22 */
++#define MCF_GPIO_PCLRR_FBADMH_PCLRR7  (0x80)  /* FB_AD23 */
++
++/* Bit definitions and macros for PCLRR_FBADML */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR0  (0x01)  /* FB_AD8 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR1  (0x02)  /* FB_AD9 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR2  (0x04)  /* FB_AD10 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR3  (0x08)  /* FB_AD11 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR4  (0x10)  /* FB_AD12 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR5  (0x20)  /* FB_AD13 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR6  (0x40)  /* FB_AD14 */
++#define MCF_GPIO_PCLRR_FBADML_PCLRR7  (0x80)  /* FB_AD15 */
++
++/* Bit definitions and macros for PCLRR_FBADL */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR0   (0x01)  /* FB_AD0 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR1   (0x02)  /* FB_AD1 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR2   (0x04)  /* FB_AD2 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR3   (0x08)  /* FB_AD3 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR4   (0x10)  /* FB_AD4 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR5   (0x20)  /* FB_AD5 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR6   (0x40)  /* FB_AD6 */
++#define MCF_GPIO_PCLRR_FBADL_PCLRR7   (0x80)  /* FB_AD7 */
++
++/* Bit definitions and macros for PAR_FEC */
++#define MCF_GPIO_PAR_FEC_FEC0(x)      (((x)&0x07))
++#define MCF_GPIO_PAR_FEC_FEC1(x)      (((x)&0x07)<<4)
++#define MCF_GPIO_PAR_FEC_FEC1_MASK    (0x8F)
++#define MCF_GPIO_PAR_FEC_FEC1_MII     (0x70)
++#define MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO       (0x30)
++#define MCF_GPIO_PAR_FEC_FEC1_RMII_ATA        (0x20)
++#define MCF_GPIO_PAR_FEC_FEC1_ATA     (0x10)
++#define MCF_GPIO_PAR_FEC_FEC1_GPIO    (0x00)
++#define MCF_GPIO_PAR_FEC_FEC0_MASK    (0xF8)
++#define MCF_GPIO_PAR_FEC_FEC0_MII     (0x07)
++#define MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO       (0x03)
++#define MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI       (0x02)
++#define MCF_GPIO_PAR_FEC_FEC0_ULPI    (0x01)
++#define MCF_GPIO_PAR_FEC_FEC0_GPIO    (0x00)
++
++/* Bit definitions and macros for PAR_DMA */
++#define MCF_GPIO_PAR_DMA_DREQ0                (0x01)
++#define MCF_GPIO_PAR_DMA_DACK0(x)     (((x)&0x03)<<2)
++#define MCF_GPIO_PAR_DMA_DREQ1(x)     (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_DMA_DACK1(x)     (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_DMA_DACK1_MASK   (0x3F)
++#define MCF_GPIO_PAR_DMA_DACK1_DACK1  (0xC0)
++#define MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR       (0x40)
++#define MCF_GPIO_PAR_DMA_DACK1_GPIO   (0x00)
++#define MCF_GPIO_PAR_DMA_DREQ1_MASK   (0xCF)
++#define MCF_GPIO_PAR_DMA_DREQ1_DREQ1  (0x30)
++#define MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN (0x10)
++#define MCF_GPIO_PAR_DMA_DREQ1_GPIO   (0x00)
++#define MCF_GPIO_PAR_DMA_DACK0_MASK   (0xF3)
++#define MCF_GPIO_PAR_DMA_DACK0_DACK1  (0x0C)
++#define MCF_GPIO_PAR_DMA_DACK0_ULPI_DIR       (0x04)
++#define MCF_GPIO_PAR_DMA_DACK0_GPIO   (0x00)
++#define MCF_GPIO_PAR_DMA_DREQ0_DREQ0  (0x01)
++#define MCF_GPIO_PAR_DMA_DREQ0_GPIO   (0x00)
++
++/* Bit definitions and macros for PAR_FBCTL */
++#define MCF_GPIO_PAR_FBCTL_TS(x)      (((x)&0x03)<<3)
++#define MCF_GPIO_PAR_FBCTL_RW         (0x20)
++#define MCF_GPIO_PAR_FBCTL_TA         (0x40)
++#define MCF_GPIO_PAR_FBCTL_OE         (0x80)
++#define MCF_GPIO_PAR_FBCTL_OE_OE      (0x80)
++#define MCF_GPIO_PAR_FBCTL_OE_GPIO    (0x00)
++#define MCF_GPIO_PAR_FBCTL_TA_TA      (0x40)
++#define MCF_GPIO_PAR_FBCTL_TA_GPIO    (0x00)
++#define MCF_GPIO_PAR_FBCTL_RW_RW      (0x20)
++#define MCF_GPIO_PAR_FBCTL_RW_GPIO    (0x00)
++#define MCF_GPIO_PAR_FBCTL_TS_MASK    (0xE7)
++#define MCF_GPIO_PAR_FBCTL_TS_TS      (0x18)
++#define MCF_GPIO_PAR_FBCTL_TS_ALE     (0x10)
++#define MCF_GPIO_PAR_FBCTL_TS_TBST    (0x08)
++#define MCF_GPIO_PAR_FBCTL_TS_GPIO    (0x80)
++
++/* Bit definitions and macros for PAR_DSPI */
++#define MCF_GPIO_PAR_DSPI_SCK         (0x01)
++#define MCF_GPIO_PAR_DSPI_SOUT                (0x02)
++#define MCF_GPIO_PAR_DSPI_SIN         (0x04)
++#define MCF_GPIO_PAR_DSPI_PCS0                (0x08)
++#define MCF_GPIO_PAR_DSPI_PCS1                (0x10)
++#define MCF_GPIO_PAR_DSPI_PCS2                (0x20)
++#define MCF_GPIO_PAR_DSPI_PCS5                (0x40)
++#define MCF_GPIO_PAR_DSPI_PCS5_PCS5   (0x40)
++#define MCF_GPIO_PAR_DSPI_PCS5_GPIO   (0x00)
++#define MCF_GPIO_PAR_DSPI_PCS2_PCS2   (0x20)
++#define MCF_GPIO_PAR_DSPI_PCS2_GPIO   (0x00)
++#define MCF_GPIO_PAR_DSPI_PCS1_PCS1   (0x10)
++#define MCF_GPIO_PAR_DSPI_PCS1_GPIO   (0x00)
++#define MCF_GPIO_PAR_DSPI_PCS0_PCS0   (0x08)
++#define MCF_GPIO_PAR_DSPI_PCS0_GPIO   (0x00)
++#define MCF_GPIO_PAR_DSPI_SIN_SIN     (0x04)
++#define MCF_GPIO_PAR_DSPI_SIN_GPIO    (0x00)
++#define MCF_GPIO_PAR_DSPI_SOUT_SOUT   (0x02)
++#define MCF_GPIO_PAR_DSPI_SOUT_GPIO   (0x00)
++#define MCF_GPIO_PAR_DSPI_SCK_SCK     (0x01)
++#define MCF_GPIO_PAR_DSPI_SCK_GPIO    (0x00)
++
++/* Bit definitions and macros for PAR_BE */
++#define MCF_GPIO_PAR_BE_BE0           (0x01)
++#define MCF_GPIO_PAR_BE_BE1           (0x04)
++#define MCF_GPIO_PAR_BE_BE2(x)                (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_BE_BE3(x)                (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_BE_BE3_MASK      (0x3F)
++#define MCF_GPIO_PAR_BE_BE3_BE3               (0xC0)
++#define MCF_GPIO_PAR_BE_BE3_TSIZ1     (0x80)
++#define MCF_GPIO_PAR_BE_BE3_GPIO      (0x00)
++#define MCF_GPIO_PAR_BE_BE2_MASK      (0xCF)
++#define MCF_GPIO_PAR_BE_BE2_BE2               (0x30)
++#define MCF_GPIO_PAR_BE_BE2_TSIZ0     (0x20)
++#define MCF_GPIO_PAR_BE_BE2_GPIO      (0x00)
++#define MCF_GPIO_PAR_BE_BE1_BE1               (0x04)
++#define MCF_GPIO_PAR_BE_BE1_GPIO      (0x00)
++#define MCF_GPIO_PAR_BE_BE0_BE0               (0x01)
++#define MCF_GPIO_PAR_BE_BE0_GPIO      (0x00)
++
++/* Bit definitions and macros for PAR_CS */
++#define MCF_GPIO_PAR_CS_CS1           (0x02)
++#define MCF_GPIO_PAR_CS_CS2           (0x04)
++#define MCF_GPIO_PAR_CS_CS3           (0x08)
++#define MCF_GPIO_PAR_CS_CS3_CS3               (0x08)
++#define MCF_GPIO_PAR_CS_CS3_GPIO      (0x00)
++#define MCF_GPIO_PAR_CS_CS2_CS2               (0x04)
++#define MCF_GPIO_PAR_CS_CS2_GPIO      (0x00)
++#define MCF_GPIO_PAR_CS_CS1_CS1               (0x02)
++#define MCF_GPIO_PAR_CS_CS1_GPIO      (0x00)
++
++/* Bit definitions and macros for PAR_TIMER */
++#define MCF_GPIO_PAR_TIMER_T0IN(x)    (((x)&0x03))
++#define MCF_GPIO_PAR_TIMER_T1IN(x)    (((x)&0x03)<<2)
++#define MCF_GPIO_PAR_TIMER_T2IN(x)    (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_TIMER_T3IN(x)    (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_TIMER_T3IN_MASK  (0x3F)
++#define MCF_GPIO_PAR_TIMER_T3IN_T3IN  (0xC0)
++#define MCF_GPIO_PAR_TIMER_T3IN_T3OUT (0x80)
++#define MCF_GPIO_PAR_TIMER_T3IN_U2RXD (0x40)
++#define MCF_GPIO_PAR_TIMER_T3IN_GPIO  (0x00)
++#define MCF_GPIO_PAR_TIMER_T2IN_MASK  (0xCF)
++#define MCF_GPIO_PAR_TIMER_T2IN_T2IN  (0x30)
++#define MCF_GPIO_PAR_TIMER_T2IN_T2OUT (0x20)
++#define MCF_GPIO_PAR_TIMER_T2IN_U2TXD (0x10)
++#define MCF_GPIO_PAR_TIMER_T2IN_GPIO  (0x00)
++#define MCF_GPIO_PAR_TIMER_T1IN_MASK  (0xF3)
++#define MCF_GPIO_PAR_TIMER_T1IN_T1IN  (0x0C)
++#define MCF_GPIO_PAR_TIMER_T1IN_T1OUT (0x08)
++#define MCF_GPIO_PAR_TIMER_T1IN_U2CTS (0x04)
++#define MCF_GPIO_PAR_TIMER_T1IN_GPIO  (0x00)
++#define MCF_GPIO_PAR_TIMER_T0IN_MASK  (0xFC)
++#define MCF_GPIO_PAR_TIMER_T0IN_T0IN  (0x03)
++#define MCF_GPIO_PAR_TIMER_T0IN_T0OUT (0x02)
++#define MCF_GPIO_PAR_TIMER_T0IN_U2RTS (0x01)
++#define MCF_GPIO_PAR_TIMER_T0IN_GPIO  (0x00)
++
++/* Bit definitions and macros for PAR_USB */
++#define MCF_GPIO_PAR_USB_VBUSOC(x)            (((x)&0x03))
++#define MCF_GPIO_PAR_USB_VBUSEN(x)            (((x)&0x03)<<2)
++#define MCF_GPIO_PAR_USB_VBUSEN_MASK          (0xF3)
++#define MCF_GPIO_PAR_USB_VBUSEN_VBUSEN                (0x0C)
++#define MCF_GPIO_PAR_USB_VBUSEN_USBPULLUP     (0x08)
++#define MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT      (0x04)
++#define MCF_GPIO_PAR_USB_VBUSEN_GPIO          (0x00)
++#define MCF_GPIO_PAR_USB_VBUSOC_MASK          (0xFC)
++#define MCF_GPIO_PAR_USB_VBUSOC_VBUSOC                (0x03)
++#define MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP      (0x01)
++#define MCF_GPIO_PAR_USB_VBUSOC_GPIO          (0x00)
++
++/* Bit definitions and macros for PAR_UART */
++#define MCF_GPIO_PAR_UART_U0TXD               (0x01)
++#define MCF_GPIO_PAR_UART_U0RXD               (0x02)
++#define MCF_GPIO_PAR_UART_U0RTS               (0x04)
++#define MCF_GPIO_PAR_UART_U0CTS               (0x08)
++#define MCF_GPIO_PAR_UART_U1TXD               (0x10)
++#define MCF_GPIO_PAR_UART_U1RXD               (0x20)
++#define MCF_GPIO_PAR_UART_U1RTS               (0x40)
++#define MCF_GPIO_PAR_UART_U1CTS               (0x80)
++#define MCF_GPIO_PAR_UART_U1CTS_U1CTS (0x80)
++#define MCF_GPIO_PAR_UART_U1CTS_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U1RTS_U1RTS (0x40)
++#define MCF_GPIO_PAR_UART_U1RTS_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U1RXD_U1RXD (0x20)
++#define MCF_GPIO_PAR_UART_U1RXD_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U1TXD_U1TXD (0x10)
++#define MCF_GPIO_PAR_UART_U1TXD_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U0CTS_U0CTS (0x08)
++#define MCF_GPIO_PAR_UART_U0CTS_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U0RTS_U0RTS (0x04)
++#define MCF_GPIO_PAR_UART_U0RTS_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U0RXD_U0RXD (0x02)
++#define MCF_GPIO_PAR_UART_U0RXD_GPIO  (0x00)
++#define MCF_GPIO_PAR_UART_U0TXD_U0TXD (0x01)
++#define MCF_GPIO_PAR_UART_U0TXD_GPIO  (0x00)
++
++/* Bit definitions and macros for PAR_FECI2C */
++#define MCF_GPIO_PAR_FECI2C_SDA(x)    (((x)&0x0003))
++#define MCF_GPIO_PAR_FECI2C_SCL(x)    (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_FECI2C_PAR_SDA(x)        (((x)&0x0003))
++#define MCF_GPIO_PAR_FECI2C_PAR_SCL(x)        (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_FECI2C_MDIO0     (0x0010)
++#define MCF_GPIO_PAR_FECI2C_MDC0      (0x0040)
++#define MCF_GPIO_PAR_FECI2C_MDIO1(x)  (((x)&0x0003)<<8)
++#define MCF_GPIO_PAR_FECI2C_MDC1(x)   (((x)&0x0003)<<10)
++#define MCF_GPIO_PAR_FECI2C_MDC1_MASK (0xF3FF)
++#define MCF_GPIO_PAR_FECI2C_MDC1_MDC1 (0x0C00)
++#define MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR (0x0800)
++#define MCF_GPIO_PAR_FECI2C_MDC1_GPIO (0x0000)
++#define MCF_GPIO_PAR_FECI2C_MDIO1_MASK        (0xFCFF)
++#define MCF_GPIO_PAR_FECI2C_MDIO1_MDIO1       (0x0300)
++#define MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW (0x0200)
++#define MCF_GPIO_PAR_FECI2C_MDIO1_GPIO        (0x0000)
++#define MCF_GPIO_PAR_FECI2C_MDC0_MDC0 (0x0040)
++#define MCF_GPIO_PAR_FECI2C_MDC0_GPIO (0x0000)
++#define MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0       (0x0010)
++#define MCF_GPIO_PAR_FECI2C_MDIO0_GPIO        (0x0000)
++#define MCF_GPIO_PAR_FECI2C_SCL_MASK  (0xFFF3)
++#define MCF_GPIO_PAR_FECI2C_SCL_SCL   (0x000C)
++#define MCF_GPIO_PAR_FECI2C_SCL_U2TXD (0x0004)
++#define MCF_GPIO_PAR_FECI2C_SCL_GPIO  (0x0000)
++#define MCF_GPIO_PAR_FECI2C_SDA_MASK  (0xFFFC)
++#define MCF_GPIO_PAR_FECI2C_SDA_SDA   (0x0003)
++#define MCF_GPIO_PAR_FECI2C_SDA_U2RXD (0x0001)
++#define MCF_GPIO_PAR_FECI2C_SDA_GPIO  (0x0000)
++
++/* Bit definitions and macros for PAR_SSI */
++#define MCF_GPIO_PAR_SSI_MCLK         (0x0001)
++#define MCF_GPIO_PAR_SSI_STXD(x)      (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_SSI_SRXD(x)      (((x)&0x0003)<<4)
++#define MCF_GPIO_PAR_SSI_FS(x)                (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_SSI_BCLK(x)      (((x)&0x0003)<<8)
++#define MCF_GPIO_PAR_SSI_BCLK_MASK    (0xFCFF)
++#define MCF_GPIO_PAR_SSI_BCLK_BCLK    (0x0300)
++#define MCF_GPIO_PAR_SSI_BCLK_U1CTS   (0x0200)
++#define MCF_GPIO_PAR_SSI_BCLK_GPIO    (0x0000)
++#define MCF_GPIO_PAR_SSI_FS_MASK      (0xFF3F)
++#define MCF_GPIO_PAR_SSI_FS_FS                (0x00C0)
++#define MCF_GPIO_PAR_SSI_FS_U1RTS     (0x0080)
++#define MCF_GPIO_PAR_SSI_FS_GPIO      (0x0000)
++#define MCF_GPIO_PAR_SSI_SRXD_MASK    (0xFFCF)
++#define MCF_GPIO_PAR_SSI_SRXD_SRXD    (0x0030)
++#define MCF_GPIO_PAR_SSI_SRXD_U1RXD   (0x0020)
++#define MCF_GPIO_PAR_SSI_SRXD_GPIO    (0x0000)
++#define MCF_GPIO_PAR_SSI_STXD_MASK    (0xFFF3)
++#define MCF_GPIO_PAR_SSI_STXD_STXD    (0x000C)
++#define MCF_GPIO_PAR_SSI_STXD_U1TXD   (0x0008)
++#define MCF_GPIO_PAR_SSI_STXD_GPIO    (0x0000)
++#define MCF_GPIO_PAR_SSI_MCLK_MCLK    (0x0001)
++#define MCF_GPIO_PAR_SSI_MCLK_GPIO    (0x0000)
++
++/* Bit definitions and macros for PAR_ATA */
++#define MCF_GPIO_PAR_ATA_IORDY                (0x0001)
++#define MCF_GPIO_PAR_ATA_DMARQ                (0x0002)
++#define MCF_GPIO_PAR_ATA_RESET                (0x0004)
++#define MCF_GPIO_PAR_ATA_DA0          (0x0020)
++#define MCF_GPIO_PAR_ATA_DA1          (0x0040)
++#define MCF_GPIO_PAR_ATA_DA2          (0x0080)
++#define MCF_GPIO_PAR_ATA_CS0          (0x0100)
++#define MCF_GPIO_PAR_ATA_CS1          (0x0200)
++#define MCF_GPIO_PAR_ATA_BUFEN                (0x0400)
++#define MCF_GPIO_PAR_ATA_BUFEN_BUFEN  (0x0400)
++#define MCF_GPIO_PAR_ATA_BUFEN_GPIO   (0x0000)
++#define MCF_GPIO_PAR_ATA_CS1_CS1      (0x0200)
++#define MCF_GPIO_PAR_ATA_CS1_GPIO     (0x0000)
++#define MCF_GPIO_PAR_ATA_CS0_CS0      (0x0100)
++#define MCF_GPIO_PAR_ATA_CS0_GPIO     (0x0000)
++#define MCF_GPIO_PAR_ATA_DA2_DA2      (0x0080)
++#define MCF_GPIO_PAR_ATA_DA2_GPIO     (0x0000)
++#define MCF_GPIO_PAR_ATA_DA1_DA1      (0x0040)
++#define MCF_GPIO_PAR_ATA_DA1_GPIO     (0x0000)
++#define MCF_GPIO_PAR_ATA_DA0_DA0      (0x0020)
++#define MCF_GPIO_PAR_ATA_DA0_GPIO     (0x0000)
++#define MCF_GPIO_PAR_ATA_RESET_RESET  (0x0004)
++#define MCF_GPIO_PAR_ATA_RESET_GPIO   (0x0000)
++#define MCF_GPIO_PAR_ATA_DMARQ_DMARQ  (0x0002)
++#define MCF_GPIO_PAR_ATA_DMARQ_GPIO   (0x0000)
++#define MCF_GPIO_PAR_ATA_IORDY_IORDY  (0x0001)
++#define MCF_GPIO_PAR_ATA_IORDY_GPIO   (0x0000)
++
++/* Bit definitions and macros for PAR_IRQ */
++#define MCF_GPIO_PAR_IRQ_IRQ1         (0x02)
++#define MCF_GPIO_PAR_IRQ_IRQ4         (0x10)
++#define MCF_GPIO_PAR_IRQ_IRQ4_IRQ4    (0x10)
++#define MCF_GPIO_PAR_IRQ_IRQ4_GPIO    (0x00)
++#define MCF_GPIO_PAR_IRQ_IRQ1_IRQ1    (0x02)
++#define MCF_GPIO_PAR_IRQ_IRQ1_GPIO    (0x00)
++
++/* Bit definitions and macros for PAR_PCI */
++#define MCF_GPIO_PAR_PCI_REQ0         (0x0001)
++#define MCF_GPIO_PAR_PCI_REQ1         (0x0004)
++#define MCF_GPIO_PAR_PCI_REQ2         (0x0010)
++#define MCF_GPIO_PAR_PCI_REQ3(x)      (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_PCI_GNT0         (0x0100)
++#define MCF_GPIO_PAR_PCI_GNT1         (0x0400)
++#define MCF_GPIO_PAR_PCI_GNT2         (0x1000)
++#define MCF_GPIO_PAR_PCI_GNT3(x)      (((x)&0x0003)<<14)
++#define MCF_GPIO_PAR_PCI_GNT3_MASK    (0x3FFF)
++#define MCF_GPIO_PAR_PCI_GNT3_GNT3    (0xC000)
++#define MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK       (0x8000)
++#define MCF_GPIO_PAR_PCI_GNT3_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_GNT2_GNT2    (0x1000)
++#define MCF_GPIO_PAR_PCI_GNT2_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_GNT1_GNT1    (0x0400)
++#define MCF_GPIO_PAR_PCI_GNT1_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_GNT0_GNT0    (0x0100)
++#define MCF_GPIO_PAR_PCI_GNT0_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_REQ3_MASK    (0xFF3F)
++#define MCF_GPIO_PAR_PCI_REQ3_REQ3    (0x00C0)
++#define MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ       (0x0080)
++#define MCF_GPIO_PAR_PCI_REQ3_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_REQ2_REQ2    (0x0010)
++#define MCF_GPIO_PAR_PCI_REQ2_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_REQ1_REQ1    (0x0040)
++#define MCF_GPIO_PAR_PCI_REQ1_GPIO    (0x0000)
++#define MCF_GPIO_PAR_PCI_REQ0_REQ0    (0x0001)
++#define MCF_GPIO_PAR_PCI_REQ0_GPIO    (0x0000)
++
++/* Bit definitions and macros for MSCR_SDRAM */
++#define MCF_GPIO_MSCR_SDRAM_SDCTL(x)          (((x)&0x03))
++#define MCF_GPIO_MSCR_SDRAM_SDCLK(x)          (((x)&0x03)<<2)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS(x)          (((x)&0x03)<<4)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA(x)         (((x)&0x03)<<6)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA_MASK               (0x3F)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR1               (0xC0)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA_DDR2               (0x80)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA_FS_LPDDR   (0x40)
++#define MCF_GPIO_MSCR_SDRAM_SDDATA_HS_LPDDR   (0x00)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS_MASK                (0xCF)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR1                (0x30)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS_DDR2                (0x20)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS_FS_LPDDR    (0x10)
++#define MCF_GPIO_MSCR_SDRAM_SDDQS_HS_LPDDR    (0x00)
++#define MCF_GPIO_MSCR_SDRAM_SDCLK_MASK                (0xF3)
++#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR1                (0x0C)
++#define MCF_GPIO_MSCR_SDRAM_SDCLK_DDR2                (0x08)
++#define MCF_GPIO_MSCR_SDRAM_SDCLK_FS_LPDDR    (0x04)
++#define MCF_GPIO_MSCR_SDRAM_SDCLK_HS_LPDDR    (0x00)
++#define MCF_GPIO_MSCR_SDRAM_SDCTL_MASK                (0xFC)
++#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR1                (0x03)
++#define MCF_GPIO_MSCR_SDRAM_SDCTL_DDR2                (0x02)
++#define MCF_GPIO_MSCR_SDRAM_SDCTL_FS_LPDDR    (0x01)
++#define MCF_GPIO_MSCR_SDRAM_SDCTL_HS_LPDDR    (0x00)
++
++/* Bit definitions and macros for MSCR_PCI */
++#define MCF_GPIO_MSCR_PCI_PCI         (0x01)
++#define MCF_GPIO_MSCR_PCI_PCI_HI_66MHZ        (0x01)
++#define MCF_GPIO_MSCR_PCI_PCI_LO_33MHZ        (0x00)
++
++/* Bit definitions and macros for DSCR_I2C */
++#define MCF_GPIO_DSCR_I2C_I2C(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_20PF       (0x01)
++#define MCF_GPIO_DSCR_I2C_I2C_LOAD_10PF       (0x00)
++
++/* Bit definitions and macros for DSCR_FLEXBUS */
++#define MCF_GPIO_DSCR_FLEXBUS_FBADL(x)                (((x)&0x03))
++#define MCF_GPIO_DSCR_FLEXBUS_FBADH(x)                (((x)&0x03)<<2)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL(x)                (((x)&0x03)<<4)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK(x)                (((x)&0x03)<<6)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_50PF (0xC0)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_30P  (0x80)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_20PF (0x40)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCLK_LOAD_10PF (0x00)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_50PF (0x30)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_30PF (0x20)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_20PF (0x10)
++#define MCF_GPIO_DSCR_FLEXBUS_FBCTL_LOAD_10PF (0x00)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_50PF (0x0C)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_30PF (0x08)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_20PF (0x04)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADH_LOAD_10PF (0x00)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_50PF (0x03)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_30PF (0x02)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_20PF (0x01)
++#define MCF_GPIO_DSCR_FLEXBUS_FBADL_LOAD_10PF (0x00)
++
++/* Bit definitions and macros for DSCR_FEC */
++#define MCF_GPIO_DSCR_FEC_FEC0(x)             (((x)&0x03))
++#define MCF_GPIO_DSCR_FEC_FEC1(x)             (((x)&0x03)<<2)
++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_50PF      (0x0C)
++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_30PF      (0x08)
++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_20PF      (0x04)
++#define MCF_GPIO_DSCR_FEC_FEC1_LOAD_10PF      (0x00)
++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_50PF      (0x03)
++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_30PF      (0x02)
++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_20PF      (0x01)
++#define MCF_GPIO_DSCR_FEC_FEC0_LOAD_10PF      (0x00)
++
++/* Bit definitions and macros for DSCR_UART */
++#define MCF_GPIO_DSCR_UART_UART0(x)           (((x)&0x03))
++#define MCF_GPIO_DSCR_UART_UART1(x)           (((x)&0x03)<<2)
++#define MCF_GPIO_DSCR_UART_UART1_LOAD_50PF    (0x0C)
++#define MCF_GPIO_DSCR_UART_UART1_LOAD_30PF    (0x08)
++#define MCF_GPIO_DSCR_UART_UART1_LOAD_20PF    (0x04)
++#define MCF_GPIO_DSCR_UART_UART1_LOAD_10PF    (0x00)
++#define MCF_GPIO_DSCR_UART_UART0_LOAD_50PF    (0x03)
++#define MCF_GPIO_DSCR_UART_UART0_LOAD_30PF    (0x02)
++#define MCF_GPIO_DSCR_UART_UART0_LOAD_20PF    (0x01)
++#define MCF_GPIO_DSCR_UART_UART0_LOAD_10PF    (0x00)
++
++/* Bit definitions and macros for DSCR_DSPI */
++#define MCF_GPIO_DSCR_DSPI_DSPI(x)            (((x)&0x03))
++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_50PF     (0x03)
++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_30PF     (0x02)
++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_20PF     (0x01)
++#define MCF_GPIO_DSCR_DSPI_DSPI_LOAD_10PF     (0x00)
++
++/* Bit definitions and macros for DSCR_TIMER */
++#define MCF_GPIO_DSCR_TIMER_TIMER(x)          (((x)&0x03))
++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_50PF   (0x03)
++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_30PF   (0x02)
++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_20PF   (0x01)
++#define MCF_GPIO_DSCR_TIMER_TIMER_LOAD_10PF   (0x00)
++
++/* Bit definitions and macros for DSCR_SSI */
++#define MCF_GPIO_DSCR_SSI_SSI(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_20PF (0x01)
++#define MCF_GPIO_DSCR_SSI_SSI_LOAD_10PF (0x00)
++
++/* Bit definitions and macros for DSCR_DMA */
++#define MCF_GPIO_DSCR_DMA_DMA(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_20PF       (0x01)
++#define MCF_GPIO_DSCR_DMA_DMA_LOAD_10PF       (0x00)
++
++/* Bit definitions and macros for DSCR_DEBUG */
++#define MCF_GPIO_DSCR_DEBUG_DEBUG(x)          (((x)&0x03))
++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_50PF   (0x03)
++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_30PF   (0x02)
++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_20PF   (0x01)
++#define MCF_GPIO_DSCR_DEBUG_DEBUG_LOAD_10PF   (0x00)
++
++/* Bit definitions and macros for DSCR_RESET */
++#define MCF_GPIO_DSCR_RESET_RESET(x)          (((x)&0x03))
++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_50PF   (0x03)
++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_30PF   (0x02)
++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_20PF   (0x01)
++#define MCF_GPIO_DSCR_RESET_RESET_LOAD_10PF   (0x00)
++
++/* Bit definitions and macros for DSCR_IRQ */
++#define MCF_GPIO_DSCR_IRQ_IRQ(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_20PF       (0x01)
++#define MCF_GPIO_DSCR_IRQ_IRQ_LOAD_10PF       (0x00)
++
++/* Bit definitions and macros for DSCR_USB */
++#define MCF_GPIO_DSCR_USB_USB(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_USB_USB_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_USB_USB_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_USB_USB_LOAD_20PF       (0x01)
++#define MCF_GPIO_DSCR_USB_USB_LOAD_10PF       (0x00)
++
++/* Bit definitions and macros for DSCR_ATA */
++#define MCF_GPIO_DSCR_ATA_ATA(x)      (((x)&0x03))
++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_50PF       (0x03)
++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_30PF       (0x02)
++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_20PF       (0x01)
++#define MCF_GPIO_DSCR_ATA_ATA_LOAD_10PF       (0x00)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_GPIO_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_i2c.h
+@@ -0,0 +1,39 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_I2C_H__
++#define __MCF5445X_I2C_H__
++
++/*********************************************************************
++*
++* I2C Module (I2C)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_I2C_I2ADR (volatile u8 *)(0xFC058000)
++#define MCF_I2C_I2FDR (volatile u8 *)(0xFC058004)
++#define MCF_I2C_I2CR  (volatile u8 *)(0xFC058008)
++#define MCF_I2C_I2SR  (volatile u8 *)(0xFC05800C)
++#define MCF_I2C_I2DR  (volatile u8 *)(0xFC058010)
++
++/* Bit definitions and macros for I2AR */
++#define MCF_I2C_I2AR_ADR(x)   (((x)&0x7F)<<1)
++
++/* Bit definitions and macros for I2FDR */
++#define MCF_I2C_I2FDR_IC(x)   (((x)&0x3F))
++
++/* Bit definitions and macros for I2DR */
++#define MCF_I2C_I2DR_DATA(x)  (x)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_I2C_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_intc.h
+@@ -0,0 +1,724 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_INTC_H__
++#define __MCF5445X_INTC_H__
++
++/*********************************************************************
++*
++* Interrupt Controller (INTC)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_INTC0_IPRH          MCF_REG32(0xFC048000)
++#define MCF_INTC0_IPRL          MCF_REG32(0xFC048004)
++#define MCF_INTC0_IMRH          MCF_REG32(0xFC048008)
++#define MCF_INTC0_IMRL          MCF_REG32(0xFC04800C)
++#define MCF_INTC0_INTFRCH       MCF_REG32(0xFC048010)
++#define MCF_INTC0_INTFRCL       MCF_REG32(0xFC048014)
++#define MCF_INTC0_ICONFIG       MCF_REG16(0xFC04801A)
++#define MCF_INTC0_SIMR          MCF_REG08(0xFC04801C)
++#define MCF_INTC0_CIMR          MCF_REG08(0xFC04801D)
++#define MCF_INTC0_CLMASK        MCF_REG08(0xFC04801E)
++#define MCF_INTC0_SLMASK        MCF_REG08(0xFC04801F)
++#define MCF_INTC0_ICR1          MCF_REG08(0xFC048041)
++#define MCF_INTC0_ICR2          MCF_REG08(0xFC048042)
++#define MCF_INTC0_ICR3          MCF_REG08(0xFC048043)
++#define MCF_INTC0_ICR4          MCF_REG08(0xFC048044)
++#define MCF_INTC0_ICR5          MCF_REG08(0xFC048045)
++#define MCF_INTC0_ICR6          MCF_REG08(0xFC048046)
++#define MCF_INTC0_ICR7          MCF_REG08(0xFC048047)
++#define MCF_INTC0_ICR8          MCF_REG08(0xFC048048)
++#define MCF_INTC0_ICR9          MCF_REG08(0xFC048049)
++#define MCF_INTC0_ICR10         MCF_REG08(0xFC04804A)
++#define MCF_INTC0_ICR11         MCF_REG08(0xFC04804B)
++#define MCF_INTC0_ICR12         MCF_REG08(0xFC04804C)
++#define MCF_INTC0_ICR13         MCF_REG08(0xFC04804D)
++#define MCF_INTC0_ICR14         MCF_REG08(0xFC04804E)
++#define MCF_INTC0_ICR15         MCF_REG08(0xFC04804F)
++#define MCF_INTC0_ICR16         MCF_REG08(0xFC048050)
++#define MCF_INTC0_ICR17         MCF_REG08(0xFC048051)
++#define MCF_INTC0_ICR18         MCF_REG08(0xFC048052)
++#define MCF_INTC0_ICR19         MCF_REG08(0xFC048053)
++#define MCF_INTC0_ICR20         MCF_REG08(0xFC048054)
++#define MCF_INTC0_ICR21         MCF_REG08(0xFC048055)
++#define MCF_INTC0_ICR22         MCF_REG08(0xFC048056)
++#define MCF_INTC0_ICR23         MCF_REG08(0xFC048057)
++#define MCF_INTC0_ICR24         MCF_REG08(0xFC048058)
++#define MCF_INTC0_ICR25         MCF_REG08(0xFC048059)
++#define MCF_INTC0_ICR26         MCF_REG08(0xFC04805A)
++#define MCF_INTC0_ICR27         MCF_REG08(0xFC04805B)
++#define MCF_INTC0_ICR28         MCF_REG08(0xFC04805C)
++#define MCF_INTC0_ICR29         MCF_REG08(0xFC04805D)
++#define MCF_INTC0_ICR30         MCF_REG08(0xFC04805E)
++#define MCF_INTC0_ICR31         MCF_REG08(0xFC04805F)
++#define MCF_INTC0_ICR32         MCF_REG08(0xFC048060)
++#define MCF_INTC0_ICR33         MCF_REG08(0xFC048061)
++#define MCF_INTC0_ICR34         MCF_REG08(0xFC048062)
++#define MCF_INTC0_ICR35         MCF_REG08(0xFC048063)
++#define MCF_INTC0_ICR36         MCF_REG08(0xFC048064)
++#define MCF_INTC0_ICR37         MCF_REG08(0xFC048065)
++#define MCF_INTC0_ICR38         MCF_REG08(0xFC048066)
++#define MCF_INTC0_ICR39         MCF_REG08(0xFC048067)
++#define MCF_INTC0_ICR40         MCF_REG08(0xFC048068)
++#define MCF_INTC0_ICR41         MCF_REG08(0xFC048069)
++#define MCF_INTC0_ICR42         MCF_REG08(0xFC04806A)
++#define MCF_INTC0_ICR43         MCF_REG08(0xFC04806B)
++#define MCF_INTC0_ICR44         MCF_REG08(0xFC04806C)
++#define MCF_INTC0_ICR45         MCF_REG08(0xFC04806D)
++#define MCF_INTC0_ICR46         MCF_REG08(0xFC04806E)
++#define MCF_INTC0_ICR47         MCF_REG08(0xFC04806F)
++#define MCF_INTC0_ICR48         MCF_REG08(0xFC048070)
++#define MCF_INTC0_ICR49         MCF_REG08(0xFC048071)
++#define MCF_INTC0_ICR50         MCF_REG08(0xFC048072)
++#define MCF_INTC0_ICR51         MCF_REG08(0xFC048073)
++#define MCF_INTC0_ICR52         MCF_REG08(0xFC048074)
++#define MCF_INTC0_ICR53         MCF_REG08(0xFC048075)
++#define MCF_INTC0_ICR54         MCF_REG08(0xFC048076)
++#define MCF_INTC0_ICR55         MCF_REG08(0xFC048077)
++#define MCF_INTC0_ICR56         MCF_REG08(0xFC048078)
++#define MCF_INTC0_ICR57         MCF_REG08(0xFC048079)
++#define MCF_INTC0_ICR58         MCF_REG08(0xFC04807A)
++#define MCF_INTC0_ICR59         MCF_REG08(0xFC04807B)
++#define MCF_INTC0_ICR60         MCF_REG08(0xFC04807C)
++#define MCF_INTC0_ICR61         MCF_REG08(0xFC04807D)
++#define MCF_INTC0_ICR62         MCF_REG08(0xFC04807E)
++#define MCF_INTC0_ICR63         MCF_REG08(0xFC04807F)
++#define MCF_INTC0_SWIACK        MCF_REG08(0xFC0480E0)
++#define MCF_INTC0_L1IACK        MCF_REG08(0xFC0480E4)
++#define MCF_INTC0_L2IACK        MCF_REG08(0xFC0480E8)
++#define MCF_INTC0_L3IACK        MCF_REG08(0xFC0480EC)
++#define MCF_INTC0_L4IACK        MCF_REG08(0xFC0480F0)
++#define MCF_INTC0_L5IACK        MCF_REG08(0xFC0480F4)
++#define MCF_INTC0_L6IACK        MCF_REG08(0xFC0480F8)
++#define MCF_INTC0_L7IACK        MCF_REG08(0xFC0480FC)
++#define MCF_INTC1_IPRH          MCF_REG32(0xFC04C000)
++#define MCF_INTC1_IPRL          MCF_REG32(0xFC04C004)
++#define MCF_INTC1_IMRH          MCF_REG32(0xFC04C008)
++#define MCF_INTC1_IMRL          MCF_REG32(0xFC04C00C)
++#define MCF_INTC1_INTFRCH       MCF_REG32(0xFC04C010)
++#define MCF_INTC1_INTFRCL       MCF_REG32(0xFC04C014)
++#define MCF_INTC1_ICONFIG       MCF_REG16(0xFC04C01A)
++#define MCF_INTC1_SIMR          MCF_REG08(0xFC04C01C)
++#define MCF_INTC1_CIMR          MCF_REG08(0xFC04C01D)
++#define MCF_INTC1_CLMASK        MCF_REG08(0xFC04C01E)
++#define MCF_INTC1_SLMASK        MCF_REG08(0xFC04C01F)
++#define MCF_INTC1_ICR1          MCF_REG08(0xFC04C041)
++#define MCF_INTC1_ICR2          MCF_REG08(0xFC04C042)
++#define MCF_INTC1_ICR3          MCF_REG08(0xFC04C043)
++#define MCF_INTC1_ICR4          MCF_REG08(0xFC04C044)
++#define MCF_INTC1_ICR5          MCF_REG08(0xFC04C045)
++#define MCF_INTC1_ICR6          MCF_REG08(0xFC04C046)
++#define MCF_INTC1_ICR7          MCF_REG08(0xFC04C047)
++#define MCF_INTC1_ICR8          MCF_REG08(0xFC04C048)
++#define MCF_INTC1_ICR9          MCF_REG08(0xFC04C049)
++#define MCF_INTC1_ICR10         MCF_REG08(0xFC04C04A)
++#define MCF_INTC1_ICR11         MCF_REG08(0xFC04C04B)
++#define MCF_INTC1_ICR12         MCF_REG08(0xFC04C04C)
++#define MCF_INTC1_ICR13         MCF_REG08(0xFC04C04D)
++#define MCF_INTC1_ICR14         MCF_REG08(0xFC04C04E)
++#define MCF_INTC1_ICR15         MCF_REG08(0xFC04C04F)
++#define MCF_INTC1_ICR16         MCF_REG08(0xFC04C050)
++#define MCF_INTC1_ICR17         MCF_REG08(0xFC04C051)
++#define MCF_INTC1_ICR18         MCF_REG08(0xFC04C052)
++#define MCF_INTC1_ICR19         MCF_REG08(0xFC04C053)
++#define MCF_INTC1_ICR20         MCF_REG08(0xFC04C054)
++#define MCF_INTC1_ICR21         MCF_REG08(0xFC04C055)
++#define MCF_INTC1_ICR22         MCF_REG08(0xFC04C056)
++#define MCF_INTC1_ICR23         MCF_REG08(0xFC04C057)
++#define MCF_INTC1_ICR24         MCF_REG08(0xFC04C058)
++#define MCF_INTC1_ICR25         MCF_REG08(0xFC04C059)
++#define MCF_INTC1_ICR26         MCF_REG08(0xFC04C05A)
++#define MCF_INTC1_ICR27         MCF_REG08(0xFC04C05B)
++#define MCF_INTC1_ICR28         MCF_REG08(0xFC04C05C)
++#define MCF_INTC1_ICR29         MCF_REG08(0xFC04C05D)
++#define MCF_INTC1_ICR30         MCF_REG08(0xFC04C05E)
++#define MCF_INTC1_ICR31         MCF_REG08(0xFC04C05F)
++#define MCF_INTC1_ICR32         MCF_REG08(0xFC04C060)
++#define MCF_INTC1_ICR33         MCF_REG08(0xFC04C061)
++#define MCF_INTC1_ICR34         MCF_REG08(0xFC04C062)
++#define MCF_INTC1_ICR35         MCF_REG08(0xFC04C063)
++#define MCF_INTC1_ICR36         MCF_REG08(0xFC04C064)
++#define MCF_INTC1_ICR37         MCF_REG08(0xFC04C065)
++#define MCF_INTC1_ICR38         MCF_REG08(0xFC04C066)
++#define MCF_INTC1_ICR39         MCF_REG08(0xFC04C067)
++#define MCF_INTC1_ICR40         MCF_REG08(0xFC04C068)
++#define MCF_INTC1_ICR41         MCF_REG08(0xFC04C069)
++#define MCF_INTC1_ICR42         MCF_REG08(0xFC04C06A)
++#define MCF_INTC1_ICR43         MCF_REG08(0xFC04C06B)
++#define MCF_INTC1_ICR44         MCF_REG08(0xFC04C06C)
++#define MCF_INTC1_ICR45         MCF_REG08(0xFC04C06D)
++#define MCF_INTC1_ICR46         MCF_REG08(0xFC04C06E)
++#define MCF_INTC1_ICR47         MCF_REG08(0xFC04C06F)
++#define MCF_INTC1_ICR48         MCF_REG08(0xFC04C070)
++#define MCF_INTC1_ICR49         MCF_REG08(0xFC04C071)
++#define MCF_INTC1_ICR50         MCF_REG08(0xFC04C072)
++#define MCF_INTC1_ICR51         MCF_REG08(0xFC04C073)
++#define MCF_INTC1_ICR52         MCF_REG08(0xFC04C074)
++#define MCF_INTC1_ICR53         MCF_REG08(0xFC04C075)
++#define MCF_INTC1_ICR54         MCF_REG08(0xFC04C076)
++#define MCF_INTC1_ICR55         MCF_REG08(0xFC04C077)
++#define MCF_INTC1_ICR56         MCF_REG08(0xFC04C078)
++#define MCF_INTC1_ICR57         MCF_REG08(0xFC04C079)
++#define MCF_INTC1_ICR58         MCF_REG08(0xFC04C07A)
++#define MCF_INTC1_ICR59         MCF_REG08(0xFC04C07B)
++#define MCF_INTC1_ICR60         MCF_REG08(0xFC04C07C)
++#define MCF_INTC1_ICR61         MCF_REG08(0xFC04C07D)
++#define MCF_INTC1_ICR62         MCF_REG08(0xFC04C07E)
++#define MCF_INTC1_ICR63         MCF_REG08(0xFC04C07F)
++#define MCF_INTC1_SWIACK        MCF_REG08(0xFC04C0E0)
++#define MCF_INTC1_L1IACK        MCF_REG08(0xFC04C0E4)
++#define MCF_INTC1_L2IACK        MCF_REG08(0xFC04C0E8)
++#define MCF_INTC1_L3IACK        MCF_REG08(0xFC04C0EC)
++#define MCF_INTC1_L4IACK        MCF_REG08(0xFC04C0F0)
++#define MCF_INTC1_L5IACK        MCF_REG08(0xFC04C0F4)
++#define MCF_INTC1_L6IACK        MCF_REG08(0xFC04C0F8
++#define MCF_INTC1_L7IACK        MCF_REG08(0xFC04C0FC)
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_INTC0_ICR(x)        MCF_REG08(0xFC048041+((x-1)*0x001))
++#define MCF_INTC0_LIACK(x)      MCF_REG08(0xFC0480E4+((x-1)*0x004))
++#define MCF_INTC1_ICR(x)        MCF_REG08(0xFC04C041+((x-1)*0x001))
++#define MCF_INTC1_LIACK(x)      MCF_REG08(0xFC04C0E4+((x-1)*0x004))
++
++/* Parameterized register read/write macros for multiple modules */
++#define MCF_INTC_IPRH(x)        MCF_REG32(0xFC048000+((x)*0x4000))
++#define MCF_INTC_IPRL(x)        MCF_REG32(0xFC048004+((x)*0x4000))
++#define MCF_INTC_IMRH(x)        MCF_REG32(0xFC048008+((x)*0x4000))
++#define MCF_INTC_IMRL(x)        MCF_REG32(0xFC04800C+((x)*0x4000))
++#define MCF_INTC_INTFRCH(x)     MCF_REG32(0xFC048010+((x)*0x4000))
++#define MCF_INTC_INTFRCL(x)     MCF_REG32(0xFC048014+((x)*0x4000))
++#define MCF_INTC_ICONFIG(x)     MCF_REG16(0xFC04801A+((x)*0x4000))
++#define MCF_INTC_SIMR(x)        MCF_REG08(0xFC04801C+((x)*0x4000))
++#define MCF_INTC_CIMR(x)        MCF_REG08(0xFC04801D+((x)*0x4000))
++#define MCF_INTC_CLMASK(x)      MCF_REG08(0xFC04801E+((x)*0x4000))
++#define MCF_INTC_SLMASK(x)      MCF_REG08(0xFC04801F+((x)*0x4000))
++#define MCF_INTC_ICR1(x)        MCF_REG08(0xFC048041+((x)*0x4000))
++#define MCF_INTC_ICR2(x)        MCF_REG08(0xFC048042+((x)*0x4000))
++#define MCF_INTC_ICR3(x)        MCF_REG08(0xFC048043+((x)*0x4000))
++#define MCF_INTC_ICR4(x)        MCF_REG08(0xFC048044+((x)*0x4000))
++#define MCF_INTC_ICR5(x)        MCF_REG08(0xFC048045+((x)*0x4000))
++#define MCF_INTC_ICR6(x)        MCF_REG08(0xFC048046+((x)*0x4000))
++#define MCF_INTC_ICR7(x)        MCF_REG08(0xFC048047+((x)*0x4000))
++#define MCF_INTC_ICR8(x)        MCF_REG08(0xFC048048+((x)*0x4000))
++#define MCF_INTC_ICR9(x)        MCF_REG08(0xFC048049+((x)*0x4000))
++#define MCF_INTC_ICR10(x)       MCF_REG08(0xFC04804A+((x)*0x4000))
++#define MCF_INTC_ICR11(x)       MCF_REG08(0xFC04804B+((x)*0x4000))
++#define MCF_INTC_ICR12(x)       MCF_REG08(0xFC04804C+((x)*0x4000))
++#define MCF_INTC_ICR13(x)       MCF_REG08(0xFC04804D+((x)*0x4000))
++#define MCF_INTC_ICR14(x)       MCF_REG08(0xFC04804E+((x)*0x4000))
++#define MCF_INTC_ICR15(x)       MCF_REG08(0xFC04804F+((x)*0x4000))
++#define MCF_INTC_ICR16(x)       MCF_REG08(0xFC048050+((x)*0x4000))
++#define MCF_INTC_ICR17(x)       MCF_REG08(0xFC048051+((x)*0x4000))
++#define MCF_INTC_ICR18(x)       MCF_REG08(0xFC048052+((x)*0x4000))
++#define MCF_INTC_ICR19(x)       MCF_REG08(0xFC048053+((x)*0x4000))
++#define MCF_INTC_ICR20(x)       MCF_REG08(0xFC048054+((x)*0x4000))
++#define MCF_INTC_ICR21(x)       MCF_REG08(0xFC048055+((x)*0x4000))
++#define MCF_INTC_ICR22(x)       MCF_REG08(0xFC048056+((x)*0x4000))
++#define MCF_INTC_ICR23(x)       MCF_REG08(0xFC048057+((x)*0x4000))
++#define MCF_INTC_ICR24(x)       MCF_REG08(0xFC048058+((x)*0x4000))
++#define MCF_INTC_ICR25(x)       MCF_REG08(0xFC048059+((x)*0x4000))
++#define MCF_INTC_ICR26(x)       MCF_REG08(0xFC04805A+((x)*0x4000))
++#define MCF_INTC_ICR27(x)       MCF_REG08(0xFC04805B+((x)*0x4000))
++#define MCF_INTC_ICR28(x)       MCF_REG08(0xFC04805C+((x)*0x4000))
++#define MCF_INTC_ICR29(x)       MCF_REG08(0xFC04805D+((x)*0x4000))
++#define MCF_INTC_ICR30(x)       MCF_REG08(0xFC04805E+((x)*0x4000))
++#define MCF_INTC_ICR31(x)       MCF_REG08(0xFC04805F+((x)*0x4000))
++#define MCF_INTC_ICR32(x)       MCF_REG08(0xFC048060+((x)*0x4000))
++#define MCF_INTC_ICR33(x)       MCF_REG08(0xFC048061+((x)*0x4000))
++#define MCF_INTC_ICR34(x)       MCF_REG08(0xFC048062+((x)*0x4000))
++#define MCF_INTC_ICR35(x)       MCF_REG08(0xFC048063+((x)*0x4000))
++#define MCF_INTC_ICR36(x)       MCF_REG08(0xFC048064+((x)*0x4000))
++#define MCF_INTC_ICR37(x)       MCF_REG08(0xFC048065+((x)*0x4000))
++#define MCF_INTC_ICR38(x)       MCF_REG08(0xFC048066+((x)*0x4000))
++#define MCF_INTC_ICR39(x)       MCF_REG08(0xFC048067+((x)*0x4000))
++#define MCF_INTC_ICR40(x)       MCF_REG08(0xFC048068+((x)*0x4000))
++#define MCF_INTC_ICR41(x)       MCF_REG08(0xFC048069+((x)*0x4000))
++#define MCF_INTC_ICR42(x)       MCF_REG08(0xFC04806A+((x)*0x4000))
++#define MCF_INTC_ICR43(x)       MCF_REG08(0xFC04806B+((x)*0x4000))
++#define MCF_INTC_ICR44(x)       MCF_REG08(0xFC04806C+((x)*0x4000))
++#define MCF_INTC_ICR45(x)       MCF_REG08(0xFC04806D+((x)*0x4000))
++#define MCF_INTC_ICR46(x)       MCF_REG08(0xFC04806E+((x)*0x4000))
++#define MCF_INTC_ICR47(x)       MCF_REG08(0xFC04806F+((x)*0x4000))
++#define MCF_INTC_ICR48(x)       MCF_REG08(0xFC048070+((x)*0x4000))
++#define MCF_INTC_ICR49(x)       MCF_REG08(0xFC048071+((x)*0x4000))
++#define MCF_INTC_ICR50(x)       MCF_REG08(0xFC048072+((x)*0x4000))
++#define MCF_INTC_ICR51(x)       MCF_REG08(0xFC048073+((x)*0x4000))
++#define MCF_INTC_ICR52(x)       MCF_REG08(0xFC048074+((x)*0x4000))
++#define MCF_INTC_ICR53(x)       MCF_REG08(0xFC048075+((x)*0x4000))
++#define MCF_INTC_ICR54(x)       MCF_REG08(0xFC048076+((x)*0x4000))
++#define MCF_INTC_ICR55(x)       MCF_REG08(0xFC048077+((x)*0x4000))
++#define MCF_INTC_ICR56(x)       MCF_REG08(0xFC048078+((x)*0x4000))
++#define MCF_INTC_ICR57(x)       MCF_REG08(0xFC048079+((x)*0x4000))
++#define MCF_INTC_ICR58(x)       MCF_REG08(0xFC04807A+((x)*0x4000))
++#define MCF_INTC_ICR59(x)       MCF_REG08(0xFC04807B+((x)*0x4000))
++#define MCF_INTC_ICR60(x)       MCF_REG08(0xFC04807C+((x)*0x4000))
++#define MCF_INTC_ICR61(x)       MCF_REG08(0xFC04807D+((x)*0x4000))
++#define MCF_INTC_ICR62(x)       MCF_REG08(0xFC04807E+((x)*0x4000))
++#define MCF_INTC_ICR63(x)       MCF_REG08(0xFC04807F+((x)*0x4000))
++#define MCF_INTC_SWIACK(x)      MCF_REG08(0xFC0480E0+((x)*0x4000))
++#define MCF_INTC_L1IACK(x)      MCF_REG08(0xFC0480E4+((x)*0x4000))
++#define MCF_INTC_L2IACK(x)      MCF_REG08(0xFC0480E8+((x)*0x4000))
++#define MCF_INTC_L3IACK(x)      MCF_REG08(0xFC0480EC+((x)*0x4000))
++#define MCF_INTC_L4IACK(x)      MCF_REG08(0xFC0480F0+((x)*0x4000))
++#define MCF_INTC_L5IACK(x)      MCF_REG08(0xFC0480F4+((x)*0x4000))
++#define MCF_INTC_L6IACK(x)      MCF_REG08(0xFC0480F8+((x)*0x4000))
++#define MCF_INTC_L7IACK(x)      MCF_REG08(0xFC0480FC+((x)*0x4000))
++
++/* Bit definitions and macros for IPRH */
++#define MCF_INTC_IPRH_INT32     (0x00000001)
++#define MCF_INTC_IPRH_INT33     (0x00000002)
++#define MCF_INTC_IPRH_INT34     (0x00000004)
++#define MCF_INTC_IPRH_INT35     (0x00000008)
++#define MCF_INTC_IPRH_INT36     (0x00000010)
++#define MCF_INTC_IPRH_INT37     (0x00000020)
++#define MCF_INTC_IPRH_INT38     (0x00000040)
++#define MCF_INTC_IPRH_INT39     (0x00000080)
++#define MCF_INTC_IPRH_INT40     (0x00000100)
++#define MCF_INTC_IPRH_INT41     (0x00000200)
++#define MCF_INTC_IPRH_INT42     (0x00000400)
++#define MCF_INTC_IPRH_INT43     (0x00000800)
++#define MCF_INTC_IPRH_INT44     (0x00001000)
++#define MCF_INTC_IPRH_INT45     (0x00002000)
++#define MCF_INTC_IPRH_INT46     (0x00004000)
++#define MCF_INTC_IPRH_INT47     (0x00008000)
++#define MCF_INTC_IPRH_INT48     (0x00010000)
++#define MCF_INTC_IPRH_INT49     (0x00020000)
++#define MCF_INTC_IPRH_INT50     (0x00040000)
++#define MCF_INTC_IPRH_INT51     (0x00080000)
++#define MCF_INTC_IPRH_INT52     (0x00100000)
++#define MCF_INTC_IPRH_INT53     (0x00200000)
++#define MCF_INTC_IPRH_INT54     (0x00400000)
++#define MCF_INTC_IPRH_INT55     (0x00800000)
++#define MCF_INTC_IPRH_INT56     (0x01000000)
++#define MCF_INTC_IPRH_INT57     (0x02000000)
++#define MCF_INTC_IPRH_INT58     (0x04000000)
++#define MCF_INTC_IPRH_INT59     (0x08000000)
++#define MCF_INTC_IPRH_INT60     (0x10000000)
++#define MCF_INTC_IPRH_INT61     (0x20000000)
++#define MCF_INTC_IPRH_INT62     (0x40000000)
++#define MCF_INTC_IPRH_INT63     (0x80000000)
++
++/* Bit definitions and macros for IPRL */
++#define MCF_INTC_IPRL_INT0      (0x00000001)
++#define MCF_INTC_IPRL_INT1      (0x00000002)
++#define MCF_INTC_IPRL_INT2      (0x00000004)
++#define MCF_INTC_IPRL_INT3      (0x00000008)
++#define MCF_INTC_IPRL_INT4      (0x00000010)
++#define MCF_INTC_IPRL_INT5      (0x00000020)
++#define MCF_INTC_IPRL_INT6      (0x00000040)
++#define MCF_INTC_IPRL_INT7      (0x00000080)
++#define MCF_INTC_IPRL_INT8      (0x00000100)
++#define MCF_INTC_IPRL_INT9      (0x00000200)
++#define MCF_INTC_IPRL_INT10     (0x00000400)
++#define MCF_INTC_IPRL_INT11     (0x00000800)
++#define MCF_INTC_IPRL_INT12     (0x00001000)
++#define MCF_INTC_IPRL_INT13     (0x00002000)
++#define MCF_INTC_IPRL_INT14     (0x00004000)
++#define MCF_INTC_IPRL_INT15     (0x00008000)
++#define MCF_INTC_IPRL_INT16     (0x00010000)
++#define MCF_INTC_IPRL_INT17     (0x00020000)
++#define MCF_INTC_IPRL_INT18     (0x00040000)
++#define MCF_INTC_IPRL_INT19     (0x00080000)
++#define MCF_INTC_IPRL_INT20     (0x00100000)
++#define MCF_INTC_IPRL_INT21     (0x00200000)
++#define MCF_INTC_IPRL_INT22     (0x00400000)
++#define MCF_INTC_IPRL_INT23     (0x00800000)
++#define MCF_INTC_IPRL_INT24     (0x01000000)
++#define MCF_INTC_IPRL_INT25     (0x02000000)
++#define MCF_INTC_IPRL_INT26     (0x04000000)
++#define MCF_INTC_IPRL_INT27     (0x08000000)
++#define MCF_INTC_IPRL_INT28     (0x10000000)
++#define MCF_INTC_IPRL_INT29     (0x20000000)
++#define MCF_INTC_IPRL_INT30     (0x40000000)
++#define MCF_INTC_IPRL_INT31     (0x80000000)
++
++/* Bit definitions and macros for IMRH */
++#define MCF_INTC_IMRH_INT_MASK32    (0x00000001)
++#define MCF_INTC_IMRH_INT_MASK33    (0x00000002)
++#define MCF_INTC_IMRH_INT_MASK34    (0x00000004)
++#define MCF_INTC_IMRH_INT_MASK35    (0x00000008)
++#define MCF_INTC_IMRH_INT_MASK36    (0x00000010)
++#define MCF_INTC_IMRH_INT_MASK37    (0x00000020)
++#define MCF_INTC_IMRH_INT_MASK38    (0x00000040)
++#define MCF_INTC_IMRH_INT_MASK39    (0x00000080)
++#define MCF_INTC_IMRH_INT_MASK40    (0x00000100)
++#define MCF_INTC_IMRH_INT_MASK41    (0x00000200)
++#define MCF_INTC_IMRH_INT_MASK42    (0x00000400)
++#define MCF_INTC_IMRH_INT_MASK43    (0x00000800)
++#define MCF_INTC_IMRH_INT_MASK44    (0x00001000)
++#define MCF_INTC_IMRH_INT_MASK45    (0x00002000)
++#define MCF_INTC_IMRH_INT_MASK46    (0x00004000)
++#define MCF_INTC_IMRH_INT_MASK47    (0x00008000)
++#define MCF_INTC_IMRH_INT_MASK48    (0x00010000)
++#define MCF_INTC_IMRH_INT_MASK49    (0x00020000)
++#define MCF_INTC_IMRH_INT_MASK50    (0x00040000)
++#define MCF_INTC_IMRH_INT_MASK51    (0x00080000)
++#define MCF_INTC_IMRH_INT_MASK52    (0x00100000)
++#define MCF_INTC_IMRH_INT_MASK53    (0x00200000)
++#define MCF_INTC_IMRH_INT_MASK54    (0x00400000)
++#define MCF_INTC_IMRH_INT_MASK55    (0x00800000)
++#define MCF_INTC_IMRH_INT_MASK56    (0x01000000)
++#define MCF_INTC_IMRH_INT_MASK57    (0x02000000)
++#define MCF_INTC_IMRH_INT_MASK58    (0x04000000)
++#define MCF_INTC_IMRH_INT_MASK59    (0x08000000)
++#define MCF_INTC_IMRH_INT_MASK60    (0x10000000)
++#define MCF_INTC_IMRH_INT_MASK61    (0x20000000)
++#define MCF_INTC_IMRH_INT_MASK62    (0x40000000)
++#define MCF_INTC_IMRH_INT_MASK63    (0x80000000)
++
++/* Bit definitions and macros for IMRL */
++#define MCF_INTC_IMRL_INT_MASK0     (0x00000001)
++#define MCF_INTC_IMRL_INT_MASK1     (0x00000002)
++#define MCF_INTC_IMRL_INT_MASK2     (0x00000004)
++#define MCF_INTC_IMRL_INT_MASK3     (0x00000008)
++#define MCF_INTC_IMRL_INT_MASK4     (0x00000010)
++#define MCF_INTC_IMRL_INT_MASK5     (0x00000020)
++#define MCF_INTC_IMRL_INT_MASK6     (0x00000040)
++#define MCF_INTC_IMRL_INT_MASK7     (0x00000080)
++#define MCF_INTC_IMRL_INT_MASK8     (0x00000100)
++#define MCF_INTC_IMRL_INT_MASK9     (0x00000200)
++#define MCF_INTC_IMRL_INT_MASK10    (0x00000400)
++#define MCF_INTC_IMRL_INT_MASK11    (0x00000800)
++#define MCF_INTC_IMRL_INT_MASK12    (0x00001000)
++#define MCF_INTC_IMRL_INT_MASK13    (0x00002000)
++#define MCF_INTC_IMRL_INT_MASK14    (0x00004000)
++#define MCF_INTC_IMRL_INT_MASK15    (0x00008000)
++#define MCF_INTC_IMRL_INT_MASK16    (0x00010000)
++#define MCF_INTC_IMRL_INT_MASK17    (0x00020000)
++#define MCF_INTC_IMRL_INT_MASK18    (0x00040000)
++#define MCF_INTC_IMRL_INT_MASK19    (0x00080000)
++#define MCF_INTC_IMRL_INT_MASK20    (0x00100000)
++#define MCF_INTC_IMRL_INT_MASK21    (0x00200000)
++#define MCF_INTC_IMRL_INT_MASK22    (0x00400000)
++#define MCF_INTC_IMRL_INT_MASK23    (0x00800000)
++#define MCF_INTC_IMRL_INT_MASK24    (0x01000000)
++#define MCF_INTC_IMRL_INT_MASK25    (0x02000000)
++#define MCF_INTC_IMRL_INT_MASK26    (0x04000000)
++#define MCF_INTC_IMRL_INT_MASK27    (0x08000000)
++#define MCF_INTC_IMRL_INT_MASK28    (0x10000000)
++#define MCF_INTC_IMRL_INT_MASK29    (0x20000000)
++#define MCF_INTC_IMRL_INT_MASK30    (0x40000000)
++#define MCF_INTC_IMRL_INT_MASK31    (0x80000000)
++
++/* Bit definitions and macros for INTFRCH */
++#define MCF_INTC_INTFRCH_INTFRC32   (0x00000001)
++#define MCF_INTC_INTFRCH_INTFRC33   (0x00000002)
++#define MCF_INTC_INTFRCH_INTFRC34   (0x00000004)
++#define MCF_INTC_INTFRCH_INTFRC35   (0x00000008)
++#define MCF_INTC_INTFRCH_INTFRC36   (0x00000010)
++#define MCF_INTC_INTFRCH_INTFRC37   (0x00000020)
++#define MCF_INTC_INTFRCH_INTFRC38   (0x00000040)
++#define MCF_INTC_INTFRCH_INTFRC39   (0x00000080)
++#define MCF_INTC_INTFRCH_INTFRC40   (0x00000100)
++#define MCF_INTC_INTFRCH_INTFRC41   (0x00000200)
++#define MCF_INTC_INTFRCH_INTFRC42   (0x00000400)
++#define MCF_INTC_INTFRCH_INTFRC43   (0x00000800)
++#define MCF_INTC_INTFRCH_INTFRC44   (0x00001000)
++#define MCF_INTC_INTFRCH_INTFRC45   (0x00002000)
++#define MCF_INTC_INTFRCH_INTFRC46   (0x00004000)
++#define MCF_INTC_INTFRCH_INTFRC47   (0x00008000)
++#define MCF_INTC_INTFRCH_INTFRC48   (0x00010000)
++#define MCF_INTC_INTFRCH_INTFRC49   (0x00020000)
++#define MCF_INTC_INTFRCH_INTFRC50   (0x00040000)
++#define MCF_INTC_INTFRCH_INTFRC51   (0x00080000)
++#define MCF_INTC_INTFRCH_INTFRC52   (0x00100000)
++#define MCF_INTC_INTFRCH_INTFRC53   (0x00200000)
++#define MCF_INTC_INTFRCH_INTFRC54   (0x00400000)
++#define MCF_INTC_INTFRCH_INTFRC55   (0x00800000)
++#define MCF_INTC_INTFRCH_INTFRC56   (0x01000000)
++#define MCF_INTC_INTFRCH_INTFRC57   (0x02000000)
++#define MCF_INTC_INTFRCH_INTFRC58   (0x04000000)
++#define MCF_INTC_INTFRCH_INTFRC59   (0x08000000)
++#define MCF_INTC_INTFRCH_INTFRC60   (0x10000000)
++#define MCF_INTC_INTFRCH_INTFRC61   (0x20000000)
++#define MCF_INTC_INTFRCH_INTFRC62   (0x40000000)
++#define MCF_INTC_INTFRCH_INTFRC63   (0x80000000)
++
++/* Bit definitions and macros for INTFRCL */
++#define MCF_INTC_INTFRCL_INTFRC0    (0x00000001)
++#define MCF_INTC_INTFRCL_INTFRC1    (0x00000002)
++#define MCF_INTC_INTFRCL_INTFRC2    (0x00000004)
++#define MCF_INTC_INTFRCL_INTFRC3    (0x00000008)
++#define MCF_INTC_INTFRCL_INTFRC4    (0x00000010)
++#define MCF_INTC_INTFRCL_INTFRC5    (0x00000020)
++#define MCF_INTC_INTFRCL_INTFRC6    (0x00000040)
++#define MCF_INTC_INTFRCL_INTFRC7    (0x00000080)
++#define MCF_INTC_INTFRCL_INTFRC8    (0x00000100)
++#define MCF_INTC_INTFRCL_INTFRC9    (0x00000200)
++#define MCF_INTC_INTFRCL_INTFRC10   (0x00000400)
++#define MCF_INTC_INTFRCL_INTFRC11   (0x00000800)
++#define MCF_INTC_INTFRCL_INTFRC12   (0x00001000)
++#define MCF_INTC_INTFRCL_INTFRC13   (0x00002000)
++#define MCF_INTC_INTFRCL_INTFRC14   (0x00004000)
++#define MCF_INTC_INTFRCL_INTFRC15   (0x00008000)
++#define MCF_INTC_INTFRCL_INTFRC16   (0x00010000)
++#define MCF_INTC_INTFRCL_INTFRC17   (0x00020000)
++#define MCF_INTC_INTFRCL_INTFRC18   (0x00040000)
++#define MCF_INTC_INTFRCL_INTFRC19   (0x00080000)
++#define MCF_INTC_INTFRCL_INTFRC20   (0x00100000)
++#define MCF_INTC_INTFRCL_INTFRC21   (0x00200000)
++#define MCF_INTC_INTFRCL_INTFRC22   (0x00400000)
++#define MCF_INTC_INTFRCL_INTFRC23   (0x00800000)
++#define MCF_INTC_INTFRCL_INTFRC24   (0x01000000)
++#define MCF_INTC_INTFRCL_INTFRC25   (0x02000000)
++#define MCF_INTC_INTFRCL_INTFRC26   (0x04000000)
++#define MCF_INTC_INTFRCL_INTFRC27   (0x08000000)
++#define MCF_INTC_INTFRCL_INTFRC28   (0x10000000)
++#define MCF_INTC_INTFRCL_INTFRC29   (0x20000000)
++#define MCF_INTC_INTFRCL_INTFRC30   (0x40000000)
++#define MCF_INTC_INTFRCL_INTFRC31   (0x80000000)
++
++/* Bit definitions and macros for ICONFIG */
++#define MCF_INTC_ICONFIG_EMASK      (0x0020)
++#define MCF_INTC_ICONFIG_ELVLPRI1   (0x0200)
++#define MCF_INTC_ICONFIG_ELVLPRI2   (0x0400)
++#define MCF_INTC_ICONFIG_ELVLPRI3   (0x0800)
++#define MCF_INTC_ICONFIG_ELVLPRI4   (0x1000)
++#define MCF_INTC_ICONFIG_ELVLPRI5   (0x2000)
++#define MCF_INTC_ICONFIG_ELVLPRI6   (0x4000)
++#define MCF_INTC_ICONFIG_ELVLPRI7   (0x8000)
++
++/* Bit definitions and macros for SIMR */
++#define MCF_INTC_SIMR_SIMR(x)   (((x)&0x7F))
++
++/* Bit definitions and macros for CIMR */
++#define MCF_INTC_CIMR_CIMR(x)   (((x)&0x7F))
++
++/* Bit definitions and macros for CLMASK */
++#define MCF_INTC_CLMASK_CLMASK(x)   (((x)&0x0F))
++
++/* Bit definitions and macros for SLMASK */
++#define MCF_INTC_SLMASK_SLMASK(x)   (((x)&0x0F))
++
++/* Bit definitions and macros for ICR group */
++#define MCF_INTC_ICR_IL(x)      (((x)&0x07))
++
++/* Bit definitions and macros for ICR1 */
++#define MCF_INTC_ICR1_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR2 */
++#define MCF_INTC_ICR2_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR3 */
++#define MCF_INTC_ICR3_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR4 */
++#define MCF_INTC_ICR4_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR5 */
++#define MCF_INTC_ICR5_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR6 */
++#define MCF_INTC_ICR6_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR7 */
++#define MCF_INTC_ICR7_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR8 */
++#define MCF_INTC_ICR8_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR9 */
++#define MCF_INTC_ICR9_IL(x)     (((x)&0x07))
++
++/* Bit definitions and macros for ICR10 */
++#define MCF_INTC_ICR10_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR11 */
++#define MCF_INTC_ICR11_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR12 */
++#define MCF_INTC_ICR12_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR13 */
++#define MCF_INTC_ICR13_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR14 */
++#define MCF_INTC_ICR14_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR15 */
++#define MCF_INTC_ICR15_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR16 */
++#define MCF_INTC_ICR16_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR17 */
++#define MCF_INTC_ICR17_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR18 */
++#define MCF_INTC_ICR18_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR19 */
++#define MCF_INTC_ICR19_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR20 */
++#define MCF_INTC_ICR20_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR21 */
++#define MCF_INTC_ICR21_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR22 */
++#define MCF_INTC_ICR22_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR23 */
++#define MCF_INTC_ICR23_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR24 */
++#define MCF_INTC_ICR24_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR25 */
++#define MCF_INTC_ICR25_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR26 */
++#define MCF_INTC_ICR26_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR27 */
++#define MCF_INTC_ICR27_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR28 */
++#define MCF_INTC_ICR28_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR29 */
++#define MCF_INTC_ICR29_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR30 */
++#define MCF_INTC_ICR30_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR31 */
++#define MCF_INTC_ICR31_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR32 */
++#define MCF_INTC_ICR32_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR33 */
++#define MCF_INTC_ICR33_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR34 */
++#define MCF_INTC_ICR34_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR35 */
++#define MCF_INTC_ICR35_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR36 */
++#define MCF_INTC_ICR36_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR37 */
++#define MCF_INTC_ICR37_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR38 */
++#define MCF_INTC_ICR38_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR39 */
++#define MCF_INTC_ICR39_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR40 */
++#define MCF_INTC_ICR40_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR41 */
++#define MCF_INTC_ICR41_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR42 */
++#define MCF_INTC_ICR42_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR43 */
++#define MCF_INTC_ICR43_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR44 */
++#define MCF_INTC_ICR44_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR45 */
++#define MCF_INTC_ICR45_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR46 */
++#define MCF_INTC_ICR46_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR47 */
++#define MCF_INTC_ICR47_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR48 */
++#define MCF_INTC_ICR48_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR49 */
++#define MCF_INTC_ICR49_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR50 */
++#define MCF_INTC_ICR50_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR51 */
++#define MCF_INTC_ICR51_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR52 */
++#define MCF_INTC_ICR52_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR53 */
++#define MCF_INTC_ICR53_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR54 */
++#define MCF_INTC_ICR54_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR55 */
++#define MCF_INTC_ICR55_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR56 */
++#define MCF_INTC_ICR56_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR57 */
++#define MCF_INTC_ICR57_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR58 */
++#define MCF_INTC_ICR58_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR59 */
++#define MCF_INTC_ICR59_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR60 */
++#define MCF_INTC_ICR60_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR61 */
++#define MCF_INTC_ICR61_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR62 */
++#define MCF_INTC_ICR62_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for ICR63 */
++#define MCF_INTC_ICR63_IL(x)    (((x)&0x07))
++
++/* Bit definitions and macros for SWIACK */
++#define MCF_INTC_SWIACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for LIACK group */
++#define MCF_INTC_LIACK_VECTOR(x)    (x)
++
++/* Bit definitions and macros for L1IACK */
++#define MCF_INTC_L1IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L2IACK */
++#define MCF_INTC_L2IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L3IACK */
++#define MCF_INTC_L3IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L4IACK */
++#define MCF_INTC_L4IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L5IACK */
++#define MCF_INTC_L5IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L6IACK */
++#define MCF_INTC_L6IACK_VECTOR(x)   (x)
++
++/* Bit definitions and macros for L7IACK */
++#define MCF_INTC_L7IACK_VECTOR(x)   (x)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_INTC_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_pci.h
+@@ -0,0 +1,238 @@
++/*
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_PCI_H__
++#define __MCF5445X_PCI_H__
++
++/*********************************************************************
++*
++* PCI Bus Controller (PCI)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_PCI_PCIIDR          MCF_REG32(0xFC0A8000)
++#define MCF_PCI_PCISCR          MCF_REG32(0xFC0A8004)
++#define MCF_PCI_PCICCRIR        MCF_REG32(0xFC0A8008)
++#define MCF_PCI_PCICR1          MCF_REG32(0xFC0A800C)
++#define MCF_PCI_PCIBAR0         MCF_REG32(0xFC0A8010)
++#define MCF_PCI_PCIBAR1         MCF_REG32(0xFC0A8014)
++#define MCF_PCI_PCIBAR2         MCF_REG32(0xFC0A8018)
++#define MCF_PCI_PCIBAR3         MCF_REG32(0xFC0A801C)
++#define MCF_PCI_PCIBAR4         MCF_REG32(0xFC0A8020)
++#define MCF_PCI_PCIBAR5         MCF_REG32(0xFC0A8024)
++#define MCF_PCI_PCISID          MCF_REG32(0xFC0A802C)
++#define MCF_PCI_PCICR2          MCF_REG32(0xFC0A803C)
++#define MCF_PCI_PCIGSCR         MCF_REG32(0xFC0A8060)
++#define MCF_PCI_PCITBATR0A      MCF_REG32(0xFC0A8064)
++#define MCF_PCI_PCITBATR1A      MCF_REG32(0xFC0A8068)
++#define MCF_PCI_PCITCR          MCF_REG32(0xFC0A806C)
++#define MCF_PCI_PCIIW0BTAR      MCF_REG32(0xFC0A8070)
++#define MCF_PCI_PCIIW1BTAR      MCF_REG32(0xFC0A8074)
++#define MCF_PCI_PCIIW2BTAR      MCF_REG32(0xFC0A8078)
++#define MCF_PCI_PCIIWCR         MCF_REG32(0xFC0A8080)
++#define MCF_PCI_PCIICR          MCF_REG32(0xFC0A8084)
++#define MCF_PCI_PCIISR          MCF_REG32(0xFC0A8088)
++#define MCF_PCI_PCITCR2         MCF_REG32(0xFC0A808C)
++#define MCF_PCI_PCITBATR0       MCF_REG32(0xFC0A8090)
++#define MCF_PCI_PCITBATR1       MCF_REG32(0xFC0A8094)
++#define MCF_PCI_PCITBATR2       MCF_REG32(0xFC0A8098)
++#define MCF_PCI_PCITBATR3       MCF_REG32(0xFC0A809C)
++#define MCF_PCI_PCITBATR4       MCF_REG32(0xFC0A80A0)
++#define MCF_PCI_PCITBATR5       MCF_REG32(0xFC0A80A4)
++#define MCF_PCI_PCICAR          MCF_REG32(0xFC0A80F8)
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_PCI_PCIIWBTAR(x)    MCF_REG32(0xFC0A8070+((x)*0x004))
++
++/* Bit definitions and macros for PCIIDR */
++#define MCF_PCI_PCIIDR_VENDORID(x)      (((x)&0x0000FFFF))
++#define MCF_PCI_PCIIDR_DEVICEID(x)      (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for PCISCR */
++#define MCF_PCI_PCISCR_M        (0x00000002)
++#define MCF_PCI_PCISCR_B        (0x00000004)
++#define MCF_PCI_PCISCR_SP       (0x00000008)
++#define MCF_PCI_PCISCR_MW       (0x00000010)
++#define MCF_PCI_PCISCR_PER      (0x00000040)
++#define MCF_PCI_PCISCR_S        (0x00000100)
++#define MCF_PCI_PCISCR_F        (0x00000200)
++#define MCF_PCI_PCISCR_C        (0x00100000)
++#define MCF_PCI_PCISCR_66M      (0x00200000)
++#define MCF_PCI_PCISCR_R        (0x00400000)
++#define MCF_PCI_PCISCR_FC       (0x00800000)
++#define MCF_PCI_PCISCR_DP       (0x01000000)
++#define MCF_PCI_PCISCR_DT(x)    (((x)&0x00000003)<<25)
++#define MCF_PCI_PCISCR_TS       (0x08000000)
++#define MCF_PCI_PCISCR_TR       (0x10000000)
++#define MCF_PCI_PCISCR_MA       (0x20000000)
++#define MCF_PCI_PCISCR_SE       (0x40000000)
++#define MCF_PCI_PCISCR_PE       (0x80000000)
++
++/* Bit definitions and macros for PCICCRIR */
++#define MCF_PCI_PCICCRIR_REVID(x)       (((x)&0x000000FF))
++#define MCF_PCI_PCICCRIR_CLASSCODE(x)   (((x)&0x00FFFFFF)<<8)
++
++/* Bit definitions and macros for PCICR1 */
++#define MCF_PCI_PCICR1_CACHELINESIZE(x)     (((x)&0x0000000F))
++#define MCF_PCI_PCICR1_LATTIMER(x)          (((x)&0x000000FF)<<8)
++#define MCF_PCI_PCICR1_HEADERTYPE(x)        (((x)&0x000000FF)<<16)
++#define MCF_PCI_PCICR1_BIST(x)              (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for PCIBAR0 */
++#define MCF_PCI_PCIBAR0_IO          (0x00000001)
++#define MCF_PCI_PCIBAR0_RANGE(x)    (((x)&0x00000003)<<1)
++#define MCF_PCI_PCIBAR0_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR0_BAR0(x)     (((x)&0x00003FFF)<<18)
++
++/* Bit definitions and macros for PCIBAR1 */
++#define MCF_PCI_PCIBAR1_IO          (0x00000001)
++#define MCF_PCI_PCIBAR1_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR1_BAR1(x)     (((x)&0x00000FFF)<<20)
++
++/* Bit definitions and macros for PCIBAR2 */
++#define MCF_PCI_PCIBAR2_IO          (0x00000001)
++#define MCF_PCI_PCIBAR2_RANGE(x)    (((x)&0x00000003)<<1)
++#define MCF_PCI_PCIBAR2_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR2_BAR2(x)     (((x)&0x000003FF)<<22)
++
++/* Bit definitions and macros for PCIBAR3 */
++#define MCF_PCI_PCIBAR3_IO          (0x00000001)
++#define MCF_PCI_PCIBAR3_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR3_BAR3(x)     (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for PCIBAR4 */
++#define MCF_PCI_PCIBAR4_IO          (0x00000001)
++#define MCF_PCI_PCIBAR4_RANGE(x)    (((x)&0x00000003)<<1)
++#define MCF_PCI_PCIBAR4_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR4_BAR4(x)     (((x)&0x0000001F)<<27)
++
++/* Bit definitions and macros for PCIBAR5 */
++#define MCF_PCI_PCIBAR5_IO          (0x00000001)
++#define MCF_PCI_PCIBAR5_PREF        (0x00000008)
++#define MCF_PCI_PCIBAR5_BAR5(x)     (((x)&0x0000000F)<<28)
++
++/* Bit definitions and macros for PCISID */
++#define MCF_PCI_PCISID_VENDORID(x)      (((x)&0x0000FFFF))
++#define MCF_PCI_PCISID_ID(x)            (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for PCICR2 */
++#define MCF_PCI_PCICR2_INTLINE(x)   (((x)&0x000000FF))
++#define MCF_PCI_PCICR2_INTPIN(x)    (((x)&0x000000FF)<<8)
++#define MCF_PCI_PCICR2_MINGNT(x)    (((x)&0x000000FF)<<16)
++#define MCF_PCI_PCICR2_MAXLAT(x)    (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for PCIGSCR */
++#define MCF_PCI_PCIGSCR_PR      (0x00000001)
++#define MCF_PCI_PCIGSCR_SEE     (0x00001000)
++#define MCF_PCI_PCIGSCR_PEE     (0x00002000)
++#define MCF_PCI_PCIGSCR_SE      (0x10000000)
++#define MCF_PCI_PCIGSCR_PE      (0x20000000)
++
++/* Bit definitions and macros for PCITBATR0A */
++#define MCF_PCI_PCITBATR0A_EN           (0x00000001)
++#define MCF_PCI_PCITBATR0A_BAT0(x)      (((x)&0x00003FFF)<<18)
++
++/* Bit definitions and macros for PCITBATR1A */
++#define MCF_PCI_PCITBATR1A_EN           (0x00000001)
++#define MCF_PCI_PCITBATR1A_BAT1(x)      (((x)&0x00000FFF)<<20)
++
++/* Bit definitions and macros for PCITCR */
++#define MCF_PCI_PCITCR_WCT(x)   (((x)&0x000000FF))
++#define MCF_PCI_PCITCR_WCD      (0x00000100)
++#define MCF_PCI_PCITCR_P        (0x00010000)
++#define MCF_PCI_PCITCR_PID      (0x00020000)
++#define MCF_PCI_PCITCR_LD       (0x01000000)
++
++/* Bit definitions and macros for PCIIWBTAR group */
++#define MCF_PCI_PCIIWBTAR_WBA(x)    ((((x)&0xFF000000)))
++#define MCF_PCI_PCIIWBTAR_WAM(x)    ((((x)&0xFF000000)
++#define MCF_PCI_PCIIWBTAR_WTA(x)    ((((x)&0xFF000000)
++
++/* Bit definitions and macros for PCIIW0BTAR */
++#define MCF_PCI_PCIIW0BTAR_WBA(x)   ((((x)&0xFF000000)))
++#define MCF_PCI_PCIIW0BTAR_WAM(x)   ((((x)&0xFF000000)
++#define MCF_PCI_PCIIW0BTAR_WTA(x)   ((((x)&0xFF000000)
++
++/* Bit definitions and macros for PCIIWCR */
++#define MCF_PCI_PCIIWCR_WINCTRL2(x)             (((x)&0x0000000F)<<8)
++#define MCF_PCI_PCIIWCR_WINCTRL1(x)             (((x)&0x0000000F)<<16)
++#define MCF_PCI_PCIIWCR_WINCTRL0(x)             (((x)&0x0000000F)<<24)
++#define MCF_PCI_PCIIWCR_WINCTRL0_ENABLE         (0x01000000)
++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD        (0x01000000)
++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDLINE      (0x03000000)
++#define MCF_PCI_PCIIWCR_WINCTRL0_MEMRDMUL       (0x05000000)
++#define MCF_PCI_PCIIWCR_WINCTRL0_IO             (0x09000000)
++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD        (0x00010000)
++#define MCF_PCI_PCIIWCR_WINCTRL1_ENABLE         (0x00010000)
++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDLINE      (0x00030000)
++#define MCF_PCI_PCIIWCR_WINCTRL1_MEMRDMUL       (0x00050000)
++#define MCF_PCI_PCIIWCR_WINCTRL1_IO             (0x00090000)
++#define MCF_PCI_PCIIWCR_WINCTRL2_ENABLE         (0x00000100)
++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMREAD        (0x00000100)
++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDLINE      (0x00000300)
++#define MCF_PCI_PCIIWCR_WINCTRL2_MEMRDMUL       (0x00000500)
++#define MCF_PCI_PCIIWCR_WINCTRL2_IO             (0x00000900)
++
++/* Bit definitions and macros for PCIICR */
++#define MCF_PCI_PCIICR_MAXRETRY(x)      (((x)&0x000000FF))
++#define MCF_PCI_PCIICR_TAE              (0x01000000)
++#define MCF_PCI_PCIICR_IAE              (0x02000000)
++#define MCF_PCI_PCIICR_REE              (0x04000000)
++
++/* Bit definitions and macros for PCIISR */
++#define MCF_PCI_PCIISR_TA       (0x01000000)
++#define MCF_PCI_PCIISR_IA       (0x02000000)
++#define MCF_PCI_PCIISR_RE       (0x04000000)
++
++/* Bit definitions and macros for PCITCR2 */
++#define MCF_PCI_PCITCR2_CR      (0x00000001)
++#define MCF_PCI_PCITCR2_B0E     (0x00000100)
++#define MCF_PCI_PCITCR2_B1E     (0x00000200)
++#define MCF_PCI_PCITCR2_B2E     (0x00000400)
++#define MCF_PCI_PCITCR2_B3E     (0x00000800)
++#define MCF_PCI_PCITCR2_B4E     (0x00001000)
++#define MCF_PCI_PCITCR2_B5E     (0x00002000)
++
++/* Bit definitions and macros for PCITBATR0 */
++#define MCF_PCI_PCITBATR0_EN        (0x00000001)
++#define MCF_PCI_PCITBATR0_BAT0(x)   (((x)&0x00003FFF)<<18)
++
++/* Bit definitions and macros for PCITBATR1 */
++#define MCF_PCI_PCITBATR1_EN        (0x00000001)
++#define MCF_PCI_PCITBATR1_BAT1(x)   (((x)&0x00000FFF)<<20)
++
++/* Bit definitions and macros for PCITBATR2 */
++#define MCF_PCI_PCITBATR2_EN        (0x00000001)
++#define MCF_PCI_PCITBATR2_BAT2(x)   (((x)&0x000003FF)<<22)
++
++/* Bit definitions and macros for PCITBATR3 */
++#define MCF_PCI_PCITBATR3_EN        (0x00000001)
++#define MCF_PCI_PCITBATR3_BAT3(x)   (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for PCITBATR4 */
++#define MCF_PCI_PCITBATR4_EN        (0x00000001)
++#define MCF_PCI_PCITBATR4_BAT4(x)   (((x)&0x0000001F)<<27)
++
++/* Bit definitions and macros for PCITBATR5 */
++#define MCF_PCI_PCITBATR5_EN        (0x00000001)
++#define MCF_PCI_PCITBATR5_BAT5(x)   (((x)&0x0000000F)<<28)
++
++/* Bit definitions and macros for PCICAR */
++#define MCF_PCI_PCICAR_DWORD(x)     ((x)&0x000000FC)
++#define MCF_PCI_PCICAR_FUNCNUM(x)   (((x)&0x00000007)<<8)
++#define MCF_PCI_PCICAR_DEVNUM(x)    (((x)&0x0000001F)<<11)
++#define MCF_PCI_PCICAR_BUSNUM(x)    (((x)&0x000000FF)<<16)
++#define MCF_PCI_PCICAR_E            (0x80000000)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_PCI_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_pciarb.h
+@@ -0,0 +1,40 @@
++/*
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_PCIARB_H__
++#define __MCF5445X_PCIARB_H__
++
++/*********************************************************************
++*
++* PCI Arbiter Module (PCIARB)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_PCIARB_PACR               MCF_REG32(0xFC0AC000)
++#define MCF_PCIARB_PASR               MCF_REG32(0xFC0AC004)
++
++/* Bit definitions and macros for PACR */
++#define MCF_PCIARB_PACR_INTMPRI         (0x00000001)
++#define MCF_PCIARB_PACR_EXTMPRI(x)      (((x)&0x0000001F)<<1)
++#define MCF_PCIARB_PACR_RA              (0x00008000)
++#define MCF_PCIARB_PACR_INTMINTEN       (0x00010000)
++#define MCF_PCIARB_PACR_EXTMINTEN(x)    (((x)&0x0000001F)<<17)
++#define MCF_PCIARB_PACR_PKMD            (0x40000000)
++#define MCF_PCIARB_PACR_DS              (0x80000000)
++
++/* Bit definitions and macros for PASR */
++#define MCF_PCIARB_PASR_ITLMBK        (0x00010000)
++#define MCF_PCIARB_PASR_EXTMBK(x)     (((x)&0x0000001F)<<17)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_PCIARB_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_sdramc.h
+@@ -0,0 +1,115 @@
++/*
++ * Matt Waddel Matt.Waddel@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_SDRAMC_H__
++#define __MCF5445X_SDRAMC_H__
++
++/*********************************************************************
++*
++* SDRAM Controller (SDRAMC)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_SDRAMC_SDMR         (*(vuint32 *)(0xFC0B8000))   /* SDRAM Mode/Extended Mode Register */
++#define MCF_SDRAMC_SDCR         (*(vuint32 *)(0xFC0B8004))   /* SDRAM Control Register */
++#define MCF_SDRAMC_SDCFG1       (*(vuint32 *)(0xFC0B8008))   /* SDRAM Configuration Register 1 */
++#define MCF_SDRAMC_SDCFG2       (*(vuint32 *)(0xFC0B800C))   /* SDRAM Configuration Register 2 */
++#define MCF_SDRAMC_SDCS0        (*(vuint32 *)(0xFC0B8110))   /* SDRAM Chip Select Register */
++#define MCF_SDRAMC_SDCS1        (*(vuint32 *)(0xFC0B8114))   /* SDRAM Chip Select Register */
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_SDRAMC_SDCS(x)      (*(vuint32 *)(0xFC0B8110+((x)*0x004)))   /* SDRAM Chip Select Register */
++
++/* Bit definitions and macros for SDMR */
++#define MCF_SDRAMC_SDMR_DDR2_AD(x)      (((x)&0x00003FFF))      /* Address for DDR2 */
++#define MCF_SDRAMC_SDMR_CMD             (0x00010000)            /* Command */
++#define MCF_SDRAMC_SDMR_AD(x)           (((x)&0x00000FFF)<<18)  /* Address */
++#define MCF_SDRAMC_SDMR_BK(x)           (((x)&0x00000003)<<30)  /* Bank Address */
++#define MCF_SDRAMC_SDMR_BK_LMR          (0x00000000)
++#define MCF_SDRAMC_SDMR_BK_LEMR         (0x40000000)
++
++/* Bit definitions and macros for SDCR */
++#define MCF_SDRAMC_SDCR_DPD             (0x00000001)            /* Deep Power-Down Mode */
++#define MCF_SDRAMC_SDCR_IPALL           (0x00000002)            /* Initiate Precharge All */
++#define MCF_SDRAMC_SDCR_IREF            (0x00000004)            /* Initiate Refresh */
++#define MCF_SDRAMC_SDCR_DQS_OE(x)       (((x)&0x00000003)<<10)  /* DQS Output Enable */
++#define MCF_SDRAMC_SDCR_MEM_PS          (0x00002000)            /* Data Port Size */
++#define MCF_SDRAMC_SDCR_REF_CNT(x)      (((x)&0x0000003F)<<16)  /* Periodic Refresh Counter */
++#define MCF_SDRAMC_SDCR_OE_RULE         (0x00400000)            /* Drive Rule Selection */
++#define MCF_SDRAMC_SDCR_ADDR_MUX(x)     (((x)&0x00000003)<<24)  /* Internal Address Mux Select */
++#define MCF_SDRAMC_SDCR_DDR2_MODE       (0x08000000)            /* DDR2 Mode Select */
++#define MCF_SDRAMC_SDCR_REF_EN          (0x10000000)            /* Refresh Enable */
++#define MCF_SDRAMC_SDCR_DDR_MODE        (0x20000000)            /* DDR Mode Select */
++#define MCF_SDRAMC_SDCR_CKE             (0x40000000)            /* Clock Enable */
++#define MCF_SDRAMC_SDCR_MODE_EN         (0x80000000)            /* SDRAM Mode Register Programming Enable */
++#define MCF_SDRAMC_SDCR_DQS_OE_BOTH     (0x00000C00)
++
++/* Bit definitions and macros for SDCFG1 */
++#define MCF_SDRAMC_SDCFG1_WT_LAT(x)     (((x)&0x00000007)<<4)   /* Write Latency */
++#define MCF_SDRAMC_SDCFG1_REF2ACT(x)    (((x)&0x0000000F)<<8)   /* Refresh to active delay */
++#define MCF_SDRAMC_SDCFG1_PRE2ACT(x)    (((x)&0x00000007)<<12)  /* Precharge to active delay */
++#define MCF_SDRAMC_SDCFG1_ACT2RW(x)     (((x)&0x00000007)<<16)  /* Active to read/write delay */
++#define MCF_SDRAMC_SDCFG1_RD_LAT(x)     (((x)&0x0000000F)<<20)  /* Read CAS Latency */
++#define MCF_SDRAMC_SDCFG1_SWT2RWP(x)    (((x)&0x00000007)<<24)  /* Single write to read/write/precharge delay */
++#define MCF_SDRAMC_SDCFG1_SRD2RWP(x)    (((x)&0x0000000F)<<28)  /* Single read to read/write/precharge delay */
++
++/* Bit definitions and macros for SDCFG2 */
++#define MCF_SDRAMC_SDCFG2_BL(x)         (((x)&0x0000000F)<<16)  /* Burst Length */
++#define MCF_SDRAMC_SDCFG2_BRD2W(x)      (((x)&0x0000000F)<<20)  /* Burst read to write delay */
++#define MCF_SDRAMC_SDCFG2_BWT2RWP(x)    (((x)&0x0000000F)<<24)  /* Burst write to read/write/precharge delay */
++#define MCF_SDRAMC_SDCFG2_BRD2RP(x)     (((x)&0x0000000F)<<28)  /* Burst read to read/precharge delay */
++
++/* Bit definitions and macros for SDCS group */
++#define MCF_SDRAMC_SDCS_CSSZ(x)         (((x)&0x0000001F))      /* Chip-Select Size */
++#define MCF_SDRAMC_SDCS_CSBA(x)         (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
++#define MCF_SDRAMC_SDCS_BA(x)           ((x)&0xFFF00000)
++#define MCF_SDRAMC_SDCS_CSSZ_DISABLE    (0x00000000)
++#define MCF_SDRAMC_SDCS_CSSZ_1MBYTE     (0x00000013)
++#define MCF_SDRAMC_SDCS_CSSZ_2MBYTE     (0x00000014)
++#define MCF_SDRAMC_SDCS_CSSZ_4MBYTE     (0x00000015)
++#define MCF_SDRAMC_SDCS_CSSZ_8MBYTE     (0x00000016)
++#define MCF_SDRAMC_SDCS_CSSZ_16MBYTE    (0x00000017)
++#define MCF_SDRAMC_SDCS_CSSZ_32MBYTE    (0x00000018)
++#define MCF_SDRAMC_SDCS_CSSZ_64MBYTE    (0x00000019)
++#define MCF_SDRAMC_SDCS_CSSZ_128MBYTE   (0x0000001A)
++#define MCF_SDRAMC_SDCS_CSSZ_256MBYTE   (0x0000001B)
++#define MCF_SDRAMC_SDCS_CSSZ_512MBYTE   (0x0000001C)
++#define MCF_SDRAMC_SDCS_CSSZ_1GBYTE     (0x0000001D)
++#define MCF_SDRAMC_SDCS_CSSZ_2GBYTE     (0x0000001E)
++#define MCF_SDRAMC_SDCS_CSSZ_4GBYTE     (0x0000001F)
++
++/* Bit definitions and macros for SDCS0 */
++#define MCF_SDRAMC_SDCS0_CSSZ(x)            (((x)&0x0000001F))      /* Chip-Select Size */
++#define MCF_SDRAMC_SDCS0_CSBA(x)            (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
++#define MCF_SDRAMC_SDCS0_BA(x)              ((x)&0xFFF00000)
++#define MCF_SDRAMC_SDCS0_CSSZ_DISABLE       (0x00000000)
++#define MCF_SDRAMC_SDCS0_CSSZ_1MBYTE        (0x00000013)
++#define MCF_SDRAMC_SDCS0_CSSZ_2MBYTE        (0x00000014)
++#define MCF_SDRAMC_SDCS0_CSSZ_4MBYTE        (0x00000015)
++#define MCF_SDRAMC_SDCS0_CSSZ_8MBYTE        (0x00000016)
++#define MCF_SDRAMC_SDCS0_CSSZ_16MBYTE       (0x00000017)
++#define MCF_SDRAMC_SDCS0_CSSZ_32MBYTE       (0x00000018)
++#define MCF_SDRAMC_SDCS0_CSSZ_64MBYTE       (0x00000019)
++#define MCF_SDRAMC_SDCS0_CSSZ_128MBYTE      (0x0000001A)
++#define MCF_SDRAMC_SDCS0_CSSZ_256MBYTE      (0x0000001B)
++#define MCF_SDRAMC_SDCS0_CSSZ_512MBYTE      (0x0000001C)
++#define MCF_SDRAMC_SDCS0_CSSZ_1GBYTE        (0x0000001D)
++#define MCF_SDRAMC_SDCS0_CSSZ_2GBYTE        (0x0000001E)
++#define MCF_SDRAMC_SDCS0_CSSZ_4GBYTE        (0x0000001F)
++
++/* Bit definitions and macros for SDCS1 */
++#define MCF_SDRAMC_SDCS1_CSSZ(x)    (((x)&0x0000001F))      /* Chip-Select Size */
++#define MCF_SDRAMC_SDCS1_CSBA(x)    (((x)&0x00000FFF)<<20)  /* Chip-Select Base Address */
++
++/********************************************************************/
++
++#endif /* __MCF5445X_SDRAMC_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_ssi.h
+@@ -0,0 +1,187 @@
++/*
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_SSI_H__
++#define __MCF5445X_SSI_H__
++
++/*********************************************************************
++*
++* Synchronous Serial Interface (SSI)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_SSI_TX0             MCF_REG32(0xFC0BC000)
++#define MCF_SSI_TX1             MCF_REG32(0xFC0BC004)
++#define MCF_SSI_RX0             MCF_REG32(0xFC0BC008)
++#define MCF_SSI_RX1             MCF_REG32(0xFC0BC00C)
++#define MCF_SSI_CR              MCF_REG32(0xFC0BC010)
++#define MCF_SSI_ISR             MCF_REG32(0xFC0BC014)
++#define MCF_SSI_IER             MCF_REG32(0xFC0BC018)
++#define MCF_SSI_TCR             MCF_REG32(0xFC0BC01C)
++#define MCF_SSI_RCR             MCF_REG32(0xFC0BC020)
++#define MCF_SSI_CCR             MCF_REG32(0xFC0BC024)
++#define MCF_SSI_FCSR            MCF_REG32(0xFC0BC02C)
++#define MCF_SSI_ACR             MCF_REG32(0xFC0BC038)
++#define MCF_SSI_ACADD           MCF_REG32(0xFC0BC03C)
++#define MCF_SSI_ACDAT           MCF_REG32(0xFC0BC040)
++#define MCF_SSI_ATAG            MCF_REG32(0xFC0BC044)
++#define MCF_SSI_TMASK           MCF_REG32(0xFC0BC048)
++#define MCF_SSI_RMASK           MCF_REG32(0xFC0BC04C)
++
++/* Parameterized register read/write macros for multiple registers */
++#define MCF_SSI_TX(x)           MCF_REG32(0xFC0BC000+((x)*0x004))
++#define MCF_SSI_RX(x)           MCF_REG32(0xFC0BC008+((x)*0x004))
++
++/* Bit definitions and macros for TX group */
++#define MCF_SSI_TX_SSI_TX(x)    (x)
++
++/* Bit definitions and macros for TX0 */
++#define MCF_SSI_TX0_SSI_TX(x)   (x)
++
++/* Bit definitions and macros for TX1 */
++#define MCF_SSI_TX1_SSI_TX(x)   (x)
++
++/* Bit definitions and macros for RX group */
++#define MCF_SSI_RX_SSI_RX(x)    (x)
++
++/* Bit definitions and macros for RX0 */
++#define MCF_SSI_RX0_SSI_RX(x)   (x)
++
++/* Bit definitions and macros for RX1 */
++#define MCF_SSI_RX1_SSI_RX(x)   (x)
++
++/* Bit definitions and macros for CR */
++#define MCF_SSI_CR_SSI_EN       (0x00000001)
++#define MCF_SSI_CR_TE           (0x00000002)
++#define MCF_SSI_CR_RE           (0x00000004)
++#define MCF_SSI_CR_NET          (0x00000008)
++#define MCF_SSI_CR_SYN          (0x00000010)
++#define MCF_SSI_CR_I2S(x)       (((x)&0x00000003)<<5)
++#define MCF_SSI_CR_MCE          (0x00000080)
++#define MCF_SSI_CR_TCH          (0x00000100)
++#define MCF_SSI_CR_CIS          (0x00000200)
++#define MCF_SSI_CR_I2S_NORMAL   (0x00000000)
++#define MCF_SSI_CR_I2S_MASTER   (0x00000020)
++#define MCF_SSI_CR_I2S_SLAVE    (0x00000040)
++
++/* Bit definitions and macros for ISR */
++#define MCF_SSI_ISR_TFE0        (0x00000001)
++#define MCF_SSI_ISR_TFE1        (0x00000002)
++#define MCF_SSI_ISR_RFF0        (0x00000004)
++#define MCF_SSI_ISR_RFF1        (0x00000008)
++#define MCF_SSI_ISR_RLS         (0x00000010)
++#define MCF_SSI_ISR_TLS         (0x00000020)
++#define MCF_SSI_ISR_RFS         (0x00000040)
++#define MCF_SSI_ISR_TFS         (0x00000080)
++#define MCF_SSI_ISR_TUE0        (0x00000100)
++#define MCF_SSI_ISR_TUE1        (0x00000200)
++#define MCF_SSI_ISR_ROE0        (0x00000400)
++#define MCF_SSI_ISR_ROE1        (0x00000800)
++#define MCF_SSI_ISR_TDE0        (0x00001000)
++#define MCF_SSI_ISR_TDE1        (0x00002000)
++#define MCF_SSI_ISR_RDR0        (0x00004000)
++#define MCF_SSI_ISR_RDR1        (0x00008000)
++#define MCF_SSI_ISR_RXT         (0x00010000)
++#define MCF_SSI_ISR_CMDDU       (0x00020000)
++#define MCF_SSI_ISR_CMDAU       (0x00040000)
++
++/* Bit definitions and macros for IER */
++#define MCF_SSI_IER_TFE0        (0x00000001)
++#define MCF_SSI_IER_TFE1        (0x00000002)
++#define MCF_SSI_IER_RFF0        (0x00000004)
++#define MCF_SSI_IER_RFF1        (0x00000008)
++#define MCF_SSI_IER_RLS         (0x00000010)
++#define MCF_SSI_IER_TLS         (0x00000020)
++#define MCF_SSI_IER_RFS         (0x00000040)
++#define MCF_SSI_IER_TFS         (0x00000080)
++#define MCF_SSI_IER_TUE0        (0x00000100)
++#define MCF_SSI_IER_TUE1        (0x00000200)
++#define MCF_SSI_IER_ROE0        (0x00000400)
++#define MCF_SSI_IER_ROE1        (0x00000800)
++#define MCF_SSI_IER_TDE0        (0x00001000)
++#define MCF_SSI_IER_TDE1        (0x00002000)
++#define MCF_SSI_IER_RDR0        (0x00004000)
++#define MCF_SSI_IER_RDR1        (0x00008000)
++#define MCF_SSI_IER_RXT         (0x00010000)
++#define MCF_SSI_IER_CMDU        (0x00020000)
++#define MCF_SSI_IER_CMDAU       (0x00040000)
++#define MCF_SSI_IER_TIE         (0x00080000)
++#define MCF_SSI_IER_TDMAE       (0x00100000)
++#define MCF_SSI_IER_RIE         (0x00200000)
++#define MCF_SSI_IER_RDMAE       (0x00400000)
++
++/* Bit definitions and macros for TCR */
++#define MCF_SSI_TCR_TEFS        (0x00000001)
++#define MCF_SSI_TCR_TFSL        (0x00000002)
++#define MCF_SSI_TCR_TFSI        (0x00000004)
++#define MCF_SSI_TCR_TSCKP       (0x00000008)
++#define MCF_SSI_TCR_TSHFD       (0x00000010)
++#define MCF_SSI_TCR_TXDIR       (0x00000020)
++#define MCF_SSI_TCR_TFDIR       (0x00000040)
++#define MCF_SSI_TCR_TFEN0       (0x00000080)
++#define MCF_SSI_TCR_TFEN1       (0x00000100)
++#define MCF_SSI_TCR_TXBIT0      (0x00000200)
++
++/* Bit definitions and macros for RCR */
++#define MCF_SSI_RCR_REFS        (0x00000001)
++#define MCF_SSI_RCR_RFSL        (0x00000002)
++#define MCF_SSI_RCR_RFSI        (0x00000004)
++#define MCF_SSI_RCR_RSCKP       (0x00000008)
++#define MCF_SSI_RCR_RSHFD       (0x00000010)
++#define MCF_SSI_RCR_RFEN0       (0x00000080)
++#define MCF_SSI_RCR_RFEN1       (0x00000100)
++#define MCF_SSI_RCR_RXBIT0      (0x00000200)
++#define MCF_SSI_RCR_RXEXT       (0x00000400)
++
++/* Bit definitions and macros for CCR */
++#define MCF_SSI_CCR_PM(x)       (((x)&0x000000FF))
++#define MCF_SSI_CCR_DC(x)       (((x)&0x0000001F)<<8)
++#define MCF_SSI_CCR_WL(x)       (((x)&0x0000000F)<<13)
++#define MCF_SSI_CCR_PSR         (0x00020000)
++#define MCF_SSI_CCR_DIV2        (0x00040000)
++
++/* Bit definitions and macros for FCSR */
++#define MCF_SSI_FCSR_TFWM0(x)       (((x)&0x0000000F))
++#define MCF_SSI_FCSR_RFWM0(x)       (((x)&0x0000000F)<<4)
++#define MCF_SSI_FCSR_TFCNT0(x)      (((x)&0x0000000F)<<8)
++#define MCF_SSI_FCSR_RFCNT0(x)      (((x)&0x0000000F)<<12)
++#define MCF_SSI_FCSR_TFWM1(x)       (((x)&0x0000000F)<<16)
++#define MCF_SSI_FCSR_RFWM1(x)       (((x)&0x0000000F)<<20)
++#define MCF_SSI_FCSR_TFCNT1(x)      (((x)&0x0000000F)<<24)
++#define MCF_SSI_FCSR_RFCNT1(x)      (((x)&0x0000000F)<<28)
++
++/* Bit definitions and macros for ACR */
++#define MCF_SSI_ACR_AC97EN      (0x00000001)
++#define MCF_SSI_ACR_FV          (0x00000002)
++#define MCF_SSI_ACR_TIF         (0x00000004)
++#define MCF_SSI_ACR_RD          (0x00000008)
++#define MCF_SSI_ACR_WR          (0x00000010)
++#define MCF_SSI_ACR_FRDIV(x)    (((x)&0x0000003F)<<5)
++
++/* Bit definitions and macros for ACADD */
++#define MCF_SSI_ACADD_SSI_ACADD(x)      (((x)&0x0007FFFF))
++
++/* Bit definitions and macros for ACDAT */
++#define MCF_SSI_ACDAT_SSI_ACDAT(x)      (((x)&0x0007FFFF))
++
++/* Bit definitions and macros for ATAG */
++#define MCF_SSI_ATAG_DDI_ATAG(x)    (((x)&0x0000FFFF))
++
++/* Bit definitions and macros for TMASK */
++#define MCF_SSI_TMASK_SSI_TMASK(x)      (x)
++
++/* Bit definitions and macros for RMASK */
++#define MCF_SSI_RMASK_SSI_RMASK(x)      (x)
++
++/********************************************************************/
++
++#endif /* __MCF5445X_SSI_H__ */
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_usb.h
+@@ -0,0 +1,49 @@
++/*
++ * Duck Schmid duck@freescale.com
++ *
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <asm/mcfsim.h>
++
++/* ehci_arc_hc_driver.flags value */
++#define FSL_PLATFORM_HC_FLAGS (HCD_USB2 | HCD_MEMORY)
++
++static inline int fsl_platform_verify(struct platform_device *pdev)
++{
++      return 0;
++}
++
++static inline void fsl_platform_usb_setup(struct usb_hcd *hcd)
++{
++}
++
++static inline void fsl_platform_set_host_mode(struct usb_hcd *hcd)
++{
++      unsigned int temp;
++      struct fsl_usb2_platform_data *pdata;
++      struct fsl_usb_host_regs *regs;
++
++      pdata = hcd->self.controller->platform_data;
++      regs = pdata->regs;
++
++      if (pdata->xcvr_ops && pdata->xcvr_ops->set_host)
++              pdata->xcvr_ops->set_host();
++
++      /* set host mode and select "big endian" */
++      temp = fsl_readl(&regs->usbmode);
++      fsl_writel(temp | USBMODE_CM_HOST | USBMODE_ES, &regs->usbmode);
++
++      pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__,
++              fsl_readl(&regs->usbmode));
++
++}
diff --git a/target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch b/target/linux/coldfire/patches/005-mcfv4e_kernel_mods.patch
new file mode 100644 (file)
index 0000000..05ffbd6
--- /dev/null
@@ -0,0 +1,571 @@
+From 823ad3e6e88353226ec28f48183a467181887a1b Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:56:09 -0600
+Subject: [PATCH] Core Coldfire/MCF54455 kernel changes.
+
+LTIBName: mcfv4e-kernel-mods
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig              |   65 ++++++++++++++++++++++++++++++++++++++-
+ arch/m68k/Kconfig.debug        |    9 +++++
+ arch/m68k/Makefile             |   14 ++++++++
+ arch/m68k/kernel/Makefile      |   15 ++++++---
+ arch/m68k/kernel/asm-offsets.c |    7 ++++
+ arch/m68k/kernel/dma.c         |   17 ++++++++++
+ arch/m68k/kernel/process.c     |   57 +++++++++++++++++++++++++++++++++++
+ arch/m68k/kernel/setup.c       |   49 ++++++++++++++++++++++++++----
+ arch/m68k/kernel/time.c        |    5 +++
+ arch/m68k/kernel/vmlinux.lds.S |    2 +
+ 10 files changed, 227 insertions(+), 13 deletions(-)
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -119,6 +119,20 @@ config SUN3
+         If you don't want to compile a kernel exclusively for a Sun 3, say N.
++config COLDFIRE
++      bool "ColdFire V4e support"
++      default y
++      select CFV4E
++      help
++        Say Y if you want to build a kernel to run on one of the ColdFire
++        V4e boards.
++
++config CFV4E
++      bool
++      depends on COLDFIRE
++      select MMU_CFV4E if MMU
++      default y
++
+ config AMIGA
+       bool "Amiga support"
+       depends on !MMU_SUN3
+@@ -294,14 +308,53 @@ config M68060
+         If you anticipate running this kernel on a computer with a MC68060
+         processor, say Y. Otherwise, say N.
++config M54455
++      bool "MCF54455 support"
++      depends on COLDFIRE
++      default y
++      help
++          This option will add support for the MCF54455 processor with mmu.
++
++config MCFCLK
++      int "M54455EVB System Clock"
++      depends on M54455
++      default 266666666
++      help
++        System clock for EVB.  Usually 266MHz for u-boot and 200MHz for dBUG.
++
++config MCF_USER_HALT
++      bool "Coldfire User Halt Enable"
++      depends on M54455
++      default n
++      help
++        Enables the HALT instruction in User Mode.
++
+ config MMU_MOTOROLA
+       bool
+-      depends on MMU && !MMU_SUN3
++      depends on MMU && !MMU_SUN3 && !COLDFIRE
+       default y
+ config MMU_SUN3
+       bool
++config MMU_CFV4E
++      bool
++
++config SDRAM_BASE
++      hex
++      depends on M54455
++      default 0x40000000
++
++config SDRAM_SIZE
++      hex
++      depends on M54455
++      default 0x0FFFFFFF
++
++config NOR_FLASH_BASE
++      hex "NOR Flash Base Address"
++      depends on M54455
++      default 0x00000000
++
+ config M68KFPU_EMU
+       bool "Math emulation support (EXPERIMENTAL)"
+       depends on EXPERIMENTAL
+@@ -468,6 +521,14 @@ config ZONE_DMA
+ source "drivers/pci/Kconfig"
+ source "drivers/zorro/Kconfig"
++endmenu
++
++menu "Power management options"
++
++config PM
++      bool "Power Management support"
++      help
++        Support processor power management modes
+ endmenu
+@@ -647,7 +708,7 @@ config DN_SERIAL
+ config SERIAL_CONSOLE
+       bool "Support for serial port console"
+-      depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
++      depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO || COLDFIRE) && (ATARI_MFPSER=y || ATARI_SCC=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL || SERIAL_COLDFIRE)
+       ---help---
+         If you say Y here, it will be possible to use a serial port as the
+         system console (the system console is the device which receives all
+--- a/arch/m68k/Kconfig.debug
++++ b/arch/m68k/Kconfig.debug
+@@ -2,4 +2,13 @@ menu "Kernel hacking"
+ source "lib/Kconfig.debug"
++config BOOTPARAM
++      bool 'Compiled-in Kernel Boot Parameter'
++      depends on COLDFIRE
++
++config BOOTPARAM_STRING
++      string 'Kernel Boot Parameter'
++      default 'console=ttyS0,115200'
++      depends on BOOTPARAM
++
+ endmenu
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -16,7 +16,9 @@
+ KBUILD_DEFCONFIG := amiga_defconfig
+ # override top level makefile
++ifndef CONFIG_COLDFIRE
+ AS += -m68020
++endif
+ LDFLAGS := -m m68kelf
+ LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
+ ifneq ($(SUBARCH),$(ARCH))
+@@ -36,6 +38,7 @@ CHECKFLAGS += -D__mc68000__
+ KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2
+ # enable processor switch if compiled only for a single cpu
++ifndef CONFIG_COLDFIRE
+ ifndef CONFIG_M68020
+ ifndef CONFIG_M68030
+@@ -49,6 +52,12 @@ endif
+ endif
+ endif
++endif
++
++ifdef CONFIG_M54455
++CFLAGS := $(CFLAGS) -march=isac -mcpu=54455 -msoft-float -g 
++AFLAGS := $(AFLAGS) -march=isac -mcpu=54455 -msoft-float  
++endif
+ ifdef CONFIG_KGDB
+ # If configured for kgdb support, include debugging infos and keep the
+@@ -57,8 +66,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po
+ endif
+ ifndef CONFIG_SUN3
++ifndef CONFIG_COLDFIRE
+ head-y := arch/m68k/kernel/head.o
+ else
++head-y := arch/m68k/coldfire/head.o
++endif
++else
+ head-y := arch/m68k/kernel/sun3-head.o
+ endif
+@@ -79,6 +92,7 @@ core-$(CONFIG_SUN3)          += arch/m68k/sun3/      
+ core-$(CONFIG_M68040)         += arch/m68k/fpsp040/
+ core-$(CONFIG_M68060)         += arch/m68k/ifpsp060/
+ core-$(CONFIG_M68KFPU_EMU)    += arch/m68k/math-emu/
++core-$(CONFIG_COLDFIRE)               += arch/m68k/coldfire/
+ all:  zImage
+--- a/arch/m68k/kernel/Makefile
++++ b/arch/m68k/kernel/Makefile
+@@ -2,14 +2,19 @@
+ # Makefile for the linux kernel.
+ #
+-ifndef CONFIG_SUN3
+-  extra-y := head.o
++ifdef CONFIG_SUN3
++  extra-y := sun3-head.o vmlinux.lds
++  obj-y := entry.o signal.o ints.o
+ else
+-  extra-y := sun3-head.o
++ifndef CONFIG_COLDFIRE
++  extra-y := head.o vmlinux.lds
++  obj-y := entry.o signal.o traps.o ints.o
++else   # CONFIG_COLDFIRE
++  extra-y := ../coldfire/head.o vmlinux.lds
++endif
+ endif
+-extra-y       += vmlinux.lds
+-obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
++obj-y += process.o ptrace.o module.o \
+          sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o devres.o
+ devres-y = ../../../kernel/irq/devres.o
+--- a/arch/m68k/kernel/asm-offsets.c
++++ b/arch/m68k/kernel/asm-offsets.c
+@@ -58,8 +58,15 @@ int main(void)
+       DEFINE(PT_A2, offsetof(struct pt_regs, a2));
+       DEFINE(PT_PC, offsetof(struct pt_regs, pc));
+       DEFINE(PT_SR, offsetof(struct pt_regs, sr));
++#ifdef CONFIG_COLDFIRE
++      /* Need to get the context out of struct mm for ASID setting */
++      DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context));
++      /* Coldfire exception frame has vector *before* pc */
++      DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4);
++#else
+       /* bitfields are a bit difficult */
+       DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4);
++#endif
+       /* offsets into the irq_handler struct */
+       DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler));
+--- a/arch/m68k/kernel/dma.c
++++ b/arch/m68k/kernel/dma.c
+@@ -17,6 +17,7 @@
+ void *dma_alloc_coherent(struct device *dev, size_t size,
+                        dma_addr_t *handle, gfp_t flag)
+ {
++#ifndef CONFIG_M54455
+       struct page *page, **map;
+       pgprot_t pgprot;
+       void *addr;
+@@ -55,6 +56,18 @@ void *dma_alloc_coherent(struct device *
+       kfree(map);
+       return addr;
++#else
++      /*
++       * On the M5445x platform the memory allocated with GFP_DMA
++       * is guaranteed to be DMA'able.
++       */
++      void *addr;
++
++      size = PAGE_ALIGN(size);
++      addr = kmalloc(size, GFP_DMA);
++      *handle = virt_to_phys(addr);
++      return addr;
++#endif
+ }
+ EXPORT_SYMBOL(dma_alloc_coherent);
+@@ -62,7 +75,11 @@ void dma_free_coherent(struct device *de
+                      void *addr, dma_addr_t handle)
+ {
+       pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
++#ifndef CONFIG_M54455
+       vfree(addr);
++#else
++      kfree(addr);
++#endif
+ }
+ EXPORT_SYMBOL(dma_free_coherent);
+--- a/arch/m68k/kernel/process.c
++++ b/arch/m68k/kernel/process.c
+@@ -191,6 +191,7 @@ EXPORT_SYMBOL(kernel_thread);
+ void flush_thread(void)
+ {
++#if !defined(CONFIG_COLDFIRE)
+       unsigned long zero = 0;
+       set_fs(USER_DS);
+       current->thread.fs = __USER_DS;
+@@ -198,6 +199,14 @@ void flush_thread(void)
+               asm volatile (".chip 68k/68881\n\t"
+                             "frestore %0@\n\t"
+                             ".chip 68k" : : "a" (&zero));
++#else
++      set_fs(USER_DS);
++      current->thread.fs = USER_DS;
++#if defined(CONFIG_FPU)
++      if (!FPU_IS_EMU)
++              asm volatile ("frestore %0@\n\t" : : "a" (&zero));
++#endif
++#endif
+ }
+ /*
+@@ -261,6 +270,7 @@ int copy_thread(int nr, unsigned long cl
+        * Must save the current SFC/DFC value, NOT the value when
+        * the parent was last descheduled - RGH  10-08-96
+        */
++#if !defined(CONFIG_COLDFIRE)
+       p->thread.fs = get_fs().seg;
+       if (!FPU_IS_EMU) {
+@@ -272,9 +282,34 @@ int copy_thread(int nr, unsigned long cl
+                               "fmoveml %/fpiar/%/fpcr/%/fpsr,%1"
+                               : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0])
+                               : "memory");
++#else
++      p->thread.fs = get_fs();
++
++#if defined(CONFIG_FPU)
++      if (!FPU_IS_EMU) {
++              /* Copy the current fpu state */
++              asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0])
++                            : "memory");
++
++              if (p->thread.fpstate[0]) {
++                      asm volatile ("fmovemd %/fp0-%/fp7,%0"
++                                    : : "m" (p->thread.fp[0])
++                                    : "memory");
++                      asm volatile ("fmovel %/fpiar,%0"
++                                    : : "m" (p->thread.fpcntl[0])
++                                    : "memory");
++                      asm volatile ("fmovel %/fpcr,%0"
++                                    : : "m" (p->thread.fpcntl[1])
++                                    : "memory");
++                      asm volatile ("fmovel %/fpsr,%0"
++                                    : : "m" (p->thread.fpcntl[2])
++                                    : "memory");
++              }
+               /* Restore the state in case the fpu was busy */
+               asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0]));
+       }
++#endif
++#endif
+       return 0;
+ }
+@@ -283,7 +318,9 @@ int copy_thread(int nr, unsigned long cl
+ int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
+ {
++#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU)
+       char fpustate[216];
++#endif
+       if (FPU_IS_EMU) {
+               int i;
+@@ -300,6 +337,7 @@ int dump_fpu (struct pt_regs *regs, stru
+       }
+       /* First dump the fpu context to avoid protocol violation.  */
++#if !defined(CONFIG_COLDFIRE)
+       asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
+       if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
+               return 0;
+@@ -310,6 +348,25 @@ int dump_fpu (struct pt_regs *regs, stru
+       asm volatile ("fmovemx %/fp0-%/fp7,%0"
+               :: "m" (fpu->fpregs[0])
+               : "memory");
++#elif defined(CONFIG_FPU)
++      asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
++      if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
++              return 0;
++
++      asm volatile ("fmovel %/fpiar,%0"
++                    : : "m" (fpu->fpcntl[0])
++                    : "memory");
++      asm volatile ("fmovel %/fpcr,%0"
++                    : : "m" (fpu->fpcntl[1])
++                    : "memory");
++      asm volatile ("fmovel %/fpsr,%0"
++                    : : "m" (fpu->fpcntl[2])
++                    : "memory");
++      asm volatile ("fmovemd %/fp0-%/fp7,%0"
++                    : : "m" (fpu->fpregs[0])
++                    : "memory");
++#endif
++
+       return 1;
+ }
+ EXPORT_SYMBOL(dump_fpu);
+--- a/arch/m68k/kernel/setup.c
++++ b/arch/m68k/kernel/setup.c
+@@ -67,13 +67,22 @@ EXPORT_SYMBOL(m68k_memory);
+ struct mem_info m68k_ramdisk;
++#if !defined(CONFIG_COLDFIRE)
+ static char m68k_command_line[CL_SIZE];
++#else
++char m68k_command_line[CL_SIZE];
++unsigned long uboot_info_stk;
++EXPORT_SYMBOL(uboot_info_stk);
++#endif
+ void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL;
+ /* machine dependent irq functions */
+ void (*mach_init_IRQ) (void) __initdata = NULL;
+ void (*mach_get_model) (char *model);
+ int (*mach_get_hardware_list) (char *buffer);
++#ifdef CONFIG_COLDFIRE
++void (*mach_tick)(void);
++#endif
+ /* machine dependent timer functions */
+ unsigned long (*mach_gettimeoffset) (void);
+ int (*mach_hwclk) (int, struct rtc_time*);
+@@ -128,13 +137,17 @@ extern void config_hp300(void);
+ extern void config_q40(void);
+ extern void config_sun3x(void);
++#ifdef CONFIG_COLDFIRE
++void coldfire_sort_memrec(void);
++#endif
++
+ #define MASK_256K 0xfffc0000
+ extern void paging_init(void);
+ static void __init m68k_parse_bootinfo(const struct bi_record *record)
+ {
+-      while (record->tag != BI_LAST) {
++      while ((record->tag != BI_LAST) && !(CONFIG_COLDFIRE)) {
+               int unknown = 0;
+               const unsigned long *data = record->data;
+@@ -192,7 +205,11 @@ static void __init m68k_parse_bootinfo(c
+                                             record->size);
+       }
+-      m68k_realnum_memory = m68k_num_memory;
++#ifdef CONFIG_COLDFIRE
++    coldfire_sort_memrec();
++#endif
++
++    m68k_realnum_memory = m68k_num_memory;
+ #ifdef CONFIG_SINGLE_MEMORY_CHUNK
+       if (m68k_num_memory > 1) {
+               printk("Ignoring last %i chunks of physical memory\n",
+@@ -205,7 +222,9 @@ static void __init m68k_parse_bootinfo(c
+ void __init setup_arch(char **cmdline_p)
+ {
+       extern int _etext, _edata, _end;
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+       int i;
++#endif
+       /* The bootinfo is located right after the kernel bss */
+       m68k_parse_bootinfo((const struct bi_record *)&_end);
+@@ -220,9 +239,10 @@ void __init setup_arch(char **cmdline_p)
+        * We should really do our own FPU check at startup.
+        * [what do we do with buggy 68LC040s? if we have problems
+        *  with them, we should add a test to check_bugs() below] */
+-#ifndef CONFIG_M68KFPU_EMU_ONLY
++#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU)
+       /* clear the fpu if we have one */
+-      if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) {
++      if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060|
++                          FPU_CFV4E)) {
+               volatile int zero = 0;
+               asm volatile ("frestore %0" : : "m" (zero));
+       }
+@@ -310,13 +330,18 @@ void __init setup_arch(char **cmdline_p)
+               config_sun3x();
+               break;
+ #endif
++#ifdef CONFIG_COLDFIRE
++      case MACH_CFMMU:
++              config_coldfire();
++              break;
++#endif
+       default:
+               panic("No configuration setup");
+       }
+       paging_init();
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+       for (i = 1; i < m68k_num_memory; i++)
+               free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
+                                 m68k_memory[i].size);
+@@ -343,6 +368,10 @@ void __init setup_arch(char **cmdline_p)
+ #endif /* !CONFIG_SUN3 */
++#ifdef CONFIG_COLDFIRE
++      mmu_context_init();
++#endif
++
+ /* set ISA defs early as possible */
+ #if defined(CONFIG_ISA) && defined(MULTI_ISA)
+ #if defined(CONFIG_Q40)
+@@ -373,6 +402,7 @@ static int show_cpuinfo(struct seq_file 
+ #define LOOP_CYCLES_68030     (8)
+ #define LOOP_CYCLES_68040     (3)
+ #define LOOP_CYCLES_68060     (1)
++#define LOOP_CYCLES_COLDFIRE  (2)
+       if (CPU_IS_020) {
+               cpu = "68020";
+@@ -386,6 +416,9 @@ static int show_cpuinfo(struct seq_file 
+       } else if (CPU_IS_060) {
+               cpu = "68060";
+               clockfactor = LOOP_CYCLES_68060;
++      } else if (CPU_IS_CFV4E) {
++              cpu = "ColdFire V4e";
++              clockfactor = LOOP_CYCLES_COLDFIRE;
+       } else {
+               cpu = "680x0";
+               clockfactor = 0;
+@@ -404,6 +437,8 @@ static int show_cpuinfo(struct seq_file 
+               fpu = "68060";
+       else if (m68k_fputype & FPU_SUNFPA)
+               fpu = "Sun FPA";
++      else if (m68k_fputype & FPU_CFV4E)
++              fpu = "ColdFire V4e";
+       else
+               fpu = "none";
+ #endif
+@@ -420,6 +455,8 @@ static int show_cpuinfo(struct seq_file 
+               mmu = "Sun-3";
+       else if (m68k_mmutype & MMU_APOLLO)
+               mmu = "Apollo";
++      else if (m68k_mmutype & MMU_CFV4E)
++              mmu = "ColdFire";
+       else
+               mmu = "unknown";
+@@ -482,7 +519,7 @@ int get_hardware_list(char *buffer)
+ void check_bugs(void)
+ {
+-#ifndef CONFIG_M68KFPU_EMU
++#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M54455)
+       if (m68k_fputype == 0) {
+               printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
+                       "WHICH IS REQUIRED BY LINUX/M68K ***\n");
+--- a/arch/m68k/kernel/time.c
++++ b/arch/m68k/kernel/time.c
+@@ -40,6 +40,11 @@ static inline int set_rtc_mmss(unsigned 
+  */
+ static irqreturn_t timer_interrupt(int irq, void *dummy)
+ {
++#ifdef CONFIG_COLDFIRE
++      /* kick hardware timer if necessary */
++      if (mach_tick)
++              mach_tick();
++#endif
+       do_timer(1);
+ #ifndef CONFIG_SMP
+       update_process_times(user_mode(get_irq_regs()));
+--- a/arch/m68k/kernel/vmlinux.lds.S
++++ b/arch/m68k/kernel/vmlinux.lds.S
+@@ -5,6 +5,8 @@ PHDRS
+ }
+ #ifdef CONFIG_SUN3
+ #include "vmlinux-sun3.lds"
++#elif CONFIG_COLDFIRE
++#include "../coldfire/vmlinux-cf.lds"
+ #else
+ #include "vmlinux-std.lds"
+ #endif
diff --git a/target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch b/target/linux/coldfire/patches/006-mcfv4e_arch_lib_mods.patch
new file mode 100644 (file)
index 0000000..f699e5f
--- /dev/null
@@ -0,0 +1,564 @@
+From a9faf34ba120d9d39ff0c7656ee3de12a110e22a Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:57:05 -0600
+Subject: [PATCH] Core Coldfire/MCF5445x arch lib changes.
+
+LTIBName: mcfv4e-arch-lib-mods
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/lib/checksum.c  |  124 +++++++++++++++++++++++
+ arch/m68k/lib/muldi3.c    |   10 ++
+ arch/m68k/lib/semaphore.S |   25 +++++
+ arch/m68k/lib/string.c    |   64 ++++++++++++
+ arch/m68k/lib/uaccess.c   |  242 +++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 465 insertions(+), 0 deletions(-)
+
+--- a/arch/m68k/lib/checksum.c
++++ b/arch/m68k/lib/checksum.c
+@@ -39,8 +39,131 @@
+  * computes a partial checksum, e.g. for TCP/UDP fragments
+  */
++#ifdef CONFIG_COLDFIRE
++
++static inline unsigned short from32to16(unsigned long x)
++{
++      /* add up 16-bit and 16-bit for 16+c bit */
++      x = (x & 0xffff) + (x >> 16);
++      /* add up carry.. */
++      x = (x & 0xffff) + (x >> 16);
++      return x;
++}
++
++static unsigned long do_csum(const unsigned char *buff, int len)
++{
++      int odd, count;
++      unsigned long result = 0;
++
++      if (len <= 0)
++              goto out;
++      odd = 1 & (unsigned long) buff;
++      if (odd) {
++              result = *buff;
++              len--;
++              buff++;
++      }
++      count = len >> 1;               /* nr of 16-bit words.. */
++      if (count) {
++              if (2 & (unsigned long) buff) {
++                      result += *(unsigned short *) buff;
++                      count--;
++                      len -= 2;
++                      buff += 2;
++              }
++              count >>= 1;            /* nr of 32-bit words.. */
++              if (count) {
++                      unsigned long carry = 0;
++                      do {
++                              unsigned long w = *(unsigned long *) buff;
++                              count--;
++                              buff += 4;
++                              result += carry;
++                              result += w;
++                              carry = (w > result);
++                      } while (count);
++                      result += carry;
++                      result = (result & 0xffff) + (result >> 16);
++              }
++              if (len & 2) {
++                      result += *(unsigned short *) buff;
++                      buff += 2;
++              }
++      }
++      if (len & 1)
++              result += (*buff << 8);
++      result = from32to16(result);
++      if (odd)
++              result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
++out:
++      return result;
++}
++
++/*
++ *    This is a version of ip_compute_csum() optimized for IP headers,
++ *    which always checksum on 4 octet boundaries.
++ */
++__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
++{
++      return ~do_csum(iph, ihl*4);
++}
++EXPORT_SYMBOL(ip_fast_csum);
++
++/*
++ * computes the checksum of a memory block at buff, length len,
++ * and adds in "sum" (32-bit)
++ *
++ * returns a 32-bit number suitable for feeding into itself
++ * or csum_tcpudp_magic
++ *
++ * this function must be called with even lengths, except
++ * for the last fragment, which may be odd
++ *
++ * it's best to have buff aligned on a 32-bit boundary
++ */
+ __wsum csum_partial(const void *buff, int len, __wsum sum)
+ {
++      unsigned int result = do_csum(buff, len);
++
++      /* add in old sum, and carry.. */
++      result += sum;
++      if (sum > result)
++              result += 1;
++      return result;
++}
++EXPORT_SYMBOL(csum_partial);
++
++/*
++ * copy from fs while checksumming, otherwise like csum_partial
++ */
++
++__wsum
++csum_partial_copy_from_user(const void __user *src, void *dst, int len,
++                          __wsum sum, int *csum_err)
++{
++      if (csum_err) *csum_err = 0;
++      memcpy(dst, src, len);
++      return csum_partial(dst, len, sum);
++}
++EXPORT_SYMBOL(csum_partial_copy_from_user);
++
++/*
++ * copy from ds while checksumming, otherwise like csum_partial
++ */
++
++__wsum
++csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
++{
++      memcpy(dst, src, len);
++      return csum_partial(dst, len, sum);
++}
++EXPORT_SYMBOL(csum_partial_copy_nocheck);
++
++#else /* !CONFIG_COLDFIRE */
++
++unsigned int
++csum_partial(const unsigned char *buff, int len, unsigned int sum)
++{
+       unsigned long tmp1, tmp2;
+         /*
+          * Experiments with ethernet and slip connections show that buff
+@@ -423,3 +546,4 @@ csum_partial_copy_nocheck(const void *sr
+     return(sum);
+ }
+ EXPORT_SYMBOL(csum_partial_copy_nocheck);
++#endif /* CONFIG_COLDFIRE */
+--- a/arch/m68k/lib/muldi3.c
++++ b/arch/m68k/lib/muldi3.c
+@@ -21,12 +21,22 @@ Boston, MA 02111-1307, USA.  */
+ #define BITS_PER_UNIT 8
++#ifdef CONFIG_COLDFIRE
++#define umul_ppmm(w1, w0, u, v) \
++  do { \
++       unsigned long long x; \
++       x = (unsigned long long)u * v; \
++       w0 = (unsigned long)(x & 0x00000000ffffffff); \
++       w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \
++     } while (0)
++#else /* CONFIG_COLDFIRE */
+ #define umul_ppmm(w1, w0, u, v) \
+   __asm__ ("mulu%.l %3,%1:%0"                                         \
+            : "=d" ((USItype)(w0)),                                    \
+              "=d" ((USItype)(w1))                                     \
+            : "%0" ((USItype)(u)),                                     \
+              "dmi" ((USItype)(v)))
++#endif /* CONFIG_COLDFIRE */
+ #define __umulsidi3(u, v) \
+   ({DIunion __w;                                                      \
+--- a/arch/m68k/lib/semaphore.S
++++ b/arch/m68k/lib/semaphore.S
+@@ -16,11 +16,24 @@
+  * there is contention on the semaphore.
+  */
+ ENTRY(__down_failed)
++#ifndef CONFIG_COLDFIRE
+       moveml %a0/%d0/%d1,-(%sp)
++#else
++      movel %a0,-(%sp)
++      movel %d0,-(%sp)
++      movel %d1,-(%sp)
++#endif
+       movel %a1,-(%sp)
+       jbsr __down
+       movel (%sp)+,%a1
++#ifndef CONFIG_COLDFIRE
+       moveml (%sp)+,%a0/%d0/%d1
++#else
++      movel (%sp)+,%d1
++      movel (%sp)+,%d0
++      movel (%sp)+,%a0
++#endif
++
+       rts
+ ENTRY(__down_failed_interruptible)
+@@ -44,10 +57,22 @@ ENTRY(__down_failed_trylock)
+       rts
+ ENTRY(__up_wakeup)
++#ifndef CONFIG_COLDFIRE
+       moveml %a0/%d0/%d1,-(%sp)
++#else
++      movel %a0,-(%sp)
++      movel %d0,-(%sp)
++      movel %d1,-(%sp)
++#endif
+       movel %a1,-(%sp)
+       jbsr __up
+       movel (%sp)+,%a1
++#ifndef CONFIG_COLDFIRE
+       moveml (%sp)+,%a0/%d0/%d1
++#else
++      movel (%sp)+,%d1
++      movel (%sp)+,%d0
++      movel (%sp)+,%a0
++#endif
+       rts
+--- a/arch/m68k/lib/string.c
++++ b/arch/m68k/lib/string.c
+@@ -15,6 +15,7 @@ char *strcpy(char *dest, const char *src
+ }
+ EXPORT_SYMBOL(strcpy);
++#ifndef CONFIG_COLDFIRE
+ void *memset(void *s, int c, size_t count)
+ {
+       void *xs = s;
+@@ -143,6 +144,69 @@ void *memcpy(void *to, const void *from,
+ }
+ EXPORT_SYMBOL(memcpy);
++#else /* CONFIG_COLDFIRE */
++
++void *memset(void *s, int c, size_t count)
++{
++  unsigned long x;
++  void *originalTo;
++
++  for (x = 0; x < count; x++)
++    *(unsigned char *)s++ = (unsigned char)c;
++
++  return originalTo;
++}
++EXPORT_SYMBOL(memset);
++
++void *memcpy(void *to, const void *from, size_t n)
++{
++  void *xto = to;
++  size_t temp;
++
++  if (!n)
++    return xto;
++  if ((long) to & 1) {
++      char *cto = to;
++      const char *cfrom = from;
++      *cto++ = *cfrom++;
++      to = cto;
++      from = cfrom;
++      n--;
++    }
++  if (n > 2 && (long) to & 2) {
++      short *sto = to;
++      const short *sfrom = from;
++      *sto++ = *sfrom++;
++      to = sto;
++      from = sfrom;
++      n -= 2;
++    }
++  temp = n >> 2;
++  if (temp) {
++      long *lto = to;
++      const long *lfrom = from;
++      for (; temp; temp--)
++      *lto++ = *lfrom++;
++      to = lto;
++      from = lfrom;
++    }
++  if (n & 2) {
++      short *sto = to;
++      const short *sfrom = from;
++      *sto++ = *sfrom++;
++      to = sto;
++      from = sfrom;
++    }
++  if (n & 1) {
++      char *cto = to;
++      const char *cfrom = from;
++      *cto = *cfrom;
++    }
++  return xto;
++}
++EXPORT_SYMBOL(memcpy);
++#endif /* CONFIG_COLDFIRE */
++
+ void *memmove(void *dest, const void *src, size_t n)
+ {
+       void *xdest = dest;
+--- a/arch/m68k/lib/uaccess.c
++++ b/arch/m68k/lib/uaccess.c
+@@ -5,6 +5,7 @@
+  */
+ #include <linux/module.h>
++#ifndef CONFIG_COLDFIRE
+ #include <asm/uaccess.h>
+ unsigned long __generic_copy_from_user(void *to, const void __user *from,
+@@ -220,3 +221,244 @@ unsigned long __clear_user(void __user *
+     return res;
+ }
+ EXPORT_SYMBOL(__clear_user);
++
++#else /* CONFIG_COLDFIRE */
++
++#include <asm/cf_uaccess.h>
++
++unsigned long __generic_copy_from_user(void *to, const void *from,
++              unsigned long n)
++{
++    unsigned long tmp;
++    __asm__ __volatile__
++      ("   tstl %2\n"
++       "   jeq 2f\n"
++       "1: movel (%1)+,%3\n"
++       "   movel %3,(%0)+\n"
++       "   subql #1,%2\n"
++       "   jne 1b\n"
++       "2: movel %4,%2\n"
++       "   bclr #1,%2\n"
++       "   jeq 4f\n"
++       "3: movew (%1)+,%3\n"
++       "   movew %3,(%0)+\n"
++       "4: bclr #0,%2\n"
++       "   jeq 6f\n"
++       "5: moveb (%1)+,%3\n"
++       "   moveb %3,(%0)+\n"
++       "6:\n"
++       ".section .fixup,\"ax\"\n"
++       "   .even\n"
++       "7: movel %2,%%d0\n"
++       "71:clrl (%0)+\n"
++       "   subql #1,%%d0\n"
++       "   jne 71b\n"
++       "   lsll #2,%2\n"
++       "   addl %4,%2\n"
++       "   btst #1,%4\n"
++       "   jne 81f\n"
++       "   btst #0,%4\n"
++       "   jne 91f\n"
++       "   jra 6b\n"
++       "8: addql #2,%2\n"
++       "81:clrw (%0)+\n"
++       "   btst #0,%4\n"
++       "   jne 91f\n"
++       "   jra 6b\n"
++       "9: addql #1,%2\n"
++       "91:clrb (%0)+\n"
++       "   jra 6b\n"
++       ".previous\n"
++       ".section __ex_table,\"a\"\n"
++       "   .align 4\n"
++       "   .long 1b,7b\n"
++       "   .long 3b,8b\n"
++       "   .long 5b,9b\n"
++       ".previous"
++       : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
++       : "d"(n & 3), "0"(to), "1"(from), "2"(n/4)
++       : "d0", "memory");
++    return n;
++}
++EXPORT_SYMBOL(__generic_copy_from_user);
++
++
++unsigned long __generic_copy_to_user(void *to, const void *from,
++              unsigned long n)
++{
++    unsigned long tmp;
++    __asm__ __volatile__
++      ("   tstl %2\n"
++       "   jeq 3f\n"
++       "1: movel (%1)+,%3\n"
++       "22:movel %3,(%0)+\n"
++       "2: subql #1,%2\n"
++       "   jne 1b\n"
++       "3: movel %4,%2\n"
++       "   bclr #1,%2\n"
++       "   jeq 4f\n"
++       "   movew (%1)+,%3\n"
++       "24:movew %3,(%0)+\n"
++       "4: bclr #0,%2\n"
++       "   jeq 5f\n"
++       "   moveb (%1)+,%3\n"
++       "25:moveb %3,(%0)+\n"
++       "5:\n"
++       ".section .fixup,\"ax\"\n"
++       "   .even\n"
++       "60:addql #1,%2\n"
++       "6: lsll #2,%2\n"
++       "   addl %4,%2\n"
++       "   jra 5b\n"
++       "7: addql #2,%2\n"
++       "   jra 5b\n"
++       "8: addql #1,%2\n"
++       "   jra 5b\n"
++       ".previous\n"
++       ".section __ex_table,\"a\"\n"
++       "   .align 4\n"
++       "   .long 1b,60b\n"
++       "   .long 22b,6b\n"
++       "   .long 2b,6b\n"
++       "   .long 24b,7b\n"
++       "   .long 3b,60b\n"
++       "   .long 4b,7b\n"
++       "   .long 25b,8b\n"
++       "   .long 5b,8b\n"
++       ".previous"
++       : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
++       : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4)
++       : "memory");
++    return n;
++}
++EXPORT_SYMBOL(__generic_copy_to_user);
++
++/*
++ * Copy a null terminated string from userspace.
++ */
++
++long strncpy_from_user(char *dst, const char *src, long count)
++{
++      long res = -EFAULT;
++      if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
++              return res;
++    if (count == 0) return count;
++    __asm__ __volatile__
++      ("1: moveb (%2)+,%%d0\n"
++       "12:moveb %%d0,(%1)+\n"
++       "   jeq 2f\n"
++       "   subql #1,%3\n"
++       "   jne 1b\n"
++       "2: subl %3,%0\n"
++       "3:\n"
++       ".section .fixup,\"ax\"\n"
++       "   .even\n"
++       "4: movel %4,%0\n"
++       "   jra 3b\n"
++       ".previous\n"
++       ".section __ex_table,\"a\"\n"
++       "   .align 4\n"
++       "   .long 1b,4b\n"
++       "   .long 12b,4b\n"
++       ".previous"
++       : "=d"(res), "=a"(dst), "=a"(src), "=d"(count)
++       : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count)
++       : "d0", "memory");
++    return res;
++}
++EXPORT_SYMBOL(strncpy_from_user);
++
++/*
++ * Return the size of a string (including the ending 0)
++ *
++ * Return 0 on exception, a value greater than N if too long
++ */
++long strnlen_user(const char *src, long n)
++{
++    long res = -EFAULT;
++    if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
++      return res;
++
++      res = -(long)src;
++      __asm__ __volatile__
++              ("1:\n"
++               "   tstl %2\n"
++               "   jeq 3f\n"
++               "2: moveb (%1)+,%%d0\n"
++               "22:\n"
++               "   subql #1,%2\n"
++               "   tstb %%d0\n"
++               "   jne 1b\n"
++               "   jra 4f\n"
++               "3:\n"
++               "   addql #1,%0\n"
++               "4:\n"
++               "   addl %1,%0\n"
++               "5:\n"
++               ".section .fixup,\"ax\"\n"
++               "   .even\n"
++               "6: moveq %3,%0\n"
++               "   jra 5b\n"
++               ".previous\n"
++               ".section __ex_table,\"a\"\n"
++               "   .align 4\n"
++               "   .long 2b,6b\n"
++               "   .long 22b,6b\n"
++               ".previous"
++               : "=d"(res), "=a"(src), "=d"(n)
++               : "i"(0), "0"(res), "1"(src), "2"(n)
++               : "d0");
++      return res;
++}
++EXPORT_SYMBOL(strnlen_user);
++
++
++/*
++ * Zero Userspace
++ */
++
++unsigned long __clear_user(void *to, unsigned long n)
++{
++    __asm__ __volatile__
++      ("   tstl %1\n"
++       "   jeq 3f\n"
++       "1: movel %3,(%0)+\n"
++       "2: subql #1,%1\n"
++       "   jne 1b\n"
++       "3: movel %2,%1\n"
++       "   bclr #1,%1\n"
++       "   jeq 4f\n"
++       "24:movew %3,(%0)+\n"
++       "4: bclr #0,%1\n"
++       "   jeq 5f\n"
++       "25:moveb %3,(%0)+\n"
++       "5:\n"
++       ".section .fixup,\"ax\"\n"
++       "   .even\n"
++       "61:addql #1,%1\n"
++       "6: lsll #2,%1\n"
++       "   addl %2,%1\n"
++       "   jra 5b\n"
++       "7: addql #2,%1\n"
++       "   jra 5b\n"
++       "8: addql #1,%1\n"
++       "   jra 5b\n"
++       ".previous\n"
++       ".section __ex_table,\"a\"\n"
++       "   .align 4\n"
++       "   .long 1b,61b\n"
++       "   .long 2b,6b\n"
++       "   .long 3b,61b\n"
++       "   .long 24b,7b\n"
++       "   .long 4b,7b\n"
++       "   .long 25b,8b\n"
++       "   .long 5b,8b\n"
++       ".previous"
++       : "=a"(to), "=d"(n)
++       : "r"(n & 3), "d"(0), "0"(to), "1"(n/4));
++    return n;
++}
++EXPORT_SYMBOL(__clear_user);
++
++#endif /* CONFIG_COLDFIRE */
++
diff --git a/target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch b/target/linux/coldfire/patches/007-mcfv4e_arch_mm_mods_1.patch
new file mode 100644 (file)
index 0000000..2abd477
--- /dev/null
@@ -0,0 +1,513 @@
+From 2bef1f8ce148cce9e782f75f9537767c1d8c0eea Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 16:58:27 -0600
+Subject: [PATCH] Core Coldfire/MCF5445x arch/mm changes.
+
+LTIBName: mcfv4e-arch-mm-mods-1
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/mm/Makefile |    1 +
+ arch/m68k/mm/cache.c  |   41 ++++++++
+ arch/m68k/mm/cf-mmu.c |  251 +++++++++++++++++++++++++++++++++++++++++++++++++
+ arch/m68k/mm/hwtest.c |    2 +
+ arch/m68k/mm/init.c   |    3 +-
+ arch/m68k/mm/kmap.c   |   13 +++
+ arch/m68k/mm/memory.c |   66 +++++++++++++-
+ 7 files changed, 373 insertions(+), 4 deletions(-)
+ create mode 100644 arch/m68k/mm/cf-mmu.c
+
+--- a/arch/m68k/mm/Makefile
++++ b/arch/m68k/mm/Makefile
+@@ -6,3 +6,4 @@ obj-y          := cache.o init.o fault.o hwtest.
+ obj-$(CONFIG_MMU_MOTOROLA)    += kmap.o memory.o motorola.o
+ obj-$(CONFIG_MMU_SUN3)                += sun3kmap.o sun3mmu.o
++obj-$(CONFIG_MMU_CFV4E)               += cf-mmu.o kmap.o memory.o
+--- a/arch/m68k/mm/cache.c
++++ b/arch/m68k/mm/cache.c
+@@ -10,7 +10,11 @@
+ #include <asm/pgalloc.h>
+ #include <asm/traps.h>
++#ifdef CONFIG_COLDFIRE
++#include <asm/cfcache.h>
++#endif /* CONFIG_COLDFIRE */
++#ifndef CONFIG_COLDFIRE
+ static unsigned long virt_to_phys_slow(unsigned long vaddr)
+ {
+       if (CPU_IS_060) {
+@@ -69,11 +73,45 @@ static unsigned long virt_to_phys_slow(u
+       }
+       return 0;
+ }
++#endif /* CONFIG_COLDFIRE */
++
+ /* Push n pages at kernel virtual address and clear the icache */
+ /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
+ void flush_icache_range(unsigned long address, unsigned long endaddr)
+ {
++#ifdef CONFIG_COLDFIRE
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      start_set = address & _ICACHE_SET_MASK;
++      end_set = endaddr & _ICACHE_SET_MASK;
++
++      if (start_set > end_set) {
++      /* from the begining to the lowest address */
++              for (set = 0; set <= end_set; set += (0x10 - 3))
++                      asm volatile ("cpushl %%ic,(%0)\n"
++                                    "\taddq%.l #1,%0\n"
++                                    "\tcpushl %%ic,(%0)\n"
++                                    "\taddq%.l #1,%0\n"
++                                    "\tcpushl %%ic,(%0)\n"
++                                    "\taddq%.l #1,%0\n"
++                                    "\tcpushl %%ic,(%0)" : : "a" (set));
++
++              /* next loop will finish the cache ie pass the hole */
++              end_set = LAST_ICACHE_ADDR;
++      }
++      for (set = start_set; set <= end_set; set += (0x10 - 3))
++              asm volatile ("cpushl %%ic,(%0)\n"
++                            "\taddq%.l #1,%0\n"
++                            "\tcpushl %%ic,(%0)\n"
++                            "\taddq%.l #1,%0\n"
++                            "\tcpushl %%ic,(%0)\n"
++                            "\taddq%.l #1,%0\n"
++                            "\tcpushl %%ic,(%0)" : : "a" (set));
++
++#else /* !CONFIG_COLDFIRE */
+       if (CPU_IS_040_OR_060) {
+               address &= PAGE_MASK;
+@@ -94,9 +132,11 @@ void flush_icache_range(unsigned long ad
+                             : "=&d" (tmp)
+                             : "di" (FLUSH_I));
+       }
++#endif /* CONFIG_COLDFIRE */
+ }
+ EXPORT_SYMBOL(flush_icache_range);
++#ifndef CONFIG_COLDFIRE
+ void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
+                            unsigned long addr, int len)
+ {
+@@ -115,4 +155,5 @@ void flush_icache_user_range(struct vm_a
+                             : "di" (FLUSH_I));
+       }
+ }
++#endif /* CONFIG_COLDFIRE */
+--- /dev/null
++++ b/arch/m68k/mm/cf-mmu.c
+@@ -0,0 +1,251 @@
++/*
++ * linux/arch/m68k/mm/cf-mmu.c
++ *
++ * Based upon linux/arch/m68k/mm/sun3mmu.c
++ * Based upon linux/arch/ppc/mm/mmu_context.c
++ *
++ * Implementations of mm routines specific to the Coldfire MMU.
++ *
++ * Copyright (c) 2008 Freescale Semiconductor, Inc.
++ */
++
++#include <linux/signal.h>
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <linux/swap.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#ifdef CONFIG_BLK_DEV_RAM
++#include <linux/blkdev.h>
++#endif
++#include <linux/bootmem.h>
++
++#include <asm/setup.h>
++#include <asm/uaccess.h>
++#include <asm/page.h>
++#include <asm/pgtable.h>
++#include <asm/system.h>
++#include <asm/machdep.h>
++#include <asm/io.h>
++#include <asm/mmu_context.h>
++#include <asm/cf_pgalloc.h>
++
++#include <asm/coldfire.h>
++#include <asm/tlbflush.h>
++
++mm_context_t next_mmu_context;
++unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
++
++atomic_t nr_free_contexts;
++struct mm_struct *context_mm[LAST_CONTEXT+1];
++void steal_context(void);
++
++
++const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n";
++
++extern unsigned long empty_bad_page_table;
++extern unsigned long empty_bad_page;
++extern unsigned long num_pages;
++
++extern char __init_begin, __init_end;
++
++void free_initmem(void)
++{
++      unsigned long addr;
++      unsigned long start = (unsigned long)&__init_begin;
++      unsigned long end = (unsigned long)&__init_end;
++
++      printk(KERN_INFO "free_initmem: __init_begin = 0x%lx  __init_end = 0x%lx\n", start, end);
++
++      addr = (unsigned long)&__init_begin;
++      for (; addr < (unsigned long)&__init_end; addr += PAGE_SIZE) {
++              /* not currently used */
++              virt_to_page(addr)->flags &= ~(1 << PG_reserved);
++              init_page_count(virt_to_page(addr));
++              free_page(addr);
++              totalram_pages++;
++      }
++}
++
++/* Coldfire paging_init derived from sun3 */
++void __init paging_init(void)
++{
++      pgd_t * pg_dir;
++      pte_t * pg_table;
++      int i;
++      unsigned long address;
++      unsigned long next_pgtable;
++      unsigned long bootmem_end;
++      unsigned long zones_size[MAX_NR_ZONES];
++      unsigned long size;
++      enum zone_type zone;
++
++      empty_zero_page = (void *)alloc_bootmem_pages(PAGE_SIZE);
++      memset((void *)empty_zero_page, 0, PAGE_SIZE);
++
++      pg_dir = swapper_pg_dir;
++      memset(swapper_pg_dir, 0, sizeof (swapper_pg_dir));
++
++      size = num_pages * sizeof(pte_t);  
++      size = (size + PAGE_SIZE) & ~(PAGE_SIZE-1);
++      next_pgtable = (unsigned long)alloc_bootmem_pages(size);
++
++      bootmem_end = (next_pgtable + size + PAGE_SIZE) & PAGE_MASK; 
++      pg_dir += PAGE_OFFSET >> PGDIR_SHIFT; 
++
++      address = PAGE_OFFSET;
++      while (address < (unsigned long)high_memory) 
++      {
++              pg_table = (pte_t *)next_pgtable; 
++              next_pgtable += PTRS_PER_PTE * sizeof (pte_t);
++              pgd_val(*pg_dir) = (unsigned long) pg_table;
++              pg_dir++;
++
++              /* now change pg_table to kernel virtual addresses */
++              for (i=0; i<PTRS_PER_PTE; ++i, ++pg_table)
++              {
++                      pte_t pte = pfn_pte(virt_to_pfn(address), PAGE_INIT);
++                      if (address >= (unsigned long)high_memory)
++                              pte_val (pte) = 0;
++
++                      set_pte (pg_table, pte);
++                      address += PAGE_SIZE;
++              }
++      }
++      
++      current->mm = NULL;
++
++      /* clear zones */
++      for (zone = 0; zone < MAX_NR_ZONES; zone++)
++              zones_size[zone] = 0x0;
++
++      /* allocate the bottom 32M (0x40x 0x41x) to DMA - head.S marks them NO CACHE */
++      /* JKM - this should be changed to allocate from the TOP (0x4f,0x4e) but the
++       * allocator is being a bit challenging */
++        zones_size[ZONE_DMA] = (32*1024*1024) >> PAGE_SHIFT;
++
++      /* allocate the rest to NORMAL - head.S marks them CACHE */
++      zones_size[ZONE_NORMAL] = (((unsigned long)high_memory - PAGE_OFFSET) >> PAGE_SHIFT) - zones_size[0];
++
++      free_area_init(zones_size);
++}
++
++
++int cf_tlb_miss(struct pt_regs *regs, int write, int dtlb, int extension_word)
++{
++        struct mm_struct *mm;
++        pgd_t *pgd;
++        pmd_t *pmd;
++        pte_t *pte;
++        unsigned long mmuar;
++        int asid;
++      int flags;
++
++      local_save_flags(flags);
++      local_irq_disable();
++
++      mmuar = ( dtlb ) ? regs->mmuar
++                       : regs->pc + (extension_word * sizeof(long));
++
++        mm = (!user_mode(regs) && (mmuar >= PAGE_OFFSET)) ? &init_mm
++                                                        : current->mm;
++        if (!mm) {
++          local_irq_restore(flags);
++          return (-1);
++      }
++
++        pgd = pgd_offset(mm, mmuar);
++        if (pgd_none(*pgd))  {
++          local_irq_restore(flags);
++          return (-1);
++      }
++          
++      pmd = pmd_offset(pgd, mmuar);
++      if (pmd_none(*pmd)) {
++          local_irq_restore(flags);
++          return (-1);
++      }       
++      
++      pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
++                                   : pte_offset_map(pmd, mmuar);
++      if (pte_none(*pte) || !pte_present(*pte)) {
++          local_irq_restore(flags);
++          return (-1);                
++      }
++
++      if (write) {
++            if (!pte_write(*pte)) {
++              local_irq_restore(flags);
++              return (-1);
++          }
++          set_pte(pte, pte_mkdirty(*pte));
++      }
++      
++        set_pte(pte, pte_mkyoung(*pte));
++        asid = mm->context & 0xff;
++        if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET)
++          set_pte(pte, pte_wrprotect(*pte));
++
++        *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
++               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT)
++               | MMUTR_V;
++
++        *MMUDR = (pte_val(*pte) & PAGE_MASK) 
++             | ((pte->pte) & CF_PAGE_MMUDR_MASK)
++               | MMUDR_SZ8K | MMUDR_X;
++          
++      if ( dtlb )
++          *MMUOR = MMUOR_ACC | MMUOR_UAA;
++      else
++          *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA;
++
++      asm ("nop");
++      /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
++                (pte_val(*pte)  & PAGE_MASK));*/
++      local_irq_restore(flags);
++        return (0);
++}
++
++
++/* The following was taken from arch/ppc/mmu_context.c
++ *
++ * Initialize the context management stuff.
++ */
++void __init mmu_context_init(void)
++{
++      /*
++       * Some processors have too few contexts to reserve one for
++       * init_mm, and require using context 0 for a normal task.
++       * Other processors reserve the use of context zero for the kernel.
++       * This code assumes FIRST_CONTEXT < 32.
++       */
++      context_map[0] = (1 << FIRST_CONTEXT) - 1;
++      next_mmu_context = FIRST_CONTEXT;
++      atomic_set(&nr_free_contexts, LAST_CONTEXT - FIRST_CONTEXT + 1);
++}
++
++/*
++ * Steal a context from a task that has one at the moment.
++ * This is only used on 8xx and 4xx and we presently assume that
++ * they don't do SMP.  If they do then thicfpgalloc.hs will have to check
++ * whether the MM we steal is in use.
++ * We also assume that this is only used on systems that don't
++ * use an MMU hash table - this is true for 8xx and 4xx.
++ * This isn't an LRU system, it just frees up each context in
++ * turn (sort-of pseudo-random replacement :).  This would be the
++ * place to implement an LRU scheme if anyone was motivated to do it.
++ *  -- paulus
++ */
++void steal_context(void)
++{
++      struct mm_struct *mm;
++      /* free up context `next_mmu_context' */
++      /* if we shouldn't free context 0, don't... */
++      if (next_mmu_context < FIRST_CONTEXT)
++              next_mmu_context = FIRST_CONTEXT;
++      mm = context_mm[next_mmu_context];
++      flush_tlb_mm(mm);
++      destroy_context(mm);
++}
+--- a/arch/m68k/mm/hwtest.c
++++ b/arch/m68k/mm/hwtest.c
+@@ -25,6 +25,7 @@
+ #include <linux/module.h>
++#ifndef CONFIG_COLDFIRE
+ int hwreg_present( volatile void *regp )
+ {
+     int       ret = 0;
+@@ -82,4 +83,5 @@ int hwreg_write( volatile void *regp, un
+       return( ret );
+ }
+ EXPORT_SYMBOL(hwreg_write);
++#endif
+--- a/arch/m68k/mm/init.c
++++ b/arch/m68k/mm/init.c
+@@ -122,7 +122,6 @@ void __init mem_init(void)
+       if (MACH_IS_ATARI)
+               atari_stram_mem_init_hook();
+ #endif
+-
+       /* this will put all memory onto the freelists */
+       totalram_pages = num_physpages = 0;
+       for_each_online_pgdat(pgdat) {
+@@ -146,7 +145,7 @@ void __init mem_init(void)
+               }
+       }
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+       /* insert pointer tables allocated so far into the tablelist */
+       init_pointer_table((unsigned long)kernel_pg_dir);
+       for (i = 0; i < PTRS_PER_PGD; i++) {
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -24,7 +24,11 @@
+ #undef DEBUG
++#ifndef CONFIG_COLDFIRE
+ #define PTRTREESIZE   (256*1024)
++#else
++#define PTRTREESIZE     PAGE_SIZE
++#endif
+ /*
+  * For 040/060 we can use the virtual memory area like other architectures,
+@@ -50,7 +54,11 @@ static inline void free_io_area(void *ad
+ #else
++#ifdef CONFIG_COLDFIRE
++#define IO_SIZE         PAGE_SIZE
++#else
+ #define IO_SIZE               (256*1024)
++#endif
+ static struct vm_struct *iolist;
+@@ -170,7 +178,12 @@ void __iomem *__ioremap(unsigned long ph
+                       break;
+               }
+       } else {
++#ifndef CONFIG_COLDFIRE
+               physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
++#else
++              physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \
++                           _PAGE_READWRITE);
++#endif
+               switch (cacheflag) {
+               case IOMAP_NOCACHE_SER:
+               case IOMAP_NOCACHE_NONSER:
+--- a/arch/m68k/mm/memory.c
++++ b/arch/m68k/mm/memory.c
+@@ -203,7 +203,38 @@ static inline void pushcl040(unsigned lo
+ void cache_clear (unsigned long paddr, int len)
+ {
+-    if (CPU_IS_040_OR_060) {
++    if (CPU_IS_CFV4E) {
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      start_set = paddr & _ICACHE_SET_MASK;
++      end_set = (paddr+len-1) & _ICACHE_SET_MASK;
++
++      if (start_set > end_set) {
++              /* from the begining to the lowest address */
++              for (set = 0; set <= end_set; set += (0x10 - 3))
++                      asm volatile("cpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)" : : "a" (set));
++
++              /* next loop will finish the cache ie pass the hole */
++              end_set = LAST_ICACHE_ADDR;
++      }
++      for (set = start_set; set <= end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)" : : "a" (set));
++
++    } else if (CPU_IS_040_OR_060) {
+       int tmp;
+       /*
+@@ -250,7 +281,38 @@ EXPORT_SYMBOL(cache_clear);
+ void cache_push (unsigned long paddr, int len)
+ {
+-    if (CPU_IS_040_OR_060) {
++    if (CPU_IS_CFV4E) {
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      start_set = paddr & _ICACHE_SET_MASK;
++      end_set = (paddr+len-1) & _ICACHE_SET_MASK;
++
++      if (start_set > end_set) {
++              /* from the begining to the lowest address */
++              for (set = 0; set <= end_set; set += (0x10 - 3))
++                      asm volatile("cpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%bc,(%0)" : : "a" (set));
++
++              /* next loop will finish the cache ie pass the hole */
++              end_set = LAST_ICACHE_ADDR;
++      }
++      for (set = start_set; set <= end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%bc,(%0)" : : "a" (set));
++
++    } else if (CPU_IS_040_OR_060) {
+       int tmp = PAGE_SIZE;
+       /*
diff --git a/target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch b/target/linux/coldfire/patches/008-mcfv4e_coldfire_code.patch
new file mode 100644 (file)
index 0000000..9da89c8
--- /dev/null
@@ -0,0 +1,4484 @@
+From 70b2bd01829b38a1a79caeda05d436b2e5fecf82 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 17:00:18 -0600
+Subject: [PATCH] Core Coldfire/MCF5445x specific code.
+
+LTIBName: mcfv4e-coldfire-code
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/Makefile       |   11 +
+ arch/m68k/coldfire/cache.c        |  215 +++++++++
+ arch/m68k/coldfire/config.c       |  420 ++++++++++++++++++
+ arch/m68k/coldfire/entry.S        |  701 ++++++++++++++++++++++++++++++
+ arch/m68k/coldfire/head.S         |  474 ++++++++++++++++++++
+ arch/m68k/coldfire/ints.c         |  384 ++++++++++++++++
+ arch/m68k/coldfire/iomap.c        |   54 +++
+ arch/m68k/coldfire/mcf5445x-pci.c |  427 ++++++++++++++++++
+ arch/m68k/coldfire/muldi3.S       |   64 +++
+ arch/m68k/coldfire/pci.c          |  245 +++++++++++
+ arch/m68k/coldfire/signal.c       |  868 +++++++++++++++++++++++++++++++++++++
+ arch/m68k/coldfire/traps.c        |  454 +++++++++++++++++++
+ arch/m68k/coldfire/vmlinux-cf.lds |   92 ++++
+ 13 files changed, 4409 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/coldfire/Makefile
+ create mode 100644 arch/m68k/coldfire/cache.c
+ create mode 100644 arch/m68k/coldfire/config.c
+ create mode 100644 arch/m68k/coldfire/entry.S
+ create mode 100644 arch/m68k/coldfire/head.S
+ create mode 100644 arch/m68k/coldfire/ints.c
+ create mode 100644 arch/m68k/coldfire/iomap.c
+ create mode 100644 arch/m68k/coldfire/mcf5445x-pci.c
+ create mode 100644 arch/m68k/coldfire/muldi3.S
+ create mode 100644 arch/m68k/coldfire/pci.c
+ create mode 100644 arch/m68k/coldfire/signal.c
+ create mode 100644 arch/m68k/coldfire/traps.c
+ create mode 100644 arch/m68k/coldfire/vmlinux-cf.lds
+
+--- /dev/null
++++ b/arch/m68k/coldfire/Makefile
+@@ -0,0 +1,11 @@
++#
++# Makefile for Linux arch/m68k/coldfire source directory
++#
++
++obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o
++
++ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
++      obj-y   += usb.o usb/
++endif
++
++obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+--- /dev/null
++++ b/arch/m68k/coldfire/cache.c
+@@ -0,0 +1,215 @@
++/*
++ *  linux/arch/m68k/coldifre/cache.c
++ *
++ *  Matt Waddel Matt.Waddel@freescale.com
++ *  Copyright Freescale Semiconductor, Inc. 2007
++ *
++ *  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/interrupt.h>
++#include <asm/cfcache.h>
++#include <asm/coldfire.h>
++#include <asm/system.h>
++
++#define _DCACHE_SIZE (2*16384)
++#define _ICACHE_SIZE (2*16384)
++
++#define _SET_SHIFT 4
++
++/*
++ * Masks for cache sizes.  Programming note: because the set size is a
++ * power of two, the mask is also the last address in the set.
++ */
++
++#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT)
++#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT)
++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
++
++/************************************************************
++ *  Routine to cleanly flush the cache, pushing all lines and
++ *  invalidating them.
++ *
++ *  The is the flash-resident version, used after copying the .text
++ *  segment from flash to ram.
++ *************************************************************/
++void FLASHDcacheFlushInvalidate(void)
++      __attribute__ ((section (".text_loader")));
++
++void FLASHDcacheFlushInvalidate()
++{
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      start_set = 0;
++      end_set = (unsigned long)LAST_DCACHE_ADDR;
++
++      for (set = start_set; set < end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)" : : "a" (set));
++}
++
++/************************************************************
++ *  Routine to cleanly flush the cache, pushing all lines and
++ *  invalidating them.
++ *
++ *************************************************************/
++void DcacheFlushInvalidate()
++{
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      start_set = 0;
++      end_set = (unsigned long)LAST_DCACHE_ADDR;
++
++      for (set = start_set; set < end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)" : : "a" (set));
++}
++
++
++
++/******************************************************************************
++ *  Routine to cleanly flush the a block of cache, pushing all relevant lines
++ *  and invalidating them.
++ *
++ ******************************************************************************/
++void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size)
++{
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      /* if size is bigger than the cache can store
++       * set the size to the maximum amount
++       */
++
++      if (size > LAST_DCACHE_ADDR)
++              size = LAST_DCACHE_ADDR;
++
++      start_set = ((unsigned long)start) & _DCACHE_SET_MASK;
++      end_set = ((unsigned long)(start+size-1)) & _DCACHE_SET_MASK;
++
++      if (start_set > end_set) {
++              /* from the begining to the lowest address */
++              for (set = 0; set <= end_set; set += (0x10 - 3))
++                      asm volatile("cpushl %%dc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%dc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%dc,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%dc,(%0)" : : "a" (set));
++
++              /* next loop will finish the cache ie pass the hole */
++              end_set = LAST_DCACHE_ADDR;
++      }
++      for (set = start_set; set <= end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%dc,(%0)" : : "a" (set));
++}
++
++
++void IcacheInvalidateCacheBlock(void *start, unsigned long size)
++{
++      unsigned long set;
++      unsigned long start_set;
++      unsigned long end_set;
++
++      /* if size is bigger than the cache can store
++       * set the size to the maximum ammount
++       */
++
++      if (size > LAST_ICACHE_ADDR)
++              size = LAST_ICACHE_ADDR;
++
++      start_set = ((unsigned long)start) & _ICACHE_SET_MASK;
++      end_set = ((unsigned long)(start+size-1)) & _ICACHE_SET_MASK;
++
++      if (start_set > end_set) {
++              /* from the begining to the lowest address */
++              for (set = 0; set <= end_set; set += (0x10 - 3))
++                      asm volatile("cpushl %%ic,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%ic,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%ic,(%0)\n"
++                                   "\taddq%.l #1,%0\n"
++                                   "\tcpushl %%ic,(%0)" : : "a" (set));
++
++              /* next loop will finish the cache ie pass the hole */
++              end_set = LAST_ICACHE_ADDR;
++      }
++      for (set = start_set; set <= end_set; set += (0x10 - 3))
++              asm volatile("cpushl %%ic,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%ic,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%ic,(%0)\n"
++                           "\taddq%.l #1,%0\n"
++                           "\tcpushl %%ic,(%0)" : : "a" (set));
++}
++
++
++/********************************************************************
++ *  Disable the data cache completely
++ ********************************************************************/
++void DcacheDisable(void)
++{
++      int newValue;
++      unsigned long flags;
++
++      local_save_flags(flags);
++      local_irq_disable();
++
++      DcacheFlushInvalidate();      /* begin by flushing the cache */
++      newValue = CACHE_DISABLE_MODE; /* disable it */
++      cacr_set(newValue);
++      local_irq_restore(flags);
++}
++
++/********************************************************************
++ *  Unconditionally enable the data cache
++ ********************************************************************/
++void DcacheEnable(void)
++{
++      cacr_set(CACHE_INITIAL_MODE);
++}
++
++
++unsigned long shadow_cacr;
++
++void cacr_set(unsigned long x)
++{
++      shadow_cacr = x;
++
++      __asm__ __volatile__ ("movec %0, %%cacr"
++                            : /* no outputs */
++                            : "r" (shadow_cacr));
++}
++
++unsigned long cacr_get(void)
++{
++      return shadow_cacr;
++}
+--- /dev/null
++++ b/arch/m68k/coldfire/config.c
+@@ -0,0 +1,420 @@
++/*
++ *  linux/arch/m68k/coldifre/config.c
++ *
++ *  Matt Waddel Matt.Waddel@freescale.com
++ *  Copyright Freescale Semiconductor, Inc. 2007
++ *
++ *  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/module.h>
++#include <linux/init.h>
++#include <linux/string.h>
++#include <linux/kernel.h>
++#include <linux/console.h>
++#include <linux/bootmem.h>
++#include <linux/mm.h>
++#include <asm/bootinfo.h>
++#include <asm/machdep.h>
++#include <asm/coldfire.h>
++#include <asm/cfcache.h>
++#include <asm/bootinfo.h>
++#include <asm/io.h>
++#include <asm/cfmmu.h>
++#include <asm/setup.h>
++#include <asm/irq.h>
++#include <asm/traps.h>
++#include <asm/movs.h>
++#include <asm/movs.h>
++#include <asm/page.h>
++#include <asm/pgalloc.h>
++#include <asm/mcf5445x_intc.h>
++#include <asm/mcf5445x_sdramc.h>
++#include <asm/mcf5445x_fbcs.h>
++#include <asm/mcf5445x_dtim.h>
++
++/* JKM -- testing */
++#include <linux/pfn.h>
++/* JKM */
++
++extern int get_irq_list(struct seq_file *p, void *v);
++extern char _text, _end;
++extern char _etext, _edata, __init_begin, __init_end;
++extern struct console mcfrs_console;
++extern char m68k_command_line[CL_SIZE];
++extern unsigned long availmem;
++
++static int irq_enable[NR_IRQS];
++unsigned long num_pages;
++
++void coldfire_sort_memrec(void)
++{
++      int i, j;
++
++      /* Sort the m68k_memory records by address */
++      for (i = 0; i < m68k_num_memory; ++i) {
++              for (j = i + 1; j < m68k_num_memory; ++j) {
++                      if (m68k_memory[i].addr > m68k_memory[j].addr) {
++                              struct mem_info tmp;
++                              tmp = m68k_memory[i];
++                              m68k_memory[i] = m68k_memory[j];
++                              m68k_memory[j] = tmp;
++                      }
++              }
++      }
++      /* Trim off discontiguous bits */
++      for (i = 1; i < m68k_num_memory; ++i) {
++              if ((m68k_memory[i-1].addr + m68k_memory[i-1].size) !=
++                      m68k_memory[i].addr) {
++                      printk(KERN_DEBUG "m68k_parse_bootinfo: addr gap between \
++                              0x%lx & 0x%lx\n",
++                              m68k_memory[i-1].addr+m68k_memory[i-1].size,
++                              m68k_memory[i].addr);
++                      m68k_num_memory = i;
++                      break;
++              }
++      }
++}
++
++int __init uboot_commandline(char *bootargs)
++{
++      int len = 0, cmd_line_len;
++      static struct uboot_record uboot_info;
++
++      extern unsigned long uboot_info_stk;
++
++      /* Add 0x80000000 to get post-remapped kernel memory location */
++      uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + 0x80000000;
++      uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + 0x80000000;
++      uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + 0x80000000;
++      uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + 0x80000000;
++      uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + 0x80000000;
++
++      cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start;
++      if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1))
++              len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\
++                                 cmd_line_len);
++
++      return len;
++}
++
++/*
++ * This routine does things not done in the bootloader.
++ */
++#define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++asmlinkage void __init cf_early_init(void)
++{
++      struct bi_record *record = (struct bi_record *) &_end;
++
++      extern char _end;
++
++      SET_VBR((void *)MCF_RAMBAR1);
++
++      /* Mask all interrupts */
++      MCF_INTC0_IMRL = 0xFFFFFFFF;
++      MCF_INTC0_IMRH = 0xFFFFFFFF;
++      MCF_INTC1_IMRL = 0xFFFFFFFF;
++      MCF_INTC1_IMRH = 0xFFFFFFFF;
++
++#if defined(CONFIG_NOR_FLASH_BASE)
++      MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE;
++#else
++      MCF_FBCS_CSAR(1) = 0x00000000;
++#endif
++
++#if CONFIG_SDRAM_SIZE > (256*1024*1024)
++      /* Init optional SDRAM chip select */
++      MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B;
++#endif
++
++      m68k_machtype = MACH_CFMMU;
++      m68k_fputype = FPU_CFV4E;
++      m68k_mmutype = MMU_CFV4E;
++      m68k_cputype = CPU_CFV4E;
++
++      m68k_num_memory = 0;
++      m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
++      m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
++
++      if (!uboot_commandline(m68k_command_line)) {
++#if defined(CONFIG_BOOTPARAM)
++              strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
++#else
++              strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
++#endif
++      }
++
++
++#if defined(CONFIG_BLK_DEV_INITRD)
++      /* add initrd image */
++      record = (struct bi_record *) ((void *)record + record->size);
++      record->tag = BI_RAMDISK;
++      record->size =  sizeof(record->tag) + sizeof(record->size)
++              + sizeof(record->data[0]) + sizeof(record->data[1]);
++#endif
++
++      /* Mark end of tags. */
++      record = (struct bi_record *) ((void *) record + record->size);
++      record->tag = 0;
++      record->data[0] = 0;
++      record->data[1] = 0;
++      record->size = sizeof(record->tag) + sizeof(record->size)
++              + sizeof(record->data[0]) + sizeof(record->data[1]);
++
++      /* Invalidate caches via CACR */
++      cacr_set(CACHE_DISABLE_MODE);
++
++      /* Turn on caches via CACR, enable EUSP */
++      cacr_set(CACHE_INITIAL_MODE);
++}
++
++void settimericr(unsigned int timer, unsigned int level)
++{
++      volatile unsigned char *icrp;
++      unsigned int icr;
++      unsigned char irq;
++
++      if (timer <= 2) {
++              switch (timer) {
++              case 2:  irq = 33; icr = MCFSIM_ICR_TIMER2; break;
++              default: irq = 32; icr = MCFSIM_ICR_TIMER1; break;
++              }
++
++              icrp = (volatile unsigned char *) (icr);
++              *icrp = level;
++              coldfire_enable_irq0(irq);
++      }
++}
++
++/* Assembler routines */
++asmlinkage void buserr(void);
++asmlinkage void trap(void);
++asmlinkage void system_call(void);
++asmlinkage void inthandler(void);
++
++void __init coldfire_trap_init(void)
++{
++      int i = 0;
++      e_vector *vectors;
++
++      vectors = (e_vector *)MCF_RAMBAR1;
++      /*
++       * There is a common trap handler and common interrupt
++       * handler that handle almost every vector. We treat
++       * the system call and bus error special, they get their
++       * own first level handlers.
++       */
++      for (i = 3; (i <= 23); i++)
++              vectors[i] = trap;
++      for (i = 33; (i <= 63); i++)
++              vectors[i] = trap;
++      for (i = 24; (i <= 31); i++)
++              vectors[i] = inthandler;
++      for (i = 64; (i < 255); i++)
++              vectors[i] = inthandler;
++
++      vectors[255] = 0;
++      vectors[2] = buserr;
++      vectors[32] = system_call;
++}
++
++void coldfire_tick(void)
++{
++      /* Reset the ColdFire timer */
++      __raw_writeb(MCF_DTIM_DTER_CAP | MCF_DTIM_DTER_REF, MCF_DTIM0_DTER);
++}
++
++void __init coldfire_sched_init(irq_handler_t handler)
++{
++      unsigned int    mcf_timerlevel = 5;
++      unsigned int    mcf_timervector = 64+32;
++
++      __raw_writew(MCF_DTIM_DTMR_RST_RST, MCF_DTIM0_DTMR);
++      __raw_writel(((MCF_BUSCLK / 16) / HZ), MCF_DTIM0_DTRR);
++      __raw_writew(MCF_DTIM_DTMR_ORRI | MCF_DTIM_DTMR_CLK_DIV16 |
++                   MCF_DTIM_DTMR_FRR  | MCF_DTIM_DTMR_RST_EN, \
++                   MCF_DTIM0_DTMR);
++
++      request_irq(mcf_timervector, handler, SA_INTERRUPT, \
++                  "timer", (void *)MCF_DTIM0_DTMR);
++
++      settimericr(1, mcf_timerlevel);
++}
++
++int timerirqpending(int timer)
++{
++      unsigned int imr = 0;
++
++      switch (timer) {
++      case 1:  imr = 0x1; break;
++      case 2:  imr = 0x2; break;
++      default: break;
++      }
++
++      return (getiprh() & imr);
++}
++
++unsigned long coldfire_gettimeoffset(void)
++{
++      volatile unsigned long trr, tcn, offset;
++
++      tcn = __raw_readw(MCF_DTIM0_DTCN);
++      trr = __raw_readl(MCF_DTIM0_DTRR);
++      offset = (tcn * (1000000 / HZ)) / trr;
++
++      /* Check if we just wrapped the counters and maybe missed a tick */
++      if ((offset < (1000000 / HZ / 2)) && timerirqpending(1))
++              offset += 1000000 / HZ;
++      return offset;
++}
++
++void coldfire_reboot(void)
++{
++      /* disable interrupts and do a software reset */
++      asm("movew #0x2700, %%sr\n\t"
++          "moveb #0x80, %%d0\n\t"
++          "moveb %%d0, 0xfc0a0000\n\t"
++          : : : "%d0");
++}
++
++/* int coldfire_hwclk(int i, struct rtc_time *t)
++{
++      printk ("Real time clock needs porting.\n");
++      return 0;
++}*/
++
++static void coldfire_get_model(char *model)
++{
++      sprintf(model, "Version 4 ColdFire");
++}
++
++void coldfire_enable_irq(unsigned int vec)
++{
++      unsigned long flags;
++
++      vec -= 64;
++
++      if (((int)vec < 0) || (vec > 63)) {
++              printk(KERN_WARNING "enable_irq %d failed\n", vec);
++              return;
++      }
++
++      local_irq_save(flags);
++      irq_enable[vec]++;
++      if (vec < 32)
++              MCF_INTC0_IMRL &= ~(1 << vec);
++      else
++              MCF_INTC0_IMRH &= ~(1 << (vec - 32));
++      local_irq_restore(flags);
++}
++
++void coldfire_disable_irq(unsigned int vec)
++{
++      unsigned long flags;
++
++      vec -= 64;
++
++      if (((int)vec < 0) || (vec > 63)) {
++              printk(KERN_WARNING "disable_irq %d failed\n", vec);
++              return;
++      }
++
++      local_irq_save(flags);
++      if (--irq_enable[vec] == 0) {
++              if (vec < 32)
++                      MCF_INTC0_IMRL |= (1 << vec);
++              else
++                      MCF_INTC0_IMRH |= (1 << (vec - 32));
++
++      }
++      local_irq_restore(flags);
++}
++
++static void __init
++coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end)
++{
++      unsigned long base_pfn;
++
++      /* compute total pages in system */
++      num_pages = PAGE_ALIGN(memory_end - PAGE_OFFSET) >> PAGE_SHIFT;
++
++      /* align start/end to page boundries */
++      memory_start = PAGE_ALIGN(memory_start);
++      memory_end = memory_end & PAGE_MASK;
++
++      /* page numbers */
++      base_pfn = __pa(PAGE_OFFSET) >> PAGE_SHIFT;
++      min_low_pfn = __pa(memory_start) >> PAGE_SHIFT;
++      max_low_pfn = __pa(memory_end) >> PAGE_SHIFT;
++
++      high_memory = (void *)memory_end;
++      availmem = memory_start;
++
++      /* setup bootmem data */
++      m68k_setup_node(0);
++      availmem += init_bootmem_node(NODE_DATA(0), min_low_pfn,
++              base_pfn, max_low_pfn);
++      availmem = PAGE_ALIGN(availmem);
++      free_bootmem(__pa(availmem), memory_end - (availmem));
++}
++
++void __init config_coldfire(void)
++{
++      unsigned long endmem, startmem;
++      int i;
++
++      /*
++       * Calculate endmem from m68k_memory, assume all are contiguous
++       */
++      startmem = ((((int) &_end) + (PAGE_SIZE - 1)) & PAGE_MASK);
++      endmem = PAGE_OFFSET;
++      for (i = 0; i < m68k_num_memory; ++i)
++              endmem += m68k_memory[i].size;
++
++      printk(KERN_INFO "starting up linux startmem 0x%lx, endmem 0x%lx, \
++              size %luMB\n", startmem,  endmem, (endmem - startmem) >> 20);
++
++      memset(irq_enable, 0, sizeof(irq_enable));
++
++      /*
++       * Setup coldfire mach-specific handlers
++       */
++      mach_max_dma_address    = 0xffffffff;
++      mach_sched_init         = coldfire_sched_init;
++      mach_tick               = coldfire_tick;
++      mach_gettimeoffset      = coldfire_gettimeoffset;
++      mach_reset              = coldfire_reboot;
++/*    mach_hwclk              = coldfire_hwclk; to be done */
++      mach_get_model          = coldfire_get_model;
++
++      coldfire_bootmem_alloc(startmem, endmem);
++
++      /*
++       * initrd setup
++       */
++/* #ifdef CONFIG_BLK_DEV_INITRD
++      if (m68k_ramdisk.size)  {
++              reserve_bootmem (__pa(m68k_ramdisk.addr), m68k_ramdisk.size);
++              initrd_start = (unsigned long) m68k_ramdisk.addr;
++              initrd_end = initrd_start + m68k_ramdisk.size;
++              printk (KERN_DEBUG "initrd: %08lx - %08lx\n", initrd_start,
++                      initrd_end);
++      }
++#endif */
++
++#if defined(CONFIG_DUMMY_CONSOLE) || defined(CONFIG_FRAMEBUFFER_CONSOLE)
++      conswitchp = &dummy_con;
++#endif
++
++#if defined(CONFIG_SERIAL_COLDFIRE)
++      /*
++       * This causes trouble when it is re-registered later.
++       * Currently this is fixed by conditionally commenting
++       * out the register_console in mcf_serial.c
++       */
++      register_console(&mcfrs_console);
++#endif
++}
+--- /dev/null
++++ b/arch/m68k/coldfire/entry.S
+@@ -0,0 +1,701 @@
++/*
++ *  arch/m68k/coldfire/entry.S
++ *
++ *  Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com)
++ *  Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
++ *                      Kenneth Albanowski <kjahds@kjahds.com>,
++ *  Copyright (C) 2000  Lineo Inc. (www.lineo.com)
++ *  Copyright (C) 2004-2006  Macq Electronique SA. (www.macqel.com)
++ *  Matt Waddel Matt.Waddel@freescale.com
++ *  Kurt Mahan kmahan@freescale.com
++ *  Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * Based on:
++ *
++ *  arch/m68knommu/platform/5307/entry.S &
++ *  arch/m68k/kernel/entry.S
++ *
++ *  Copyright (C) 1991, 1992  Linus Torvalds
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file README.legal in the main directory of this archive
++ * for more details.
++ *
++ * Linux/m68k support by Hamish Macdonald
++ *
++ * ColdFire support by Greg Ungerer (gerg@snapgear.com)
++ * 5307 fixes by David W. Miller
++ * linux 2.4 support David McCullough <davidm@snapgear.com>
++ * Bug, speed and maintainability fixes by Philippe De Muyter <phdm@macqel.be>
++ * Ported to mmu Coldfire by Matt Waddel
++ */
++
++#include <linux/sys.h>
++#include <linux/linkage.h>
++#include <asm/cf_entry.h>
++#include <asm/errno.h>
++#include <asm/setup.h>
++#include <asm/segment.h>
++#include <asm/traps.h>
++#include <asm/unistd.h>
++
++/*
++ * TASK_INFO:
++ *
++ *  - TINFO_PREEMPT (struct thread_info / preempt_count)
++ *      Used to keep track of preemptability
++ *  - TINFO_FLAGS (struct thread_info / flags - include/asm-m68k/thread_info.h)
++ *      Various bit flags that are checked for scheduling/tracing
++ *    Bits 0-7  are checked every exception exit
++ *         8-15 are checked every syscall exit
++ *
++ *      TIF_SIGPENDING                6
++ *      TIF_NEED_RESCHED      7
++ *      TIF_DELAYED_TRACE     14
++ *      TIF_SYSCALL_TRACE     15
++ *      TIF_MEMDIE            16 (never checked here)
++ */
++
++.bss
++
++sw_ksp:
++.long 0
++
++sw_usp:
++.long 0
++
++.text
++
++.globl system_call
++.globl buserr
++.globl trap
++.globl resume
++.globl ret_from_exception
++.globl ret_from_signal
++.globl sys_call_table
++.globl ret_from_interrupt
++.globl inthandler
++
++ENTRY(buserr)
++      SAVE_ALL_INT
++      GET_CURRENT(%d0)
++      movel   %sp,%sp@-               /* stack frame pointer argument */
++      jsr     buserr_c
++      addql   #4,%sp
++      jra     .Lret_from_exception
++
++ENTRY(trap)
++      SAVE_ALL_INT
++      GET_CURRENT(%d0)
++      movel   %sp,%sp@-               /* stack frame pointer argument */
++      jsr     trap_c
++      addql   #4,%sp
++      jra     .Lret_from_exception
++
++      /* After a fork we jump here directly from resume,
++         %d1 contains the previous task schedule_tail */
++ENTRY(ret_from_fork)
++      movel   %d1,%sp@-
++      jsr     schedule_tail
++      addql   #4,%sp
++      jra     .Lret_from_exception
++
++do_trace_entry:
++      movel   #-ENOSYS,%d1            /* needed for strace */
++      movel   %d1,%sp@(PT_D0)
++      subql   #4,%sp
++      SAVE_SWITCH_STACK
++      jbsr    syscall_trace
++      RESTORE_SWITCH_STACK
++      addql   #4,%sp
++      movel   %sp@(PT_ORIG_D0),%d0
++      cmpl    #NR_syscalls,%d0
++      jcs     syscall
++badsys:
++      movel   #-ENOSYS,%d1
++      movel   %d1,%sp@(PT_D0)
++      jra     ret_from_exception
++
++do_trace_exit:
++      subql   #4,%sp
++      SAVE_SWITCH_STACK
++      jbsr    syscall_trace
++      RESTORE_SWITCH_STACK
++      addql   #4,%sp
++      jra     .Lret_from_exception
++
++ENTRY(ret_from_signal)
++      RESTORE_SWITCH_STACK
++      addql   #4,%sp
++      jra     .Lret_from_exception
++
++ENTRY(system_call)
++      SAVE_ALL_SYS
++
++      GET_CURRENT(%d1)
++      /* save top of frame */
++      movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
++
++      /* syscall trace */
++      tstb    %curptr@(TASK_INFO+TINFO_FLAGS+2)
++      jmi     do_trace_entry          /* SYSCALL_TRACE is set */
++      cmpl    #NR_syscalls,%d0
++      jcc     badsys
++syscall:
++      movel   #sys_call_table,%a0
++      asll    #2,%d0
++      addl    %d0,%a0
++      movel   %a0@,%a0
++      jsr     %a0@
++      movel   %d0,%sp@(PT_D0)         /* save the return value */
++ret_from_syscall:
++      movew   %curptr@(TASK_INFO+TINFO_FLAGS+2),%d0
++      jne     syscall_exit_work       /* flags set so process */
++1:    RESTORE_ALL
++
++syscall_exit_work:
++      btst    #5,%sp@(PT_SR)          /* check if returning to kernel */
++      bnes    1b                      /* if so, skip resched, signals */
++
++      btstl   #15,%d0                 /* check if SYSCALL_TRACE */
++      jne     do_trace_exit
++      btstl   #14,%d0                 /* check if DELAYED_TRACE */
++      jne     do_delayed_trace
++      btstl   #6,%d0                  /* check if SIGPENDING */
++      jne     do_signal_return
++      pea     resume_userspace
++      jra     schedule
++
++ENTRY(ret_from_exception)
++.Lret_from_exception:
++      btst    #5,%sp@(PT_SR)          /* check if returning to kernel */
++      bnes    1f                      /* if so, skip resched, signals */
++      movel   %d0,%sp@-               /* Only allow interrupts when we are  */
++      move    %sr,%d0                 /* last one on the kernel stack,      */
++      andl    #ALLOWINT,%d0           /* otherwise stack overflow can occur */
++      move    %d0,%sr                 /* during heavy interrupt load.       */
++      movel   %sp@+,%d0
++
++resume_userspace:
++      moveb   %curptr@(TASK_INFO+TINFO_FLAGS+3),%d0
++      jne     exit_work       /* SIGPENDING and/or NEED_RESCHED set */
++1:    RESTORE_ALL
++
++exit_work:
++      /* save top of frame */
++      movel   %sp,%curptr@(TASK_THREAD+THREAD_ESP0)
++      btstl   #6,%d0                  /* check for SIGPENDING in flags */
++      jne     do_signal_return
++      pea     resume_userspace
++      jra     schedule
++
++do_signal_return:
++      subql   #4,%sp                  /* dummy return address */
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      clrl    %sp@-
++      bsrl    do_signal
++      addql   #8,%sp
++      RESTORE_SWITCH_STACK
++      addql   #4,%sp
++      jbra    resume_userspace
++
++do_delayed_trace:
++      bclr    #7,%sp@(PT_SR)          /* clear trace bit in SR */
++      pea     1                       /* send SIGTRAP */
++      movel   %curptr,%sp@-
++      pea     LSIGTRAP
++      jbsr    send_sig
++      addql   #8,%sp
++      addql   #4,%sp
++      jbra    resume_userspace
++
++/*
++ * This is the interrupt handler (for all hardware interrupt
++ * sources). It figures out the vector number and calls the appropriate
++ * interrupt service routine directly.
++ */
++ENTRY(inthandler)
++      SAVE_ALL_INT
++      GET_CURRENT(%d0)
++      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++      /* put exception # in d0 */
++      movel   %sp@(PT_VECTOR),%d0
++      swap    %d0                     /* extract bits 25:18 */
++      lsrl    #2,%d0
++      andl    #0x0ff,%d0
++
++      movel   %sp,%sp@-
++      movel   %d0,%sp@-               /* put vector # on stack */
++auto_irqhandler_fixup = . + 2
++      jbsr    process_int             /* process the IRQ */
++      addql   #8,%sp                  /* pop parameters off stack */
++
++ENTRY(ret_from_interrupt)
++ret_from_interrupt:
++
++      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++      jeq     ret_from_last_interrupt
++2:    RESTORE_ALL
++
++      ALIGN
++ret_from_last_interrupt:
++      moveb   %sp@(PT_SR),%d0
++      andl    #(~ALLOWINT>>8)&0xff,%d0
++      jne     2b
++
++      /* check if we need to do software interrupts */
++      tstl    irq_stat+CPUSTAT_SOFTIRQ_PENDING
++      jeq     .Lret_from_exception
++      pea     ret_from_exception
++      jra     do_softirq
++
++ENTRY(user_inthandler)
++      SAVE_ALL_INT
++      GET_CURRENT(%d0)
++      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++      /* put exception # in d0 */
++      movel   %sp@(PT_VECTOR),%d0
++user_irqvec_fixup = . + 2
++      swap    %d0                     /* extract bits 25:18 */
++      lsrl    #2,%d0
++      andl    #0x0ff,%d0
++
++      movel   %sp,%sp@-
++      movel   %d0,%sp@-               /* put vector # on stack */
++user_irqhandler_fixup = . + 2
++      jbsr    process_int             /* process the IRQ */
++      addql   #8,%sp                  /* pop parameters off stack */
++
++      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++      jeq     ret_from_last_interrupt
++        RESTORE_ALL
++
++/* Handler for uninitialized and spurious interrupts */
++
++ENTRY(bad_inthandler)
++      SAVE_ALL_INT
++      GET_CURRENT(%d0)
++      addql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++
++      movel   %sp,%sp@-
++      jsr     handle_badint
++      addql   #4,%sp
++
++      subql   #1,%curptr@(TASK_INFO+TINFO_PREEMPT)
++      jeq     ret_from_last_interrupt
++      RESTORE_ALL
++
++ENTRY(sys_fork)
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      jbsr    m68k_fork
++      addql   #4,%sp
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_clone)
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      jbsr    m68k_clone
++      addql   #4,%sp
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_vfork)
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      jbsr    m68k_vfork
++      addql   #4,%sp
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_sigsuspend)
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      jbsr    do_sigsuspend
++      addql   #4,%sp
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_rt_sigsuspend)
++      SAVE_SWITCH_STACK
++      pea     %sp@(SWITCH_STACK_SIZE)
++      jbsr    do_rt_sigsuspend
++      addql   #4,%sp
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_sigreturn)
++      SAVE_SWITCH_STACK
++      jbsr    do_sigreturn
++      RESTORE_SWITCH_STACK
++      rts
++
++ENTRY(sys_rt_sigreturn)
++      SAVE_SWITCH_STACK
++      jbsr    do_rt_sigreturn
++      RESTORE_SWITCH_STACK
++      rts
++
++resume:
++      /*
++       * Beware - when entering resume, prev (the current task) is
++       * in a0, next (the new task) is in a1,so don't change these
++       * registers until their contents are no longer needed.
++       */
++
++      /* save sr */
++      movew   %sr,%d0
++      movew   %d0,%a0@(TASK_THREAD+THREAD_SR)
++
++      /* save usp */
++      /* Save USP via %a1 (which is saved/restored from %d0) */
++      movel   %a1,%d0
++      movel   %usp,%a1
++      movel   %a1,%a0@(TASK_THREAD+THREAD_USP)
++      movel   %d0,%a1
++
++      /* save non-scratch registers on stack */
++      SAVE_SWITCH_STACK
++
++      /* save current kernel stack pointer */
++      movel   %sp,%a0@(TASK_THREAD+THREAD_KSP)
++
++      /* Return previous task in %d1 */
++      movel   %curptr,%d1
++
++      /* switch to new task (a1 contains new task) */
++      movel   %a1,%curptr
++
++      /* restore the kernel stack pointer */
++      movel   %a1@(TASK_THREAD+THREAD_KSP),%sp
++
++      /* restore non-scratch registers */
++      RESTORE_SWITCH_STACK
++
++      /* restore user stack pointer */
++      movel   %a1@(TASK_THREAD+THREAD_USP),%a0
++      movel   %a0,%usp
++
++      /* restore status register */
++      movew   %a1@(TASK_THREAD+THREAD_SR),%d0
++      movew   %d0,%sr
++
++      rts
++
++.data
++ALIGN
++sys_call_table:
++      .long sys_ni_syscall    /* 0  -  old "setup()" system call*/
++      .long sys_exit
++      .long sys_fork
++      .long sys_read
++      .long sys_write
++      .long sys_open          /* 5 */
++      .long sys_close
++      .long sys_waitpid
++      .long sys_creat
++      .long sys_link
++      .long sys_unlink        /* 10 */
++      .long sys_execve
++      .long sys_chdir
++      .long sys_time
++      .long sys_mknod
++      .long sys_chmod         /* 15 */
++      .long sys_chown16
++      .long sys_ni_syscall                    /* old break syscall holder */
++      .long sys_stat
++      .long sys_lseek
++      .long sys_getpid        /* 20 */
++      .long sys_mount
++      .long sys_oldumount
++      .long sys_setuid16
++      .long sys_getuid16
++      .long sys_stime         /* 25 */
++      .long sys_ptrace
++      .long sys_alarm
++      .long sys_fstat
++      .long sys_pause
++      .long sys_utime         /* 30 */
++      .long sys_ni_syscall                    /* old stty syscall holder */
++      .long sys_ni_syscall                    /* old gtty syscall holder */
++      .long sys_access
++      .long sys_nice
++      .long sys_ni_syscall    /* 35 */        /* old ftime syscall holder */
++      .long sys_sync
++      .long sys_kill
++      .long sys_rename
++      .long sys_mkdir
++      .long sys_rmdir         /* 40 */
++      .long sys_dup
++      .long sys_pipe
++      .long sys_times
++      .long sys_ni_syscall                    /* old prof syscall holder */
++      .long sys_brk           /* 45 */
++      .long sys_setgid16
++      .long sys_getgid16
++      .long sys_signal
++      .long sys_geteuid16
++      .long sys_getegid16     /* 50 */
++      .long sys_acct
++      .long sys_umount                        /* recycled never used phys() */
++      .long sys_ni_syscall                    /* old lock syscall holder */
++      .long sys_ioctl
++      .long sys_fcntl         /* 55 */
++      .long sys_ni_syscall                    /* old mpx syscall holder */
++      .long sys_setpgid
++      .long sys_ni_syscall                    /* old ulimit syscall holder */
++      .long sys_ni_syscall
++      .long sys_umask         /* 60 */
++      .long sys_chroot
++      .long sys_ustat
++      .long sys_dup2
++      .long sys_getppid
++      .long sys_getpgrp       /* 65 */
++      .long sys_setsid
++      .long sys_sigaction
++      .long sys_sgetmask
++      .long sys_ssetmask
++      .long sys_setreuid16    /* 70 */
++      .long sys_setregid16
++      .long sys_sigsuspend
++      .long sys_sigpending
++      .long sys_sethostname
++      .long sys_setrlimit     /* 75 */
++      .long sys_old_getrlimit
++      .long sys_getrusage
++      .long sys_gettimeofday
++      .long sys_settimeofday
++      .long sys_getgroups16   /* 80 */
++      .long sys_setgroups16
++      .long old_select
++      .long sys_symlink
++      .long sys_lstat
++      .long sys_readlink      /* 85 */
++      .long sys_uselib
++      .long sys_swapon
++      .long sys_reboot
++      .long old_readdir
++      .long old_mmap          /* 90 */
++      .long sys_munmap
++      .long sys_truncate
++      .long sys_ftruncate
++      .long sys_fchmod
++      .long sys_fchown16      /* 95 */
++      .long sys_getpriority
++      .long sys_setpriority
++      .long sys_ni_syscall                    /* old profil syscall holder */
++      .long sys_statfs
++      .long sys_fstatfs       /* 100 */
++      .long sys_ni_syscall                    /* ioperm for i386 */
++      .long sys_socketcall
++      .long sys_syslog
++      .long sys_setitimer
++      .long sys_getitimer     /* 105 */
++      .long sys_newstat
++      .long sys_newlstat
++      .long sys_newfstat
++      .long sys_ni_syscall
++      .long sys_ni_syscall    /* 110 */       /* iopl for i386 */
++      .long sys_vhangup
++      .long sys_ni_syscall                    /* obsolete idle() syscall */
++      .long sys_ni_syscall                    /* vm86old for i386 */
++      .long sys_wait4
++      .long sys_swapoff       /* 115 */
++      .long sys_sysinfo
++      .long sys_ipc
++      .long sys_fsync
++      .long sys_sigreturn
++      .long sys_clone         /* 120 */
++      .long sys_setdomainname
++      .long sys_newuname
++      .long sys_cacheflush                    /* modify_ldt for i386 */
++      .long sys_adjtimex
++      .long sys_mprotect      /* 125 */
++      .long sys_sigprocmask
++      .long sys_ni_syscall                    /* old "create_module" */
++      .long sys_init_module
++      .long sys_delete_module
++      .long sys_ni_syscall    /* 130 - old "get_kernel_syms" */
++      .long sys_quotactl
++      .long sys_getpgid
++      .long sys_fchdir
++      .long sys_bdflush
++      .long sys_sysfs         /* 135 */
++      .long sys_personality
++      .long sys_ni_syscall                    /* for afs_syscall */
++      .long sys_setfsuid16
++      .long sys_setfsgid16
++      .long sys_llseek        /* 140 */
++      .long sys_getdents
++      .long sys_select
++      .long sys_flock
++      .long sys_msync
++      .long sys_readv         /* 145 */
++      .long sys_writev
++      .long sys_getsid
++      .long sys_fdatasync
++      .long sys_sysctl
++      .long sys_mlock         /* 150 */
++      .long sys_munlock
++      .long sys_mlockall
++      .long sys_munlockall
++      .long sys_sched_setparam
++      .long sys_sched_getparam        /* 155 */
++      .long sys_sched_setscheduler
++      .long sys_sched_getscheduler
++      .long sys_sched_yield
++      .long sys_sched_get_priority_max
++      .long sys_sched_get_priority_min  /* 160 */
++      .long sys_sched_rr_get_interval
++      .long sys_nanosleep
++      .long sys_mremap
++      .long sys_setresuid16
++      .long sys_getresuid16   /* 165 */
++      .long sys_getpagesize
++      .long sys_ni_syscall                    /* old sys_query_module */
++      .long sys_poll
++      .long sys_nfsservctl
++      .long sys_setresgid16   /* 170 */
++      .long sys_getresgid16
++      .long sys_prctl
++      .long sys_rt_sigreturn
++      .long sys_rt_sigaction
++      .long sys_rt_sigprocmask        /* 175 */
++      .long sys_rt_sigpending
++      .long sys_rt_sigtimedwait
++      .long sys_rt_sigqueueinfo
++      .long sys_rt_sigsuspend
++      .long sys_pread64       /* 180 */
++      .long sys_pwrite64
++      .long sys_lchown16;
++      .long sys_getcwd
++      .long sys_capget
++      .long sys_capset        /* 185 */
++      .long sys_sigaltstack
++      .long sys_sendfile
++      .long sys_ni_syscall                    /* streams1 */
++      .long sys_ni_syscall                    /* streams2 */
++      .long sys_vfork         /* 190 */
++      .long sys_getrlimit
++      .long sys_mmap2
++      .long sys_truncate64
++      .long sys_ftruncate64
++      .long sys_stat64        /* 195 */
++      .long sys_lstat64
++      .long sys_fstat64
++      .long sys_chown
++      .long sys_getuid
++      .long sys_getgid        /* 200 */
++      .long sys_geteuid
++      .long sys_getegid
++      .long sys_setreuid
++      .long sys_setregid
++      .long sys_getgroups     /* 205 */
++      .long sys_setgroups
++      .long sys_fchown
++      .long sys_setresuid
++      .long sys_getresuid
++      .long sys_setresgid     /* 210 */
++      .long sys_getresgid
++      .long sys_lchown
++      .long sys_setuid
++      .long sys_setgid
++      .long sys_setfsuid      /* 215 */
++      .long sys_setfsgid
++      .long sys_pivot_root
++      .long sys_ni_syscall
++      .long sys_ni_syscall
++      .long sys_getdents64    /* 220 */
++      .long sys_gettid
++      .long sys_tkill
++      .long sys_setxattr
++      .long sys_lsetxattr
++      .long sys_fsetxattr     /* 225 */
++      .long sys_getxattr
++      .long sys_lgetxattr
++      .long sys_fgetxattr
++      .long sys_listxattr
++      .long sys_llistxattr    /* 230 */
++      .long sys_flistxattr
++      .long sys_removexattr
++      .long sys_lremovexattr
++      .long sys_fremovexattr
++      .long sys_futex         /* 235 */
++      .long sys_sendfile64
++      .long sys_mincore
++      .long sys_madvise
++      .long sys_fcntl64
++      .long sys_readahead     /* 240 */
++      .long sys_io_setup
++      .long sys_io_destroy
++      .long sys_io_getevents
++      .long sys_io_submit
++      .long sys_io_cancel     /* 245 */
++      .long sys_fadvise64
++      .long sys_exit_group
++      .long sys_lookup_dcookie
++      .long sys_epoll_create
++      .long sys_epoll_ctl     /* 250 */
++      .long sys_epoll_wait
++      .long sys_remap_file_pages
++      .long sys_set_tid_address
++      .long sys_timer_create
++      .long sys_timer_settime /* 255 */
++      .long sys_timer_gettime
++      .long sys_timer_getoverrun
++      .long sys_timer_delete
++      .long sys_clock_settime
++      .long sys_clock_gettime /* 260 */
++      .long sys_clock_getres
++      .long sys_clock_nanosleep
++      .long sys_statfs64
++      .long sys_fstatfs64
++      .long sys_tgkill        /* 265 */
++      .long sys_utimes
++      .long sys_fadvise64_64
++      .long sys_mbind 
++      .long sys_get_mempolicy
++      .long sys_set_mempolicy /* 270 */
++      .long sys_mq_open
++      .long sys_mq_unlink
++      .long sys_mq_timedsend
++      .long sys_mq_timedreceive
++      .long sys_mq_notify     /* 275 */
++      .long sys_mq_getsetattr
++      .long sys_waitid
++      .long sys_ni_syscall                    /* for sys_vserver */
++      .long sys_add_key
++      .long sys_request_key   /* 280 */
++      .long sys_keyctl
++      .long sys_ioprio_set
++      .long sys_ioprio_get
++      .long sys_inotify_init
++      .long sys_inotify_add_watch     /* 285 */
++      .long sys_inotify_rm_watch
++      .long sys_migrate_pages
++      .long sys_openat
++      .long sys_mkdirat
++      .long sys_mknodat               /* 290 */
++      .long sys_fchownat
++      .long sys_futimesat
++      .long sys_fstatat64
++      .long sys_unlinkat
++      .long sys_renameat              /* 295 */
++      .long sys_linkat
++      .long sys_symlinkat
++      .long sys_readlinkat
++      .long sys_fchmodat
++      .long sys_faccessat             /* 300 */
++      .long sys_ni_syscall                    /* Reserved for pselect6 */
++      .long sys_ni_syscall                    /* Reserved for ppoll */
++      .long sys_unshare
++      .long sys_set_robust_list
++      .long sys_get_robust_list       /* 305 */
++      .long sys_splice
++      .long sys_sync_file_range
++      .long sys_tee
++      .long sys_vmsplice
++      .long sys_move_pages            /* 310 */
++
+--- /dev/null
++++ b/arch/m68k/coldfire/head.S
+@@ -0,0 +1,474 @@
++/*
++ *  head.S is the MMU enabled ColdFire specific initial boot code
++ *
++ *  Ported to ColdFire by
++ *  Matt Waddel Matt.Waddel@freescale.com
++ *  Kurt Mahan kmahan@freescale.com
++ *  Copyright Freescale Semiconductor, Inc. 2007
++ *
++ *  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.
++ *
++ *  Parts of this code came from arch/m68k/kernel/head.S
++ */
++#include <linux/linkage.h>
++#include <linux/init.h>
++#include <asm/bootinfo.h>
++#include <asm/setup.h>
++#include <asm/entry.h>
++#include <asm/pgtable.h>
++#include <asm/page.h>
++#include <asm/coldfire.h>
++#include <asm/mcfuart.h>
++#include <asm/cfcache.h>
++
++#define DEBUG
++
++.globl kernel_pg_dir
++.globl availmem
++.globl set_context
++.globl set_fpga
++
++#ifdef DEBUG
++/* When debugging use readable names for labels */
++#ifdef __STDC__
++#define L(name) .head.S.##name
++#else
++#define L(name) .head.S./**/name
++#endif
++#else
++#ifdef __STDC__
++#define L(name) .L##name
++#else
++#define L(name) .L/**/name
++#endif
++#endif
++
++/* The __INITDATA stuff is a no-op when ftrace or kgdb are turned on */
++#ifndef __INITDATA
++#define __INITDATA    .data
++#define __FINIT               .previous
++#endif
++
++/*
++ * Setup ACR mappings to provide the following memory map:
++ *   Data
++ *     0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY
++ *     0xFC000000 -> 0xFCFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY
++ *   Code
++ *     None currently (mapped via TLBs)
++ */
++
++#define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
++#define ACR1_DEFAULT  #0xFC00A040   /* ACR1 default value */
++#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
++#define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
++
++/* ACR mapping for FPGA (maps 0) */
++#define ACR0_FPGA     #0x000FA048   /* ACR0 enable FPGA */
++
++/* Several macros to make the writing of subroutines easier:
++ * - func_start marks the beginning of the routine which setups the frame
++ *   register and saves the registers, it also defines another macro
++ *   to automatically restore the registers again.
++ * - func_return marks the end of the routine and simply calls the prepared
++ *   macro to restore registers and jump back to the caller.
++ * - func_define generates another macro to automatically put arguments
++ *   onto the stack call the subroutine and cleanup the stack again.
++ */
++
++.macro        load_symbol_address     symbol,register
++      movel   #\symbol,\register
++.endm
++      
++.macro        func_start      name,saveregs,savesize,stack=0
++L(\name):
++      linkw   %a6,#-\stack
++      subal   #(\savesize),%sp
++      moveml  \saveregs,%sp@
++.set  stackstart,-\stack
++
++.macro        func_return_\name
++      moveml  %sp@,\saveregs
++      addal   #(\savesize),%sp
++      unlk    %a6
++      rts
++.endm
++.endm
++
++.macro        func_return     name
++      func_return_\name
++.endm
++
++.macro        func_call       name
++      jbsr    L(\name)
++.endm
++
++.macro        move_stack      nr,arg1,arg2,arg3,arg4
++.if   \nr
++      move_stack      "(\nr-1)",\arg2,\arg3,\arg4
++      movel   \arg1,%sp@-
++.endif
++.endm
++
++.macro        func_define     name,nr=0
++.macro        \name   arg1,arg2,arg3,arg4
++      move_stack      \nr,\arg1,\arg2,\arg3,\arg4
++      func_call       \name
++.if   \nr
++      lea     %sp@(\nr*4),%sp
++.endif
++.endm
++.endm
++
++func_define   serial_putc,1
++
++.macro        putc    ch
++      pea     \ch
++      func_call       serial_putc
++      addql   #4,%sp
++.endm
++
++.macro        dputc   ch
++#ifdef DEBUG
++      putc    \ch
++#endif
++.endm
++
++func_define   putn,1
++
++.macro        dputn   nr
++#ifdef DEBUG
++      putn    \nr
++#endif
++.endm
++
++/*
++      mmu_map  -  creates a new TLB entry
++
++      virt_addr      Must be on proper boundary
++      phys_addr      Must be on proper boundary
++      itlb           MMUOR_ITLB if instruction TLB or 0
++      asid           address space ID
++      shared_global  MMUTR_SG if shared between different ASIDs or 0
++      size_code      MMUDR_SZ1M  1 MB
++                     MMUDR_SZ4K  4 KB
++                     MMUDR_SZ8K  8 KB
++                     MMUDR_SZ16M 16 MB
++      cache_mode     MMUDR_INC   instruction non-cacheable
++                       MMUDR_IC    instruction cacheable
++                       MMUDR_DWT   data writethrough
++                     MMUDR_DCB   data copyback
++                     MMUDR_DNCP  data non-cacheable, precise
++                     MMUDR_DNCIP data non-cacheable, imprecise
++      super_prot     MMUDR_SP if user mode generates exception or 0
++      readable       MMUDR_R if permits read access (data TLB) or 0
++      writable       MMUDR_W if permits write access (data TLB) or 0
++      executable     MMUDR_X if permits execute access (instruction TLB) or 0
++      locked         MMUDR_LK prevents TLB entry from being replaced or 0
++      temp_data_reg  a data register to use for temporary values
++*/
++.macro mmu_map        virt_addr,phys_addr,itlb,asid,shared_global,size_code,cache_mode,super_prot,readable,writable,executable,locked,temp_data_reg
++      /* Set up search of TLB. */
++      movel   #(\virt_addr+1), \temp_data_reg
++      movel   \temp_data_reg, MMUAR
++      /* Search.  */
++      movel   #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg
++      movew   \temp_data_reg, (MMUOR)
++      /* Set up tag value.  */
++      movel   #(\virt_addr + \asid + \shared_global + MMUTR_V), \temp_data_reg
++      movel   \temp_data_reg, MMUTR
++      /* Set up data value.  */
++      movel   #(\phys_addr + \size_code + \cache_mode + \super_prot + \readable + \writable + \executable + \locked), \temp_data_reg
++      movel   \temp_data_reg, MMUDR
++      /* Save it.  */
++      movel   #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg
++      movew   \temp_data_reg, (MMUOR)
++.endm /* mmu_map */
++
++.macro mmu_unmap      virt_addr,itlb,temp_data_reg
++      /* Set up search of TLB. */
++      movel   #(\virt_addr+1), \temp_data_reg
++      movel   \temp_data_reg, MMUAR
++      /* Search.  */
++      movel   #(MMUOR_STLB + MMUOR_ADR +\itlb), \temp_data_reg
++      movew   \temp_data_reg, (MMUOR)
++      /* Test for hit.  */
++      movel   MMUSR,\temp_data_reg
++      btst    #MMUSR_HITN,\temp_data_reg
++      beq     1f
++      /* Read the TLB.  */
++      movel   #(MMUOR_RW + MMUOR_ACC +\itlb), \temp_data_reg
++      movew   \temp_data_reg, (MMUOR)
++      movel   MMUSR,\temp_data_reg
++      /* Set up tag value.  */
++      movel   #0, \temp_data_reg
++      movel   \temp_data_reg, MMUTR
++      /* Set up data value.  */
++      movel   #0, \temp_data_reg
++      movel   \temp_data_reg, MMUDR
++      /* Save it.  */
++      movel   #(MMUOR_ACC + MMUOR_UAA + \itlb), \temp_data_reg
++      movew   \temp_data_reg, (MMUOR)
++1:    
++.endm /* mmu_unmap */
++
++/* .text */
++.section ".text.head","ax"
++ENTRY(_stext)
++/* Version numbers of the bootinfo interface -- if we later pass info
++ * from boot ROM we might want to put something real here.
++ *
++ * The area from _stext to _start will later be used as kernel pointer table
++ */
++      bras    1f      /* Jump over bootinfo version numbers */
++
++      .long   BOOTINFOV_MAGIC
++      .long   0
++1:    jmp     __start-0x80000000
++
++.equ  kernel_pg_dir,_stext
++.equ  .,_stext+0x1000
++
++ENTRY(_start)
++      jra     __start
++__INIT
++ENTRY(__start)
++
++/* Save the location of u-boot info - cmd line, bd_info, etc. */
++      movel   %a7,%a4         /* Don't use %a4 before cf_early_init */
++      addl    #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
++
++/* Setup initial stack pointer */
++      movel   #0x40001000,%sp 
++
++/* Clear usp */
++      subl    %a0,%a0
++      movel   %a0,%usp
++
++      movel  #(MCF_RAMBAR1 + 0x221), %d0
++      movec   %d0, %rambar1
++      movew   #0x2700,%sr
++
++      movel   #(MMU_BASE+1),%d0
++      movecl  %d0,%mmubar
++      movel   #MMUOR_CA,%a0                   /* Clear tlb entries */
++      movew   %a0,(MMUOR)
++      movel   #(MMUOR_CA + MMUOR_ITLB),%a0    /* Use ITLB for searches */
++      movew   %a0,(MMUOR)
++      movel   #0,%a0                          /* Clear Addr Space User ID */
++      movecl  %a0,%asid 
++
++/* setup ACRs */
++      movel   ACR0_DEFAULT, %d0               /* ACR0 (DATA) setup */
++      movec   %d0, %acr0
++      movel   ACR1_DEFAULT, %d0               /* ACR1 (DATA) setup */
++      movec   %d0, %acr1
++      movel   ACR2_DEFAULT, %d0               /* ACR2 (CODE) setup */
++      movec   %d0, %acr2
++      movel   ACR3_DEFAULT, %d0               /* ACR3 (CODE) setup */
++      movec   %d0, %acr3
++
++      /* If you change the memory size to another value make a matching 
++         change in paging_init(cf-mmu.c) to zones_size[]. */
++
++      /* Map 256MB as code */
++      mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+1*0x1000000),  (PHYS_OFFSET+1*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+2*0x1000000),  (PHYS_OFFSET+2*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+3*0x1000000),  (PHYS_OFFSET+3*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+4*0x1000000),  (PHYS_OFFSET+4*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+5*0x1000000),  (PHYS_OFFSET+5*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+6*0x1000000),  (PHYS_OFFSET+6*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+7*0x1000000),  (PHYS_OFFSET+7*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+8*0x1000000),  (PHYS_OFFSET+8*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+9*0x1000000),  (PHYS_OFFSET+9*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
++              0, 0, MMUDR_X, MMUDR_LK, %d0
++
++      /* Map 256MB as data also */
++      mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+1*0x1000000),  (PHYS_OFFSET+1*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+2*0x1000000),  (PHYS_OFFSET+2*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+3*0x1000000),  (PHYS_OFFSET+3*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+4*0x1000000),  (PHYS_OFFSET+4*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+5*0x1000000),  (PHYS_OFFSET+5*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+6*0x1000000),  (PHYS_OFFSET+6*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+7*0x1000000),  (PHYS_OFFSET+7*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+8*0x1000000),  (PHYS_OFFSET+8*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+9*0x1000000),  (PHYS_OFFSET+9*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+10*0x1000000), (PHYS_OFFSET+10*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+11*0x1000000), (PHYS_OFFSET+11*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+12*0x1000000), (PHYS_OFFSET+12*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+13*0x1000000), (PHYS_OFFSET+13*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+14*0x1000000), (PHYS_OFFSET+14*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+15*0x1000000), (PHYS_OFFSET+15*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++
++      /* Do unity mapping to enable the MMU.  Map first 16 MB in place as 
++         code (delete TLBs after MMU is enabled and we are executing in high 
++         memory). */
++      mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \
++              MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC,  MMUDR_SP, 0, \
++              0, MMUDR_X, 0, %d0
++      /* Map first 16 MB as data too.  */
++      mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, 0, %d0
++
++      /* Turn on MMU */
++      movel   #(MMUCR_EN),%a0
++      movel   %a0,MMUCR
++      nop     /* This synchs the pipeline after a write to MMUCR */
++
++      movel   #__running_high,%a0  /* Get around PC-relative addressing. */
++      jmp     %a0@
++
++ENTRY(__running_high)
++      load_symbol_address _stext,%sp
++      movel   L(memory_start),%a0
++      movel   %a0,availmem
++      load_symbol_address L(phys_kernel_start),%a0
++      load_symbol_address _stext,%a1
++      subl    #_stext,%a1
++      addl    #PAGE_OFFSET,%a1
++      movel   %a1,%a0@
++
++      /* Unmap first 16 MB, code and data.  */
++      mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
++      mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
++
++/* Setup initial stack pointer */
++      lea     init_task,%a2 
++      lea     init_thread_union+THREAD_SIZE,%sp
++      subl    %a6,%a6         /* clear a6 for gdb */
++
++#ifdef CONFIG_MCF_USER_HALT
++/* Setup debug control reg to allow halts from user space */
++      lea     wdbg_uhe,%a0
++      wdebug  (%a0)
++#endif
++
++      movel   %a4,uboot_info_stk /* save uboot info to variable */
++      jsr     cf_early_init
++      jmp     start_kernel
++
++.section ".text.head","ax"
++set_context:
++func_start    set_context,%d0,(1*4)
++      movel   12(%sp),%d0
++      movec   %d0,%asid
++func_return   set_context
++
++/*
++ * set_fpga(addr,val)
++ *
++ * Map in 0x00000000 -> 0x0fffffff and then do the write.
++ */
++set_fpga:
++      movew   %sr,%d1
++      movew   #0x2700,%sr
++      movel   ACR0_FPGA, %d0
++      movec   %d0, %acr0
++      nop
++      moveal  4(%sp),%a0
++      movel   8(%sp),%a0@
++      movel   ACR0_DEFAULT, %d0
++      movec   %d0, %acr0
++      nop
++      movew   %d1,%sr
++      rts
++
++      .data
++      .align  4
++
++availmem:
++      .long   0
++L(phys_kernel_start):
++      .long   PAGE_OFFSET
++L(kernel_end):
++      .long   0
++L(memory_start):
++      .long   PAGE_OFFSET_RAW
++
++#ifdef CONFIG_MCF_USER_HALT
++/*
++ * Enable User Halt Enable in the debug control register.
++ */
++wdbg_uhe:
++      .word   0x2c80  /* DR0 */
++      .word   0x00b0  /* 31:16 */
++      .word   0x0400  /* 15:0 -- enable UHE */
++      .word   0x0000  /* unused */
++#endif
++
++
+--- /dev/null
++++ b/arch/m68k/coldfire/ints.c
+@@ -0,0 +1,384 @@
++/*
++ * linux/arch/m68k/coldfire/ints.c -- General interrupt handling code
++ *
++ * Copyright (C) 1999-2002  Greg Ungerer (gerg@snapgear.com)
++ * Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
++ *                     Kenneth Albanowski <kjahds@kjahds.com>,
++ * Copyright (C) 2000  Lineo Inc. (www.lineo.com)
++ * Matt Waddel Matt.Waddel@freescale.com
++ * Copyright Freescale Semiconductor, Inc. 2007
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Based on:
++ * linux/arch/m68k/kernel/ints.c &
++ * linux/arch/m68knommu/5307/ints.c
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file COPYING in the main directory of this archive
++ * for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/sched.h>
++#include <linux/kernel_stat.h>
++#include <linux/errno.h>
++#include <linux/seq_file.h>
++#include <linux/interrupt.h>
++
++#include <asm/system.h>
++#include <asm/irq.h>
++#include <asm/traps.h>
++#include <asm/page.h>
++#include <asm/machdep.h>
++#include <asm/irq_regs.h>
++
++#include <asm/mcfsim.h>
++
++/*
++ * IRQ Handler lists.
++ */
++static struct irq_node *irq_list[SYS_IRQS];
++static struct irq_controller *irq_controller[SYS_IRQS];
++static int irq_depth[SYS_IRQS];
++
++/*
++ * IRQ Controller
++ */
++#ifdef CONFIG_M54455
++void m5445x_irq_enable(unsigned int irq);
++void m5445x_irq_disable(unsigned int irq);
++static struct irq_controller m5445x_irq_controller = {
++      .name           = "M5445X",
++      .lock           = SPIN_LOCK_UNLOCKED,
++      .enable         = m5445x_irq_enable,
++      .disable        = m5445x_irq_disable,
++};
++#endif
++
++#define       POOL_SIZE       SYS_IRQS
++static struct irq_node  pool[POOL_SIZE];
++static struct irq_node *get_irq_node(void);
++
++/* The number of spurious interrupts */
++unsigned int num_spurious;
++asmlinkage void handle_badint(struct pt_regs *regs);
++
++/*
++ * void init_IRQ(void)
++ *
++ * This function should be called during kernel startup to initialize
++ * the IRQ handling routines.
++ */
++void __init init_IRQ(void)
++{
++      int i;
++
++#ifdef CONFIG_M54455
++      for (i = 0; i < SYS_IRQS; i++)
++              irq_controller[i] = &m5445x_irq_controller;
++#endif
++}
++
++/*
++ * process_int(unsigned long vec, struct pt_regs *fp)
++ *
++ * Process an interrupt.  Called from entry.S.
++ */
++asmlinkage void process_int(unsigned long vec, struct pt_regs *fp)
++{
++      struct pt_regs *old_regs;
++      struct irq_node *node;
++      old_regs = set_irq_regs(fp);
++      kstat_cpu(0).irqs[vec]++;
++
++      node = irq_list[vec];
++      if (!node)
++              handle_badint(fp);
++      else {
++              do {
++                      node->handler(vec, node->dev_id);
++                      node = node->next;
++              } while (node);
++      }
++
++      set_irq_regs(old_regs);
++}
++
++/*
++ * show_interrupts( struct seq_file *p, void *v)
++ *
++ * Called to show all the current interrupt information.
++ */
++int show_interrupts(struct seq_file *p, void *v)
++{
++      struct irq_controller *contr;
++      struct irq_node *node;
++      int i = *(loff_t *) v;
++
++      if ((i < NR_IRQS) && (irq_list[i])) {
++              contr = irq_controller[i];
++              node = irq_list[i];
++              seq_printf(p, "%-8s %3u: %10u %s", contr->name, i,
++                      kstat_cpu(0).irqs[i], node->devname);
++              while ((node = node->next))
++                      seq_printf(p, ", %s", node->devname);
++
++              seq_printf(p, "\n");
++      }
++
++      return 0;
++}
++
++/*
++ * get_irq_node(void)
++ *
++ * Get an irq node from the pool.
++ */
++struct irq_node *get_irq_node(void)
++{
++      struct irq_node *p = pool;
++      int i;
++
++      for (i = 0; i < POOL_SIZE; i++, p++) {
++              if (!p->handler) {
++                      memset(p, 0, sizeof(struct irq_node));
++                      return p;
++              }
++      }
++      printk(KERN_INFO "%s(%s:%d): No more irq nodes, I suggest you \
++              increase POOL_SIZE", __FUNCTION__, __FILE__, __LINE__);
++      return NULL;
++}
++
++void init_irq_proc(void)
++{
++      /* Insert /proc/irq driver here */
++}
++
++int setup_irq(unsigned int irq, struct irq_node *node)
++{
++      struct irq_controller *contr;
++      struct irq_node **prev;
++      unsigned long flags;
++
++      if (irq >= NR_IRQS || !irq_controller[irq]) {
++              printk("%s: Incorrect IRQ %d from %s\n",
++                     __FUNCTION__, irq, node->devname);
++              return -ENXIO;
++      }
++
++      contr = irq_controller[irq];
++      spin_lock_irqsave(&contr->lock, flags);
++
++      prev = irq_list + irq;
++      if (*prev) {
++              /* Can't share interrupts unless both agree to */
++              if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
++                      spin_unlock_irqrestore(&contr->lock, flags);
++                      return -EBUSY;
++              }
++              while (*prev)
++                      prev = &(*prev)->next;
++      }
++
++      if (!irq_list[irq]) {
++              if (contr->startup)
++                      contr->startup(irq);
++              else
++                      contr->enable(irq);
++      }
++      node->next = NULL;
++      *prev = node;
++
++      spin_unlock_irqrestore(&contr->lock, flags);
++
++      return 0;
++}
++
++int request_irq(unsigned int irq,
++              irq_handler_t handler,
++              unsigned long flags, const char *devname, void *dev_id)
++{
++      struct irq_node *node = get_irq_node();
++      int res;
++
++      if (!node)
++              return -ENOMEM;
++
++      node->handler = handler;
++      node->flags   = flags;
++      node->dev_id  = dev_id;
++      node->devname = devname;
++
++      res = setup_irq(irq, node);
++      if (res)
++              node->handler = NULL;
++
++      return res;
++}
++EXPORT_SYMBOL(request_irq);
++
++void free_irq(unsigned int irq, void *dev_id)
++{
++      struct irq_controller *contr;
++      struct irq_node **p, *node;
++      unsigned long flags;
++
++      if (irq >= NR_IRQS || !irq_controller[irq]) {
++              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
++              return;
++      }
++
++      contr = irq_controller[irq];
++      spin_lock_irqsave(&contr->lock, flags);
++
++      p = irq_list + irq;
++      while ((node = *p)) {
++              if (node->dev_id == dev_id)
++                      break;
++              p = &node->next;
++      }
++
++      if (node) {
++              *p = node->next;
++              node->handler = NULL;
++      } else
++              printk(KERN_DEBUG "%s: Removing probably wrong IRQ %d\n",
++                     __FUNCTION__, irq);
++
++      if (!irq_list[irq]) {
++              if (contr->shutdown)
++                      contr->shutdown(irq);
++              else
++                      contr->disable(irq);
++      }
++
++      spin_unlock_irqrestore(&contr->lock, flags);
++}
++EXPORT_SYMBOL(free_irq);
++
++void enable_irq(unsigned int irq)
++{
++      struct irq_controller *contr;
++      unsigned long flags;
++
++      if (irq >= NR_IRQS || !irq_controller[irq]) {
++              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
++              return;
++      }
++
++      contr = irq_controller[irq];
++      spin_lock_irqsave(&contr->lock, flags);
++      if (irq_depth[irq]) {
++              if (!--irq_depth[irq]) {
++                      if (contr->enable)
++                              contr->enable(irq);
++              }
++      } else
++              WARN_ON(1);
++      spin_unlock_irqrestore(&contr->lock, flags);
++}
++EXPORT_SYMBOL(enable_irq);
++
++void disable_irq(unsigned int irq)
++{
++      struct irq_controller *contr;
++      unsigned long flags;
++
++      if (irq >= NR_IRQS || !irq_controller[irq]) {
++              printk(KERN_DEBUG "%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
++              return;
++      }
++
++      contr = irq_controller[irq];
++      spin_lock_irqsave(&contr->lock, flags);
++      if (!irq_depth[irq]++) {
++              if (contr->disable)
++                      contr->disable(irq);
++      }
++      spin_unlock_irqrestore(&contr->lock, flags);
++}
++EXPORT_SYMBOL(disable_irq);
++
++unsigned long probe_irq_on(void)
++{
++      return 0;
++}
++EXPORT_SYMBOL(probe_irq_on);
++
++int probe_irq_off(unsigned long irqs)
++{
++      return 0;
++}
++EXPORT_SYMBOL(probe_irq_off);
++
++asmlinkage void handle_badint(struct pt_regs *regs)
++{
++      kstat_cpu(0).irqs[0]++;
++      num_spurious++;
++      printk(KERN_DEBUG "unexpected interrupt from %u\n", regs->vector);
++}
++EXPORT_SYMBOL(handle_badint);
++
++#ifdef CONFIG_M54455
++/*
++ * M5445X Implementation
++ */
++void m5445x_irq_enable(unsigned int irq)
++{
++      /* enable the interrupt hardware */
++      if (irq < 64)
++              return;
++
++      /* adjust past non-hardware ints */
++      irq -= 64;
++
++      /* check for eport */
++      if ((irq > 0) && (irq < 8)) {
++              /* enable eport */
++              MCF_EPORT_EPPAR &= ~(3 << (irq*2));     /* level */
++              MCF_EPORT_EPDDR &= ~(1 << irq);         /* input */
++              MCF_EPORT_EPIER |= 1 << irq;            /* irq enabled */
++      }
++
++      if (irq < 64) {
++              /* controller 0 */
++              MCF_INTC0_ICR(irq) = 0x02;
++              MCF_INTC0_CIMR = irq;
++      } else {
++              /* controller 1 */
++              irq -= 64;
++              MCF_INTC1_ICR(irq) = 0x02;
++              MCF_INTC1_CIMR = irq;
++      }
++}
++
++void m5445x_irq_disable(unsigned int irq)
++{
++      /* disable the interrupt hardware */
++      if (irq < 64)
++              return;
++
++      /* adjust past non-hardware ints */
++      irq -= 64;
++
++      /* check for eport */
++      if ((irq > 0) && (irq < 8)) {
++              /* disable eport */
++              MCF_EPORT_EPIER &= ~(1 << irq);
++      }
++
++      if (irq < 64) {
++              /* controller 0 */
++              MCF_INTC0_ICR(irq) = 0x00;
++              MCF_INTC0_SIMR = irq;
++      } else {
++              /* controller 1 */
++              irq -= 64;
++              MCF_INTC1_ICR(irq) = 0x00;
++              MCF_INTC1_SIMR = irq;
++      }
++}
++#endif
+--- /dev/null
++++ b/arch/m68k/coldfire/iomap.c
+@@ -0,0 +1,54 @@
++/*
++ * arch/m68k/coldfire/iomap.c
++ *
++ * Generic coldfire iomap interface
++ *
++ * Based on the sh64 iomap.c by Paul Mundt.
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ */
++#include <linux/pci.h>
++#include <asm/io.h>
++
++void __iomem *__attribute__ ((weak))
++ioport_map(unsigned long port, unsigned int len)
++{
++      return (void __iomem *)port;
++}
++EXPORT_SYMBOL(pci_iomap);
++
++void ioport_unmap(void __iomem *addr)
++{
++      /* Nothing .. */
++}
++EXPORT_SYMBOL(pci_iounmap);
++
++void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
++{
++      unsigned long start = pci_resource_start(dev, bar);
++      unsigned long len = pci_resource_len(dev, bar);
++      unsigned long flags = pci_resource_flags(dev, bar);
++printk(KERN_INFO "PCI_IOMAP: BAR=%d  START=0x%lx  LEN=0x%lx  FLAGS=0x%lx\n",
++       bar, start, len, flags);
++
++      if (!len)
++              return NULL;
++      if (max && len > max)
++              len = max;
++      if (flags & IORESOURCE_IO)
++              return ioport_map(start, len);
++      if (flags & IORESOURCE_MEM)
++              return (void __iomem *)start;
++
++      /* What? */
++      return NULL;
++}
++EXPORT_SYMBOL(ioport_map);
++
++void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
++{
++      /* Nothing .. */
++}
++EXPORT_SYMBOL(ioport_unmap);
+--- /dev/null
++++ b/arch/m68k/coldfire/mcf5445x-pci.c
+@@ -0,0 +1,427 @@
++/*
++ * arch/m68k/coldfire/mcf5445x-pci.c
++ *
++ * Coldfire M5445x specific PCI implementation.
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++
++#include <linux/delay.h>
++#include <linux/pci.h>
++
++#include <asm/mcfsim.h>
++#include <asm/pci.h>
++#include <asm/irq.h>
++
++/*
++ * Layout MCF5445x to PCI memory mappings:
++ *
++ *    WIN         MCF5445x                    PCI            TYPE
++ *    ---         --------                    ---            ----
++ *    [0] 0xA0000000 -> 0xA7FFFFFF  0xA0000000 -> 0xA7FFFFFF  MEM
++ *    [1] 0xA8000000 -> 0xABFFFFFF  0xA8000000 -> 0xABFFFFFF  MEM
++ *    [2] 0xAC000000 -> 0xAFFFFFFF  0xAC000000 -> 0xAFFFFFFF  IO
++ */
++
++#define MCF5445X_PCI_MEM_BASE         0xA0000000
++#define MCF5445X_PCI_MEM_SIZE         0x0C000000
++
++#define MCF5445X_PCI_CONFIG_BASE      0xAC000000
++#define MCF5445X_PCI_CONFIG_SIZE      0x04000000
++
++#define MCF5445X_PCI_IO_BASE          0xAC000000
++#define MCF5445X_PCI_IO_SIZE          0x04000000
++
++/* PCI Bus memory resource block */
++struct resource pci_iomem_resource = {
++      .name = "PCI memory space",
++      .start = MCF5445X_PCI_MEM_BASE,
++      .flags = IORESOURCE_MEM,
++      .end = MCF5445X_PCI_MEM_BASE + MCF5445X_PCI_MEM_SIZE - 1
++};
++
++/* PCI Bus ioport resource block */
++struct resource pci_ioport_resource = {
++      .name = "PCI I/O space",
++      .start = MCF5445X_PCI_IO_BASE,
++      .flags = IORESOURCE_IO,
++      .end = MCF5445X_PCI_IO_BASE + MCF5445X_PCI_IO_SIZE - 1
++};
++
++/*
++ * The M54455EVB multiplexes all the PCI interrupts via
++ * the FPGA and routes them to a single interrupt.  The
++ * PCI spec requires all PCI interrupt routines be smart
++ * enough to sort out their own interrupts.
++ * The interrupt source from the FPGA is configured
++ * to EPORT 3.
++ */
++#define MCF5445X_PCI_IRQ              0x43
++
++#define PCI_SLOTS                     4
++
++/*
++ * FPGA Info
++ */
++#define FPGA_PCI_IRQ_ENABLE           (u32 *)0x09000000
++#define FPGA_PCI_IRQ_STATUS           (u32 *)0x09000004
++#define FPGA_PCI_IRQ_ROUTE            (u32 *)0x0900000c
++#define FPGA_SEVEN_LED                        (u32 *)0x09000014
++
++extern void set_fpga(u32 *addr, u32 val);
++
++#ifdef DEBUG
++void mcf5445x_pci_dumpregs(void);
++#endif
++
++/*
++ * static void mcf5445x_conf_device(struct pci_dev *dev)
++ *
++ * Machine dependent Configure the given device.
++ *
++ * Parameters:
++ *
++ * dev                - the pci device.
++ */
++void __init
++mcf5445x_conf_device(struct pci_dev *dev)
++{
++      set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f);
++}
++
++/*
++ * int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus,
++ *                            unsigned int devfn, int reg,
++ *                            u32 *value)
++ *
++ * Read from PCI configuration space.
++ *
++ */
++int mcf5445x_pci_config_read(unsigned int seg, unsigned int bus,
++                           unsigned int devfn, int reg, int len, u32 *value)
++{
++      u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) |
++                 MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) |
++                 MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) |
++                 MCF_PCI_PCICAR_DWORD(reg) |
++                 MCF_PCI_PCICAR_E;
++
++      if ((bus > 255) || (devfn > 255) || (reg > 255)) {
++              *value = -1;
++              return -EINVAL;
++      }
++
++      /* setup for config mode */
++      MCF_PCI_PCICAR = addr;
++      __asm__ __volatile__("nop");
++
++      switch (len) {
++      case 1:
++              *value = *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3));
++              break;
++      case 2:
++              *value = le16_to_cpu(*(volatile u16 *)
++                              (MCF5445X_PCI_CONFIG_BASE + (reg&2)));
++              break;
++      case 4:
++              *value = le32_to_cpu(*(volatile u32 *)
++                              (MCF5445X_PCI_CONFIG_BASE));
++              break;
++      }
++
++      /* clear config mode */
++      MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E;
++      __asm__ __volatile__("nop");
++
++      return 0;
++}
++
++/*
++ * int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus,
++ *                             unsigned int devfn, int reg,
++ *                             u32 *value)
++ *
++ * Write to PCI configuration space
++ */
++int mcf5445x_pci_config_write(unsigned int seg, unsigned int bus,
++                  unsigned int devfn, int reg, int len, u32 value)
++{
++      u32 addr = MCF_PCI_PCICAR_BUSNUM(bus) |
++                 MCF_PCI_PCICAR_DEVNUM(PCI_SLOT(devfn)) |
++                 MCF_PCI_PCICAR_FUNCNUM(PCI_FUNC(devfn)) |
++                 MCF_PCI_PCICAR_DWORD(reg) |
++                 MCF_PCI_PCICAR_E;
++
++      if ((bus > 255) || (devfn > 255) || (reg > 255))
++              return -EINVAL;
++
++      /* setup for config mode */
++      MCF_PCI_PCICAR = addr;
++      __asm__ __volatile__("nop");
++
++      switch (len) {
++      case 1:
++              *(volatile u8 *)(MCF5445X_PCI_CONFIG_BASE+(reg&3)) = (u8)value;
++              break;
++      case 2:
++              *(volatile u16 *)(MCF5445X_PCI_CONFIG_BASE+(reg&2)) =
++                              cpu_to_le16((u16)value);
++              break;
++      case 4:
++              *(volatile u32 *)(MCF5445X_PCI_CONFIG_BASE) =
++                              cpu_to_le32(value);
++              break;
++      }
++
++      /* clear config mode */
++      MCF_PCI_PCICAR = ~MCF_PCI_PCICAR_E;
++      __asm__ __volatile__("nop");
++
++      return 0;
++}
++
++/* hardware operations */
++static struct pci_raw_ops mcf5445x_pci_ops = {
++      .read =         mcf5445x_pci_config_read,
++      .write =        mcf5445x_pci_config_write,
++};
++
++/*
++ * irqreturn_t mcf5445x_pci_interrupt( int irq, void *dev)
++ *
++ * PCI controller interrupt handler.
++ */
++static irqreturn_t
++mcf5445x_pci_interrupt(int irq, void *dev)
++{
++      u32 status = MCF_PCI_PCIGSCR;
++#ifdef DEBUG
++      printk(KERN_INFO "PCI: Controller irq status=0x%08x\n", status);
++#endif
++      /* clear */
++      MCF_PCI_PCIGSCR = status;
++
++      return IRQ_HANDLED;
++}
++
++/*
++ * irqreturn_t mcf5445x_pci_arb_interrupt( int irq, void *dev)
++ *
++ * PCI Arbiter interrupt handler.
++ */
++static irqreturn_t
++mcf5445x_pci_arb_interrupt(int irq, void *dev)
++{
++      u32 status = MCF_PCIARB_PASR;
++#ifdef DEBUG
++      printk(KERN_INFO "PCI: Arbiter irq status=0x%08x\n", status);
++#endif
++      /* clear */
++      MCF_PCIARB_PASR = status;
++      return IRQ_HANDLED;
++}
++
++/*
++ * struct pci_bus_info *init_mcf5445x_pci(void)
++ *
++ * Machine specific initialisation:
++ *
++ * - Allocate and initialise a 'pci_bus_info' structure
++ * - Initialize hardware
++ *
++ * Result: pointer to 'pci_bus_info' structure.
++ */
++int __init
++init_mcf5445x_pci(void)
++{
++      /*
++       * Initialize the PCI core
++       */
++
++      /* arbitration controller */
++      MCF_PCIARB_PACR = MCF_PCIARB_PACR_INTMPRI |
++                        MCF_PCIARB_PACR_EXTMPRI(0x0f) |
++                        MCF_PCIARB_PACR_INTMINTEN |
++                        MCF_PCIARB_PACR_EXTMINTEN(0x0f);
++
++      /* pci pin assignment regs */
++      MCF_GPIO_PAR_PCI = MCF_GPIO_PAR_PCI_GNT0 |
++                         MCF_GPIO_PAR_PCI_GNT1 |
++                         MCF_GPIO_PAR_PCI_GNT2 |
++                         MCF_GPIO_PAR_PCI_GNT3_GNT3 |
++                         MCF_GPIO_PAR_PCI_REQ0 |
++                         MCF_GPIO_PAR_PCI_REQ1 |
++                         MCF_GPIO_PAR_PCI_REQ2 |
++                         MCF_GPIO_PAR_PCI_REQ3_REQ3;
++
++      /* target control reg */
++      MCF_PCI_PCITCR = MCF_PCI_PCITCR_P |
++                       MCF_PCI_PCITCR_WCT(8);
++
++      /* PCI MEM address */
++      MCF_PCI_PCIIW0BTAR = 0xA007A000;
++
++      /* PCI MEM address */
++      MCF_PCI_PCIIW1BTAR = 0xA803A800;
++
++      /* PCI IO address */
++      MCF_PCI_PCIIW2BTAR = 0xAC03AC00;
++
++      /* window control */
++      MCF_PCI_PCIIWCR = MCF_PCI_PCIIWCR_WINCTRL0_ENABLE |
++                        MCF_PCI_PCIIWCR_WINCTRL0_MEMREAD |
++                        MCF_PCI_PCIIWCR_WINCTRL1_ENABLE |
++                        MCF_PCI_PCIIWCR_WINCTRL1_MEMREAD |
++                        MCF_PCI_PCIIWCR_WINCTRL2_ENABLE |
++                        MCF_PCI_PCIIWCR_WINCTRL2_IO;
++
++      /* initiator control reg */
++      MCF_PCI_PCIICR = 0x00ff;
++
++      /* type 0 - command */
++      MCF_PCI_PCISCR = MCF_PCI_PCISCR_MW |    /* mem write/inval */
++                       MCF_PCI_PCISCR_B |     /* bus master enable */
++                       MCF_PCI_PCISCR_M;      /* mem access enable */
++
++      /* type 0 - config reg */
++      MCF_PCI_PCICR1 = MCF_PCI_PCICR1_CACHELINESIZE(8) |
++                       MCF_PCI_PCICR1_LATTIMER(0xff);
++
++      /* type 0 - config 2 reg */
++      MCF_PCI_PCICR2 = 0;
++
++      /* target control reg */
++      MCF_PCI_PCITCR2 = MCF_PCI_PCITCR2_B0E |
++                        MCF_PCI_PCITCR2_B4E;
++
++      /* translate addresses from PCI[0] to CF[SDRAM] */
++      MCF_PCI_PCITBATR0 = MCF_RAMBAR1 | MCF_PCI_PCITBATR0_EN;
++      MCF_PCI_PCITBATR4 = MCF_RAMBAR1 | MCF_PCI_PCITBATR4_EN;
++
++      /* setup controller interrupt handlers */
++      if (request_irq(55+128, mcf5445x_pci_interrupt, IRQF_SHARED,
++                      "PCI Controller", NULL))
++              printk(KERN_ERR "PCI: Unable to register controller irq\n");
++
++      if (request_irq (56+128, mcf5445x_pci_arb_interrupt, IRQF_SHARED, "PCI Arbiter", NULL))
++              printk(KERN_ERR "PCI: Unable to register arbiter irq\n");
++
++      /* global control - clear reset bit */
++      MCF_PCI_PCIGSCR = MCF_PCI_PCIGSCR_SEE |
++                        MCF_PCI_PCIGSCR_PEE;
++
++      /* let everything settle */
++      udelay(1000);
++
++      /* allocate bus ioport resource */
++      if (request_resource(&ioport_resource, &pci_ioport_resource) < 0)
++              printk(KERN_ERR "PCI: Unable to alloc ioport resource\n");
++
++      /* allocate bus iomem resource */
++      if (request_resource(&iomem_resource, &pci_iomem_resource) < 0)
++              printk(KERN_ERR "PCI: Unable to alloc iomem resource\n");
++
++      /* setup FPGA to route PCI to IRQ3(67), SW7 to IRQ7, SW6 to IRQ4 */
++      set_fpga(FPGA_PCI_IRQ_ENABLE, 0x00000000);
++      set_fpga(FPGA_PCI_IRQ_ROUTE, 0x00000039);
++      set_fpga(FPGA_SEVEN_LED, 0x000000FF);
++
++      raw_pci_ops = &mcf5445x_pci_ops;
++
++      return 0;
++}
++
++/*
++ * DEBUGGING
++ */
++
++#ifdef DEBUG
++struct regdump {
++      u32 addr;
++      char regname[16];
++};
++
++struct regdump type0regs[] = {
++      { 0xfc0a8000, "PCIIDR" },
++      { 0xfc0a8004, "PCISCR" },
++      { 0xfc0a8008, "PCICCRIR" },
++      { 0xfc0a800c, "PCICR1" },
++      { 0xfc0a8010, "PCIBAR0" },
++      { 0xfc0a8014, "PCIBAR1" },
++      { 0xfc0a8018, "PCIBAR2" },
++      { 0xfc0a801c, "PCIBAR3" },
++      { 0xfc0a8020, "PCIBAR4" },
++      { 0xfc0a8024, "PCIBAR5" },
++      { 0xfc0a8028, "PCICCPR" },
++      { 0xfc0a802c, "PCISID" },
++      { 0xfc0a8030, "PCIERBAR" },
++      { 0xfc0a8034, "PCICPR" },
++      { 0xfc0a803c, "PCICR2" },
++      { 0, "" }
++};
++
++struct regdump genregs[] = {
++      { 0xfc0a8060, "PCIGSCR" },
++      { 0xfc0a8064, "PCITBATR0" },
++      { 0xfc0a8068, "PCITBATR1" },
++      { 0xfc0a806c, "PCITCR1" },
++      { 0xfc0a8070, "PCIIW0BTAR" },
++      { 0xfc0a8074, "PCIIW1BTAR" },
++      { 0xfc0a8078, "PCIIW2BTAR" },
++      { 0xfc0a8080, "PCIIWCR" },
++      { 0xfc0a8084, "PCIICR" },
++      { 0xfc0a8088, "PCIISR" },
++      { 0xfc0a808c, "PCITCR2" },
++      { 0xfc0a8090, "PCITBATR0" },
++      { 0xfc0a8094, "PCITBATR1" },
++      { 0xfc0a8098, "PCITBATR2" },
++      { 0xfc0a809c, "PCITBATR3" },
++      { 0xfc0a80a0, "PCITBATR4" },
++      { 0xfc0a80a4, "PCITBATR5" },
++      { 0xfc0a80a8, "PCIINTR" },
++      { 0xfc0a80f8, "PCICAR" },
++      { 0, "" }
++};
++
++struct regdump arbregs[] = {
++      { 0xfc0ac000, "PACR" },
++      { 0xfc0ac004, "PASR" }, /* documentation error */
++      { 0, "" }
++};
++
++/*
++ * void mcf5445x_pci_dumpregs()
++ *
++ * Dump out all the PCI registers
++ */
++void
++mcf5445x_pci_dumpregs(void)
++{
++      struct regdump *reg;
++
++      printk(KERN_INFO "*** MCF5445x PCI TARGET 0 REGISTERS ***\n");
++
++      reg = type0regs;
++      while (reg->addr) {
++              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
++                      *((u32 *)reg->addr), reg->regname);
++              reg++;
++      }
++
++      printk(KERN_INFO "\n*** MCF5445x PCI GENERAL REGISTERS ***\n");
++      reg = genregs;
++      while (reg->addr) {
++              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
++                      *((u32 *)reg->addr), reg->regname);
++              reg++;
++      }
++      printk(KERN_INFO "\n*** MCF5445x PCI ARBITER REGISTERS ***\n");
++      reg = arbregs;
++      while (reg->addr) {
++              printk(KERN_INFO "0x%08x  0x%08x  %s\n", reg->addr,
++                      *((u32 *)reg->addr), reg->regname);
++              reg++;
++      }
++}
++#endif /* DEBUG */
+--- /dev/null
++++ b/arch/m68k/coldfire/muldi3.S
+@@ -0,0 +1,64 @@
++/*
++ * Coldfire muldi3 assembly verion
++ */
++ 
++#include <linux/linkage.h>
++.globl __muldi3
++
++ENTRY(__muldi3)
++      linkw   %fp,#0
++      lea     %sp@(-32),%sp
++      moveml  %d2-%d7/%a2-%a3,%sp@
++      moveal  %fp@(8), %a2
++      moveal  %fp@(12), %a3
++      moveal  %fp@(16), %a0
++      moveal  %fp@(20),%a1
++      movel   %a3,%d2
++      andil   #65535,%d2
++      movel   %a3,%d3
++      clrw    %d3
++      swap    %d3
++      movel   %a1,%d0
++      andil   #65535,%d0
++      movel   %a1,%d1
++      clrw    %d1
++      swap    %d1
++      movel   %d2,%d7
++      mulsl   %d0,%d7
++      movel   %d2,%d4
++      mulsl   %d1,%d4
++      movel   %d3,%d2
++      mulsl   %d0,%d2
++      mulsl   %d1,%d3
++      movel   %d7,%d0
++      clrw    %d0
++      swap    %d0
++      addl    %d0,%d4
++      addl    %d2,%d4
++      cmpl    %d4,%d2
++      blss    1f
++      addil   #65536,%d3
++1:
++      movel   %d4,%d0
++      clrw    %d0
++      swap    %d0
++      movel   %d3,%d5
++      addl    %d0,%d5
++      movew   %d4,%d6
++      swap    %d6
++      movew   %d7,%d6
++      movel   %d5,%d0
++      movel   %d6,%d1
++      movel   %a3,%d2
++      movel   %a0,%d3
++      mulsl   %d3,%d2
++      movel   %a2,%d3
++      movel   %a1,%d4
++      mulsl   %d4,%d3
++      addl    %d3,%d2
++      movel   %d2,%d0
++      addl    %d5,%d0
++      moveml  %sp@, %d2-%d7/%a2-%a3
++      lea     %sp@(32),%sp
++      unlk    %fp
++      rts
+--- /dev/null
++++ b/arch/m68k/coldfire/pci.c
+@@ -0,0 +1,245 @@
++/*
++ * linux/arch/m68k/coldfire/pci.c
++ *
++ * PCI initialization for Coldfire architectures.
++ *
++ * Currently Supported:
++ *    M5445x
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/pci.h>
++
++#include <asm/mcfsim.h>
++#include <asm/pci.h>
++
++/* pci ops for reading/writing config */
++struct pci_raw_ops *raw_pci_ops;
++
++/* pci debug flag */
++static int debug_pci;
++
++#ifdef CONFIG_M54455
++extern int init_mcf5445x_pci(void);
++extern void mcf5445x_conf_device(struct pci_dev *dev);
++extern void mcf5445x_pci_dumpregs(void);
++
++extern struct resource pci_ioport_resource;
++extern struct resource pci_iomem_resource;
++#endif
++
++static int
++pci_read(struct pci_bus *bus, unsigned int devfn, int where,
++       int size, u32 *value)
++{
++      return raw_pci_ops->read(0, bus->number, devfn, where, size, value);
++}
++
++static int
++pci_write(struct pci_bus *bus, unsigned int devfn, int where,
++        int size, u32 value)
++{
++      return raw_pci_ops->write(0, bus->number, devfn, where, size, value);
++}
++
++struct pci_ops pci_root_ops = {
++      .read = pci_read,
++      .write = pci_write,
++};
++
++/*
++ * pcibios_setup(char *)
++ *
++ * Initialize the pcibios based on cmd line params.
++ */
++char * __init
++pcibios_setup(char *str)
++{
++      if (!strcmp(str, "debug")) {
++              debug_pci = 1;
++              return NULL;
++      }
++      return str;
++}
++
++/*
++ * We need to avoid collisions with `mirrored' VGA ports
++ * and other strange ISA hardware, so we always want the
++ * addresses to be allocated in the 0x000-0x0ff region
++ * modulo 0x400.
++ *
++ * Why? Because some silly external IO cards only decode
++ * the low 10 bits of the IO address. The 0x00-0xff region
++ * is reserved for motherboard devices that decode all 16
++ * bits, so it's ok to allocate at, say, 0x2800-0x28ff,
++ * but we want to try to avoid allocating at 0x2900-0x2bff
++ * which might have be mirrored at 0x0100-0x03ff..
++ */
++void
++pcibios_align_resource(void *data, struct resource *res, resource_size_t size,
++                     resource_size_t align)
++{
++      struct pci_dev *dev = data;
++
++      if (res->flags & IORESOURCE_IO) {
++              resource_size_t start = res->start;
++
++              if (size > 0x100)
++                      printk(KERN_ERR "PCI: I/O Region %s/%d too large"
++                             " (%ld bytes)\n", pci_name(dev),
++                             dev->resource - res, (long int)size);
++
++              if (start & 0x300) {
++                      start = (start + 0x3ff) & ~0x3ff;
++                      res->start = start;
++              }
++      }
++}
++
++/*
++ * Swizzle the device pin each time we cross a bridge
++ * and return the slot number.
++ */
++static u8 __devinit
++pcibios_swizzle(struct pci_dev *dev, u8 *pin)
++{
++      return 0;
++}
++
++/*
++ * Map a slot/pin to an IRQ.
++ */
++static int
++pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
++{
++      return 0x43;
++}
++
++/*
++ * pcibios_update_irq(struct pci_dev *dev, int irq)
++ *
++ * Update a PCI interrupt.
++ */
++void __init
++pcibios_update_irq(struct pci_dev *dev, int irq)
++{
++      pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
++}
++
++/*
++ * pcibios_enable_device(struct pci_dev *dev, int mask)
++ *
++ * Enable a device on the PCI bus.
++ */
++int
++pcibios_enable_device(struct pci_dev *dev, int mask)
++{
++      u16 cmd, old_cmd;
++      int idx;
++      struct resource *r;
++
++      pci_read_config_word(dev, PCI_COMMAND, &cmd);
++      old_cmd = cmd;
++      for (idx = 0; idx < 6; idx++) {
++              r = &dev->resource[idx];
++              if (!r->start && r->end) {
++                      printk(KERN_ERR "PCI: Device %s not available because "
++                             "of resource collisions\n", pci_name(dev));
++                      return -EINVAL;
++              }
++              if (r->flags & IORESOURCE_IO)
++                      cmd |= PCI_COMMAND_IO;
++              if (r->flags & IORESOURCE_MEM)
++                      cmd |= PCI_COMMAND_MEMORY;
++      }
++      if (cmd != old_cmd) {
++              printk("PCI: Enabling device %s (%04x -> %04x)\n",
++                     pci_name(dev), old_cmd, cmd);
++              pci_write_config_word(dev, PCI_COMMAND, cmd);
++#ifdef CONFIG_M54455
++              mcf5445x_conf_device(dev);
++#endif
++      }
++
++      return 0;
++}
++
++/*
++ * pcibios_fixup_bus(struct pci_bus *bus)
++ */
++void __init
++pcibios_fixup_bus(struct pci_bus *bus)
++{
++      struct pci_dev *dev = bus->self;
++
++      if (!dev) {
++              /* Root bus. */
++#ifdef CONFIG_M54455
++              bus->resource[0] = &pci_ioport_resource;
++              bus->resource[1] = &pci_iomem_resource;
++#endif
++      }
++}
++
++/*
++ * pcibios_init(void)
++ *
++ * Allocate/initialize low level pci bus/devices.
++ */
++static int __init
++pcibios_init(void)
++{
++      struct pci_bus *bus;
++
++      if (!raw_pci_ops) {
++              printk(KERN_WARNING "PCIBIOS: FATAL: NO PCI Hardware found\n");
++              return 0;
++      }
++
++      /* allocate and scan the (only) bus */
++      bus = pci_scan_bus_parented(NULL, 0, &pci_root_ops, NULL);
++
++      /* setup everything */
++      if (bus) {
++              /* compute the bridge window sizes */
++              pci_bus_size_bridges(bus);
++
++              /* (re)assign device resources */
++              pci_bus_assign_resources(bus);
++
++              /* add the bus to the system */
++              pci_bus_add_devices(bus);
++
++              /* fixup irqs */
++              pci_fixup_irqs(pcibios_swizzle, pcibios_map_irq);
++      }
++
++      return 0;
++}
++
++/*
++ * pci_init(void)
++ *
++ * Initialize the PCI Hardware.
++ */
++static int __init
++pci_init(void)
++{
++#if defined(CONFIG_M54455)
++      init_mcf5445x_pci();
++#endif
++      if (!raw_pci_ops)
++              printk(KERN_ERR "PCI: FATAL: NO PCI Detected\n");
++
++      return 0;
++}
++
++/* low level hardware (first) */
++arch_initcall(pci_init);
++
++/* basic bios init (second) */
++subsys_initcall(pcibios_init);
+--- /dev/null
++++ b/arch/m68k/coldfire/signal.c
+@@ -0,0 +1,868 @@
++/*
++ *  linux/arch/m68k/kernel/signal.c
++ *
++ *  Copyright (C) 1991, 1992  Linus Torvalds
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file COPYING in the main directory of this archive
++ * for more details.
++ */
++
++/*
++ * Derived from m68k/kernel/signal.c and the original authors are credited
++ * there.
++ *
++ * Coldfire support by:
++ * Matt Waddel Matt.Waddel@freescale.com
++ * Copyright Freescale Semiconductor, Inc 2007
++ */
++
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <linux/kernel.h>
++#include <linux/signal.h>
++#include <linux/syscalls.h>
++#include <linux/errno.h>
++#include <linux/wait.h>
++#include <linux/ptrace.h>
++#include <linux/unistd.h>
++#include <linux/stddef.h>
++#include <linux/highuid.h>
++#include <linux/personality.h>
++#include <linux/tty.h>
++#include <linux/binfmts.h>
++
++#include <asm/setup.h>
++#include <asm/cf_uaccess.h>
++#include <asm/cf_pgtable.h>
++#include <asm/traps.h>
++#include <asm/ucontext.h>
++
++#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
++
++asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
++
++const int frame_extra_sizes[16] = {
++  [1] = -1,
++  [2] = sizeof(((struct frame *)0)->un.fmt2),
++  [3] = sizeof(((struct frame *)0)->un.fmt3),
++  [4] = 0,
++  [5] = -1,
++  [6] = -1,
++  [7] = sizeof(((struct frame *)0)->un.fmt7),
++  [8] = -1,
++  [9] = sizeof(((struct frame *)0)->un.fmt9),
++  [10]        = sizeof(((struct frame *)0)->un.fmta),
++  [11]        = sizeof(((struct frame *)0)->un.fmtb),
++  [12]        = -1,
++  [13]        = -1,
++  [14]        = -1,
++  [15]        = -1,
++};
++
++/*
++ * Atomically swap in the new signal mask, and wait for a signal.
++ */
++asmlinkage int do_sigsuspend(struct pt_regs *regs)
++{
++      old_sigset_t mask = regs->d3;
++      sigset_t saveset;
++
++      mask &= _BLOCKABLE;
++      spin_lock_irq(&current->sighand->siglock);
++      saveset = current->blocked;
++      siginitset(&current->blocked, mask);
++      recalc_sigpending();
++      spin_unlock_irq(&current->sighand->siglock);
++
++      regs->d0 = -EINTR;
++      while (1) {
++              current->state = TASK_INTERRUPTIBLE;
++              schedule();
++              if (do_signal(&saveset, regs))
++                      return -EINTR;
++      }
++}
++
++asmlinkage int
++do_rt_sigsuspend(struct pt_regs *regs)
++{
++      sigset_t __user *unewset = (sigset_t __user *)regs->d1;
++      size_t sigsetsize = (size_t)regs->d2;
++      sigset_t saveset, newset;
++
++      /* XXX: Don't preclude handling different sized sigset_t's.  */
++      if (sigsetsize != sizeof(sigset_t))
++              return -EINVAL;
++
++      if (copy_from_user(&newset, unewset, sizeof(newset)))
++              return -EFAULT;
++      sigdelsetmask(&newset, ~_BLOCKABLE);
++
++      spin_lock_irq(&current->sighand->siglock);
++      saveset = current->blocked;
++      current->blocked = newset;
++      recalc_sigpending();
++      spin_unlock_irq(&current->sighand->siglock);
++
++      regs->d0 = -EINTR;
++      while (1) {
++              current->state = TASK_INTERRUPTIBLE;
++              schedule();
++              if (do_signal(&saveset, regs))
++                      return -EINTR;
++      }
++}
++
++asmlinkage int
++sys_sigaction(int sig, const struct old_sigaction __user *act,
++            struct old_sigaction __user *oact)
++{
++      struct k_sigaction new_ka, old_ka;
++      int ret;
++
++      if (act) {
++              old_sigset_t mask;
++              if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
++                  __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
++                  __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
++                      return -EFAULT;
++              __get_user(new_ka.sa.sa_flags, &act->sa_flags);
++              __get_user(mask, &act->sa_mask);
++              siginitset(&new_ka.sa.sa_mask, mask);
++      }
++
++      ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
++
++      if (!ret && oact) {
++              if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
++                  __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
++                  __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
++                      return -EFAULT;
++              __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
++              __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
++      }
++
++      return ret;
++}
++
++asmlinkage int
++sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
++{
++      return do_sigaltstack(uss, uoss, rdusp());
++}
++
++
++/*
++ * Do a signal return; undo the signal stack.
++ *
++ * Keep the return code on the stack quadword aligned!
++ * That makes the cache flush below easier.
++ */
++
++struct sigframe
++{
++      char __user *pretcode;
++      int sig;
++      int code;
++      struct sigcontext __user *psc;
++      char retcode[16];
++      unsigned long extramask[_NSIG_WORDS-1];
++      struct sigcontext sc;
++};
++
++struct rt_sigframe
++{
++      char __user *pretcode;
++      int sig;
++      struct siginfo __user *pinfo;
++      void __user *puc;
++      char retcode[16];
++      struct siginfo info;
++      struct ucontext uc;
++};
++
++#define FPCONTEXT_SIZE        216
++#define uc_fpstate    uc_filler[0]
++#define uc_formatvec  uc_filler[FPCONTEXT_SIZE/4]
++#define uc_extra      uc_filler[FPCONTEXT_SIZE/4+1]
++
++#ifdef CONFIG_FPU
++static unsigned char fpu_version; /* version num of fpu, set by setup_frame */
++
++static inline int restore_fpu_state(struct sigcontext *sc)
++{
++      int err = 1;
++
++      if (FPU_IS_EMU) {
++          /* restore registers */
++          memcpy(current->thread.fpcntl, sc->sc_fpcntl, 12);
++          memcpy(current->thread.fp, sc->sc_fpregs, 24);
++          return 0;
++      }
++
++      if (CPU_IS_060 ? sc->sc_fpstate[2] : sc->sc_fpstate[0]) {
++          /* Verify the frame format.  */
++          if (!CPU_IS_060 && (sc->sc_fpstate[0] != fpu_version))
++              goto out;
++          if (CPU_IS_020_OR_030) {
++              if (m68k_fputype & FPU_68881 &&
++                  !(sc->sc_fpstate[1] == 0x18 || sc->sc_fpstate[1] == 0xb4))
++                  goto out;
++              if (m68k_fputype & FPU_68882 &&
++                  !(sc->sc_fpstate[1] == 0x38 || sc->sc_fpstate[1] == 0xd4))
++                  goto out;
++          } else if (CPU_IS_040) {
++              if (!(sc->sc_fpstate[1] == 0x00 ||
++                    sc->sc_fpstate[1] == 0x28 ||
++                    sc->sc_fpstate[1] == 0x60))
++                  goto out;
++          } else if (CPU_IS_060) {
++              if (!(sc->sc_fpstate[3] == 0x00 ||
++                    sc->sc_fpstate[3] == 0x60 ||
++                    sc->sc_fpstate[3] == 0xe0))
++                  goto out;
++          } else
++              goto out;
++
++      }
++      err = 0;
++
++out:
++      return err;
++}
++
++static inline int rt_restore_fpu_state(struct ucontext __user *uc)
++{
++      unsigned char fpstate[FPCONTEXT_SIZE];
++      int context_size = CPU_IS_060 ? 8 : 0;
++      fpregset_t fpregs;
++      int err = 1;
++
++      if (FPU_IS_EMU) {
++              /* restore fpu control register */
++              if (__copy_from_user(current->thread.fpcntl,
++                              uc->uc_mcontext.fpregs.f_fpcntl, 12))
++                      goto out;
++              /* restore all other fpu register */
++              if (__copy_from_user(current->thread.fp,
++                              uc->uc_mcontext.fpregs.f_fpregs, 96))
++                      goto out;
++              return 0;
++      }
++
++      if (__get_user(*(long *)fpstate, (long __user *)&uc->uc_fpstate))
++              goto out;
++      if (CPU_IS_060 ? fpstate[2] : fpstate[0]) {
++              if (!CPU_IS_060)
++                      context_size = fpstate[1];
++              /* Verify the frame format.  */
++              if (!CPU_IS_060 && (fpstate[0] != fpu_version))
++                      goto out;
++              if (CPU_IS_020_OR_030) {
++                      if (m68k_fputype & FPU_68881 &&
++                          !(context_size == 0x18 || context_size == 0xb4))
++                              goto out;
++                      if (m68k_fputype & FPU_68882 &&
++                          !(context_size == 0x38 || context_size == 0xd4))
++                              goto out;
++              } else if (CPU_IS_040) {
++                      if (!(context_size == 0x00 ||
++                            context_size == 0x28 ||
++                            context_size == 0x60))
++                              goto out;
++              } else if (CPU_IS_060) {
++                      if (!(fpstate[3] == 0x00 ||
++                            fpstate[3] == 0x60 ||
++                            fpstate[3] == 0xe0))
++                              goto out;
++              } else
++                      goto out;
++              if (__copy_from_user(&fpregs, &uc->uc_mcontext.fpregs,
++                                   sizeof(fpregs)))
++                      goto out;
++      }
++      if (context_size &&
++          __copy_from_user(fpstate + 4, (long __user *)&uc->uc_fpstate + 1,
++                           context_size))
++              goto out;
++      err = 0;
++
++out:
++      return err;
++}
++#endif
++
++static inline int
++restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc,
++      void __user *fp, int *pd0)
++{
++      int fsize, formatvec;
++      struct sigcontext context;
++      int err = 0;
++
++      /* get previous context */
++      if (copy_from_user(&context, usc, sizeof(context)))
++              goto badframe;
++
++      /* restore passed registers */
++      regs->d1 = context.sc_d1;
++      regs->a0 = context.sc_a0;
++      regs->a1 = context.sc_a1;
++      regs->sr = (regs->sr & 0xff00) | (context.sc_sr & 0xff);
++      regs->pc = context.sc_pc;
++      regs->orig_d0 = -1;             /* disable syscall checks */
++      wrusp(context.sc_usp);
++      formatvec = context.sc_formatvec;
++      regs->format = formatvec >> 12;
++      regs->vector = formatvec & 0xfff;
++
++#ifdef CONFIG_FPU
++      err = restore_fpu_state(&context);
++#endif
++
++      fsize = frame_extra_sizes[regs->format];
++      if (fsize < 0) {
++              /*
++               * user process trying to return with weird frame format
++               */
++#ifdef DEBUG
++              printk(KERN_DEBUG "user process returning with weird \
++                      frame format\n");
++#endif
++              goto badframe;
++      }
++
++      /* OK.  Make room on the supervisor stack for the extra junk,
++       * if necessary.
++       */
++
++      {
++              struct switch_stack *sw = (struct switch_stack *)regs - 1;
++              regs->d0 = context.sc_d0;
++#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
++              __asm__ __volatile__
++                      ("   movel %0,%/sp\n\t"
++                       "   bra ret_from_signal\n"
++                       "4:\n"
++                       ".section __ex_table,\"a\"\n"
++                       "   .align 4\n"
++                       "   .long 2b,4b\n"
++                       ".previous"
++                       : /* no outputs, it doesn't ever return */
++                       : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
++                         "n" (frame_offset), "a" (fp)
++                       : "a0");
++#undef frame_offset
++              /*
++               * If we ever get here an exception occurred while
++               * building the above stack-frame.
++               */
++              goto badframe;
++      }
++
++      *pd0 = context.sc_d0;
++      return err;
++
++badframe:
++      return 1;
++}
++
++static inline int
++rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
++                  struct ucontext __user *uc, int *pd0)
++{
++      int fsize, temp;
++      greg_t __user *gregs = uc->uc_mcontext.gregs;
++      unsigned long usp;
++      int err;
++
++      err = __get_user(temp, &uc->uc_mcontext.version);
++      if (temp != MCONTEXT_VERSION)
++              goto badframe;
++      /* restore passed registers */
++      err |= __get_user(regs->d0, &gregs[0]);
++      err |= __get_user(regs->d1, &gregs[1]);
++      err |= __get_user(regs->d2, &gregs[2]);
++      err |= __get_user(regs->d3, &gregs[3]);
++      err |= __get_user(regs->d4, &gregs[4]);
++      err |= __get_user(regs->d5, &gregs[5]);
++      err |= __get_user(sw->d6, &gregs[6]);
++      err |= __get_user(sw->d7, &gregs[7]);
++      err |= __get_user(regs->a0, &gregs[8]);
++      err |= __get_user(regs->a1, &gregs[9]);
++      err |= __get_user(regs->a2, &gregs[10]);
++      err |= __get_user(sw->a3, &gregs[11]);
++      err |= __get_user(sw->a4, &gregs[12]);
++      err |= __get_user(sw->a5, &gregs[13]);
++      err |= __get_user(sw->a6, &gregs[14]);
++      err |= __get_user(usp, &gregs[15]);
++      wrusp(usp);
++      err |= __get_user(regs->pc, &gregs[16]);
++      err |= __get_user(temp, &gregs[17]);
++      regs->sr = (regs->sr & 0xff00) | (temp & 0xff);
++      regs->orig_d0 = -1;             /* disable syscall checks */
++      err |= __get_user(temp, &uc->uc_formatvec);
++      regs->format = temp >> 12;
++      regs->vector = temp & 0xfff;
++
++#ifdef CONFIG_FPU
++      err |= rt_restore_fpu_state(uc);
++#endif
++
++      if (do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT)
++              goto badframe;
++
++      fsize = frame_extra_sizes[regs->format];
++      if (fsize < 0) {
++              /*
++               * user process trying to return with weird frame format
++               */
++#ifdef DEBUG
++              printk(KERN_DEBUG "user process returning with weird \
++                      frame format\n");
++#endif
++              goto badframe;
++      }
++
++      /* OK.  Make room on the supervisor stack for the extra junk,
++       * if necessary.
++       */
++
++      {
++#define frame_offset (sizeof(struct pt_regs)+sizeof(struct switch_stack))
++              __asm__ __volatile__
++                      ("   movel %0,%/sp\n\t"
++                       "   bra ret_from_signal\n"
++                       "4:\n"
++                       ".section __ex_table,\"a\"\n"
++                       "   .align 4\n"
++                       "   .long 2b,4b\n"
++                       ".previous"
++                       : /* no outputs, it doesn't ever return */
++                       : "a" (sw), "d" (fsize), "d" (frame_offset/4-1),
++                         "n" (frame_offset), "a" (&uc->uc_extra)
++                       : "a0");
++#undef frame_offset
++              /*
++               * If we ever get here an exception occurred while
++               * building the above stack-frame.
++               */
++              goto badframe;
++      }
++
++      *pd0 = regs->d0;
++      return err;
++
++badframe:
++      return 1;
++}
++
++asmlinkage int do_sigreturn(unsigned long __unused)
++{
++      struct switch_stack *sw = (struct switch_stack *) &__unused;
++      struct pt_regs *regs = (struct pt_regs *) (sw + 1);
++      unsigned long usp = rdusp();
++      struct sigframe __user *frame = (struct sigframe __user *)(usp - 4);
++      sigset_t set;
++      int d0;
++
++      if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
++              goto badframe;
++      if (__get_user(set.sig[0], &frame->sc.sc_mask) ||
++          (_NSIG_WORDS > 1 &&
++           __copy_from_user(&set.sig[1], &frame->extramask,
++                            sizeof(frame->extramask))))
++              goto badframe;
++
++      sigdelsetmask(&set, ~_BLOCKABLE);
++      spin_lock_irq(&current->sighand->siglock);
++      current->blocked = set;
++      recalc_sigpending();
++      spin_unlock_irq(&current->sighand->siglock);
++
++      if (restore_sigcontext(regs, &frame->sc, frame + 1, &d0))
++              goto badframe;
++      return d0;
++
++badframe:
++      force_sig(SIGSEGV, current);
++      return 0;
++}
++
++asmlinkage int do_rt_sigreturn(unsigned long __unused)
++{
++      struct switch_stack *sw = (struct switch_stack *) &__unused;
++      struct pt_regs *regs = (struct pt_regs *) (sw + 1);
++      unsigned long usp = rdusp();
++      struct rt_sigframe __user *frame =
++              (struct rt_sigframe __user *)(usp - 4);
++      sigset_t set;
++      int d0;
++
++      if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
++              goto badframe;
++      if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
++              goto badframe;
++
++      sigdelsetmask(&set, ~_BLOCKABLE);
++      spin_lock_irq(&current->sighand->siglock);
++      current->blocked = set;
++      recalc_sigpending();
++      spin_unlock_irq(&current->sighand->siglock);
++
++      if (rt_restore_ucontext(regs, sw, &frame->uc, &d0))
++              goto badframe;
++      return d0;
++
++badframe:
++      force_sig(SIGSEGV, current);
++      return 0;
++}
++
++#ifdef CONFIG_FPU
++/*
++ * Set up a signal frame.
++ */
++
++static inline void save_fpu_state(struct sigcontext *sc, struct pt_regs *regs)
++{
++      if (FPU_IS_EMU) {
++              /* save registers */
++              memcpy(sc->sc_fpcntl, current->thread.fpcntl, 12);
++              memcpy(sc->sc_fpregs, current->thread.fp, 24);
++              return;
++      }
++}
++
++static inline int rt_save_fpu_state(struct ucontext __user *uc,
++      struct pt_regs *regs)
++{
++      int err = 0;
++
++      if (FPU_IS_EMU) {
++              /* save fpu control register */
++              err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpcntl,
++                              current->thread.fpcntl, 12);
++              /* save all other fpu register */
++              err |= copy_to_user(uc->uc_mcontext.fpregs.f_fpregs,
++                              current->thread.fp, 96);
++              return err;
++      }
++
++      return err;
++}
++#endif
++
++static void setup_sigcontext(struct sigcontext *sc, struct pt_regs *regs,
++                           unsigned long mask)
++{
++      sc->sc_mask = mask;
++      sc->sc_usp = rdusp();
++      sc->sc_d0 = regs->d0;
++      sc->sc_d1 = regs->d1;
++      sc->sc_a0 = regs->a0;
++      sc->sc_a1 = regs->a1;
++      sc->sc_sr = regs->sr;
++      sc->sc_pc = regs->pc;
++      sc->sc_formatvec = regs->format << 12 | regs->vector;
++#ifdef CONFIG_FPU
++      save_fpu_state(sc, regs);
++#endif
++}
++
++static inline int rt_setup_ucontext(struct ucontext __user *uc,
++      struct pt_regs *regs)
++{
++      struct switch_stack *sw = (struct switch_stack *)regs - 1;
++      greg_t __user *gregs = uc->uc_mcontext.gregs;
++      int err = 0;
++
++      err |= __put_user(MCONTEXT_VERSION, &uc->uc_mcontext.version);
++      err |= __put_user(regs->d0, &gregs[0]);
++      err |= __put_user(regs->d1, &gregs[1]);
++      err |= __put_user(regs->d2, &gregs[2]);
++      err |= __put_user(regs->d3, &gregs[3]);
++      err |= __put_user(regs->d4, &gregs[4]);
++      err |= __put_user(regs->d5, &gregs[5]);
++      err |= __put_user(sw->d6, &gregs[6]);
++      err |= __put_user(sw->d7, &gregs[7]);
++      err |= __put_user(regs->a0, &gregs[8]);
++      err |= __put_user(regs->a1, &gregs[9]);
++      err |= __put_user(regs->a2, &gregs[10]);
++      err |= __put_user(sw->a3, &gregs[11]);
++      err |= __put_user(sw->a4, &gregs[12]);
++      err |= __put_user(sw->a5, &gregs[13]);
++      err |= __put_user(sw->a6, &gregs[14]);
++      err |= __put_user(rdusp(), &gregs[15]);
++      err |= __put_user(regs->pc, &gregs[16]);
++      err |= __put_user(regs->sr, &gregs[17]);
++      err |= __put_user((regs->format << 12) | regs->vector,
++                        &uc->uc_formatvec);
++#ifdef CONFIG_FPU
++      err |= rt_save_fpu_state(uc, regs);
++#endif
++      return err;
++}
++
++extern void IcacheInvalidateCacheBlock(void *, unsigned long);
++static inline void push_cache(unsigned long vaddr)
++{
++      IcacheInvalidateCacheBlock((void *)vaddr, 8);
++}
++
++static inline void __user *
++get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size)
++{
++      unsigned long usp;
++
++      /* Default to using normal stack.  */
++      usp = rdusp();
++
++      /* This is the X/Open sanctioned signal stack switching.  */
++      if (ka->sa.sa_flags & SA_ONSTACK) {
++              if (!sas_ss_flags(usp))
++                      usp = current->sas_ss_sp + current->sas_ss_size;
++      }
++      return (void __user *)((usp - frame_size) & -8UL);
++}
++
++static void setup_frame(int sig, struct k_sigaction *ka,
++                       sigset_t *set, struct pt_regs *regs)
++{
++      struct sigframe __user *frame;
++      int fsize = frame_extra_sizes[regs->format];
++      struct sigcontext context;
++      int err = 0;
++
++      if (fsize < 0) {
++#ifdef DEBUG
++              printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n",
++                      regs->format);
++#endif
++              goto give_sigsegv;
++      }
++
++      frame = get_sigframe(ka, regs, sizeof(*frame));
++
++      err |= __put_user((current_thread_info()->exec_domain
++                      && current_thread_info()->exec_domain->signal_invmap
++                      && sig < 32
++                      ? current_thread_info()->exec_domain->signal_invmap[sig]
++                      : sig),
++                      &frame->sig);
++
++      err |= __put_user(regs->vector, &frame->code);
++      err |= __put_user(&frame->sc, &frame->psc);
++
++      if (_NSIG_WORDS > 1)
++              err |= copy_to_user(frame->extramask, &set->sig[1],
++                                  sizeof(frame->extramask));
++
++      setup_sigcontext(&context, regs, set->sig[0]);
++      err |= copy_to_user(&frame->sc, &context, sizeof(context));
++
++      /* Set up to return from userspace.  */
++      err |= __put_user(frame->retcode, &frame->pretcode);
++      /* moveq #,d0; trap #0 */
++      err |= __put_user(0x70004e40 + (__NR_sigreturn << 16),
++                        (long __user *)(frame->retcode));
++
++      if (err)
++              goto give_sigsegv;
++
++      push_cache((unsigned long) &frame->retcode);
++
++      /* Set up registers for signal handler */
++      wrusp((unsigned long) frame);
++      regs->pc = (unsigned long) ka->sa.sa_handler;
++
++adjust_stack:
++      /* Prepare to skip over the extra stuff in the exception frame.  */
++      if (regs->stkadj) {
++              struct pt_regs *tregs =
++                      (struct pt_regs *)((ulong)regs + regs->stkadj);
++#ifdef DEBUG
++              printk(KERN_DEBUG "Performing stackadjust=%04x\n",
++                      regs->stkadj);
++#endif
++              /* This must be copied with decreasing addresses to
++                 handle overlaps.  */
++              tregs->vector = 0;
++              tregs->format = 0;
++              tregs->pc = regs->pc;
++              tregs->sr = regs->sr;
++      }
++      return;
++
++give_sigsegv:
++      force_sigsegv(sig, current);
++      goto adjust_stack;
++}
++
++static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
++      sigset_t *set, struct pt_regs *regs)
++{
++      struct rt_sigframe __user *frame;
++      int fsize = frame_extra_sizes[regs->format];
++      int err = 0;
++
++      if (fsize < 0) {
++#ifdef DEBUG
++              printk(KERN_DEBUG "setup_frame: Unknown frame format %#x\n",
++                      regs->format);
++#endif
++              goto give_sigsegv;
++      }
++
++      frame = get_sigframe(ka, regs, sizeof(*frame));
++
++      if (fsize) {
++              err |= copy_to_user(&frame->uc.uc_extra, regs + 1, fsize);
++              regs->stkadj = fsize;
++      }
++
++      err |= __put_user((current_thread_info()->exec_domain
++                      && current_thread_info()->exec_domain->signal_invmap
++                      && sig < 32
++                      ? current_thread_info()->exec_domain->signal_invmap[sig]
++                      : sig),
++                      &frame->sig);
++      err |= __put_user(&frame->info, &frame->pinfo);
++      err |= __put_user(&frame->uc, &frame->puc);
++      err |= copy_siginfo_to_user(&frame->info, info);
++
++      /* Create the ucontext.  */
++      err |= __put_user(0, &frame->uc.uc_flags);
++      err |= __put_user(NULL, &frame->uc.uc_link);
++      err |= __put_user((void __user *)current->sas_ss_sp,
++                        &frame->uc.uc_stack.ss_sp);
++      err |= __put_user(sas_ss_flags(rdusp()),
++                        &frame->uc.uc_stack.ss_flags);
++      err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
++      err |= rt_setup_ucontext(&frame->uc, regs);
++      err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
++
++      /* Set up to return from userspace.  */
++      err |= __put_user(frame->retcode, &frame->pretcode);
++
++      /* moveq #,d0; andi.l #,D0; trap #0 */
++      err |= __put_user(0x70AD0280, (long *)(frame->retcode + 0));
++      err |= __put_user(0x000000ff, (long *)(frame->retcode + 4));
++      err |= __put_user(0x4e400000, (long *)(frame->retcode + 8));
++
++      if (err)
++              goto give_sigsegv;
++
++      push_cache((unsigned long) &frame->retcode);
++
++      /* Set up registers for signal handler */
++      wrusp((unsigned long) frame);
++      regs->pc = (unsigned long) ka->sa.sa_handler;
++
++adjust_stack:
++      /* Prepare to skip over the extra stuff in the exception frame.  */
++      if (regs->stkadj) {
++              struct pt_regs *tregs =
++                      (struct pt_regs *)((ulong)regs + regs->stkadj);
++#ifdef DEBUG
++              printk(KERN_DEBUG "Performing stackadjust=%04x\n",
++                      regs->stkadj);
++#endif
++              /* This must be copied with decreasing addresses to
++                 handle overlaps.  */
++              tregs->vector = 0;
++              tregs->format = 0;
++              tregs->pc = regs->pc;
++              tregs->sr = regs->sr;
++      }
++      return;
++
++give_sigsegv:
++      force_sigsegv(sig, current);
++      goto adjust_stack;
++}
++
++static inline void
++handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
++{
++      switch (regs->d0) {
++      case -ERESTARTNOHAND:
++              if (!has_handler)
++                      goto do_restart;
++              regs->d0 = -EINTR;
++              break;
++
++      case -ERESTARTSYS:
++              if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
++                      regs->d0 = -EINTR;
++                      break;
++              }
++      /* fallthrough */
++      case -ERESTARTNOINTR:
++do_restart:
++              regs->d0 = regs->orig_d0;
++              regs->pc -= 2;
++              break;
++      }
++}
++
++/*
++ * OK, we're invoking a handler
++ */
++static void
++handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info,
++            sigset_t *oldset, struct pt_regs *regs)
++{
++      /* are we from a system call? */
++      if (regs->orig_d0 >= 0)
++              /* If so, check system call restarting.. */
++              handle_restart(regs, ka, 1);
++
++      /* set up the stack frame */
++      if (ka->sa.sa_flags & SA_SIGINFO)
++              setup_rt_frame(sig, ka, info, oldset, regs);
++      else
++              setup_frame(sig, ka, oldset, regs);
++
++      if (ka->sa.sa_flags & SA_ONESHOT)
++              ka->sa.sa_handler = SIG_DFL;
++
++      spin_lock_irq(&current->sighand->siglock);
++      sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
++      if (!(ka->sa.sa_flags & SA_NODEFER))
++              sigaddset(&current->blocked, sig);
++      recalc_sigpending();
++      spin_unlock_irq(&current->sighand->siglock);
++}
++
++/*
++ * Note that 'init' is a special process: it doesn't get signals it doesn't
++ * want to handle. Thus you cannot kill init even with a SIGKILL even by
++ * mistake.
++ */
++asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
++{
++      siginfo_t info;
++      struct k_sigaction ka;
++      int signr;
++
++      current->thread.esp0 = (unsigned long) regs;
++
++      if (!oldset)
++              oldset = &current->blocked;
++
++      signr = get_signal_to_deliver(&info, &ka, regs, NULL);
++      if (signr > 0) {
++              /* Whee!  Actually deliver the signal.  */
++              handle_signal(signr, &ka, &info, oldset, regs);
++              return 1;
++      }
++
++      /* Did we come from a system call? */
++      if (regs->orig_d0 >= 0)
++              /* Restart the system call - no handlers present */
++              handle_restart(regs, NULL, 0);
++
++      return 0;
++}
+--- /dev/null
++++ b/arch/m68k/coldfire/traps.c
+@@ -0,0 +1,454 @@
++/*
++ *  linux/arch/m68knommu/kernel/traps.c
++ *
++ *  Copyright (C) 1993, 1994 by Hamish Macdonald
++ *
++ *  68040 fixes by Michael Rausch
++ *  68040 fixes by Martin Apel
++ *  68060 fixes by Roman Hodek
++ *  68060 fixes by Jesper Skov
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file COPYING in the main directory of this archive
++ * for more details.
++ */
++
++/*
++ * Sets up all exception vectors
++ */
++#include <linux/sched.h>
++#include <linux/signal.h>
++#include <linux/kernel.h>
++#include <linux/mm.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/a.out.h>
++#include <linux/user.h>
++#include <linux/string.h>
++#include <linux/linkage.h>
++#include <linux/init.h>
++#include <linux/ptrace.h>
++#include <linux/kallsyms.h>
++
++#include <asm/setup.h>
++#include <asm/fpu.h>
++#include <asm/system.h>
++#include <asm/uaccess.h>
++#include <asm/traps.h>
++#include <asm/pgtable.h>
++#include <asm/machdep.h>
++#include <asm/siginfo.h>
++
++static char const * const vec_names[] = {
++      "RESET SP", "RESET PC", "BUS ERROR", "ADDRESS ERROR",
++      "ILLEGAL INSTRUCTION", "ZERO DIVIDE", "CHK", "TRAPcc",
++      "PRIVILEGE VIOLATION", "TRACE", "LINE 1010", "LINE 1111",
++      "UNASSIGNED RESERVED 12", "COPROCESSOR PROTOCOL VIOLATION",
++      "FORMAT ERROR", "UNINITIALIZED INTERRUPT",
++      "UNASSIGNED RESERVED 16", "UNASSIGNED RESERVED 17",
++      "UNASSIGNED RESERVED 18", "UNASSIGNED RESERVED 19",
++      "UNASSIGNED RESERVED 20", "UNASSIGNED RESERVED 21",
++      "UNASSIGNED RESERVED 22", "UNASSIGNED RESERVED 23",
++      "SPURIOUS INTERRUPT", "LEVEL 1 INT", "LEVEL 2 INT", "LEVEL 3 INT",
++      "LEVEL 4 INT", "LEVEL 5 INT", "LEVEL 6 INT", "LEVEL 7 INT",
++      "SYSCALL", "TRAP #1", "TRAP #2", "TRAP #3",
++      "TRAP #4", "TRAP #5", "TRAP #6", "TRAP #7",
++      "TRAP #8", "TRAP #9", "TRAP #10", "TRAP #11",
++      "TRAP #12", "TRAP #13", "TRAP #14", "TRAP #15",
++      "FPCP BSUN", "FPCP INEXACT", "FPCP DIV BY 0", "FPCP UNDERFLOW",
++      "FPCP OPERAND ERROR", "FPCP OVERFLOW", "FPCP SNAN",
++      "FPCP UNSUPPORTED OPERATION",
++      "MMU CONFIGURATION ERROR"
++};
++
++asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
++                           unsigned long error_code);
++asmlinkage void trap_c(struct frame *fp);
++extern void __init coldfire_trap_init(void);
++
++void __init trap_init(void)
++{
++      coldfire_trap_init();
++}
++
++/* The following table converts the FS encoding of a ColdFire
++   exception stack frame into the error_code value needed by
++   do_fault. */
++
++static const unsigned char fs_err_code[] = {
++      0,  /* 0000 */
++      0,  /* 0001 */
++      0,  /* 0010 */
++      0,  /* 0011 */
++      1,  /* 0100 */
++      0,  /* 0101 */
++      0,  /* 0110 */
++      0,  /* 0111 */
++      2,  /* 1000 */
++      3,  /* 1001 */
++      2,  /* 1010 */
++      0,  /* 1011 */
++      1,  /* 1100 */
++      1,  /* 1101 */
++      0,  /* 1110 */
++      0   /* 1111 */
++};
++
++#ifdef DEBUG
++static const char *fs_err_msg[16] = {
++      "Normal",
++      "Reserved",
++      "Interrupt during debug service routine",
++      "Reserved",
++      "X Protection",
++      "TLB X miss (opword)",
++      "TLB X miss (ext. word)",
++      "IFP in emulator mode",
++      "W Protection",
++      "Write error",
++      "TLB W miss",
++      "Reserved",
++      "R Protection",
++      "R/RMW Protection",
++      "TLB R miss",
++      "OEP in emulator mode",
++};
++#endif
++
++static inline void access_errorCF(struct frame *fp)
++{
++      unsigned long int mmusr, complainingAddress;
++      unsigned int err_code, fs;
++      int need_page_fault;
++
++      mmusr = fp->ptregs.mmusr;
++      complainingAddress = fp->ptregs.mmuar;
++#ifdef DEBUG
++      printk(KERN_DEBUG "pc %#lx, mmusr %#lx, complainingAddress %#lx\n", \
++              fp->ptregs.pc, mmusr, complainingAddress);
++#endif
++
++      /*
++       * error_code:
++       *      bit 0 == 0 means no page found, 1 means protection fault
++       *      bit 1 == 0 means read, 1 means write
++       */
++
++      fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1;
++      switch (fs) {
++      case  5:  /* 0101 TLB opword X miss */
++              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 0);
++              complainingAddress = fp->ptregs.pc;
++              break;
++      case  6:  /* 0110 TLB extension word X miss */
++              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 0, 1);
++              complainingAddress = fp->ptregs.pc + sizeof(long);
++              break;
++      case 10:  /* 1010 TLB W miss */
++              need_page_fault = cf_tlb_miss(&fp->ptregs, 1, 1, 0);
++              break;
++      case 14: /* 1110 TLB R miss */
++              need_page_fault = cf_tlb_miss(&fp->ptregs, 0, 1, 0);
++              break;
++      default:
++              /* 0000 Normal  */
++              /* 0001 Reserved */
++              /* 0010 Interrupt during debug service routine */
++              /* 0011 Reserved */
++              /* 0100 X Protection */
++              /* 0111 IFP in emulator mode */
++              /* 1000 W Protection*/
++              /* 1001 Write error*/
++              /* 1011 Reserved*/
++              /* 1100 R Protection*/
++              /* 1101 R Protection*/
++              /* 1111 OEP in emulator mode*/
++              need_page_fault = 1;
++              break;
++      }
++
++      if (need_page_fault) {
++              err_code = fs_err_code[fs];
++              if ((fs == 13) && (mmusr & MMUSR_WF)) /* rd-mod-wr access */
++                      err_code |= 2; /* bit1 - write, bit0 - protection */
++              do_page_fault(&fp->ptregs, complainingAddress, err_code);
++      }
++}
++
++void die_if_kernel(char *str, struct pt_regs *fp, int nr)
++{
++      if (!(fp->sr & PS_S))
++              return;
++
++      console_verbose();
++      printk(KERN_EMERG "%s: %08x\n", str, nr);
++      printk(KERN_EMERG "PC: [<%08lx>]", fp->pc);
++      print_symbol(" %s", fp->pc);
++      printk(KERN_EMERG "\nSR: %04x  SP: %p  a2: %08lx\n",
++             fp->sr, fp, fp->a2);
++      printk(KERN_EMERG "d0: %08lx    d1: %08lx    d2: %08lx    d3: %08lx\n",
++             fp->d0, fp->d1, fp->d2, fp->d3);
++      printk(KERN_EMERG "d4: %08lx    d5: %08lx    a0: %08lx    a1: %08lx\n",
++             fp->d4, fp->d5, fp->a0, fp->a1);
++
++      printk(KERN_EMERG "Process %s (pid: %d, stackpage=%08lx)\n",
++              current->comm, current->pid, PAGE_SIZE+(unsigned long)current);
++      show_stack(NULL, (unsigned long *)fp);
++      do_exit(SIGSEGV);
++}
++
++asmlinkage void buserr_c(struct frame *fp)
++{
++      unsigned int fs;
++
++      /* Only set esp0 if coming from user mode */
++      if (user_mode(&fp->ptregs))
++              current->thread.esp0 = (unsigned long) fp;
++
++      fs = (fp->ptregs.fs2 << 2) | fp->ptregs.fs1;
++#if defined(DEBUG)
++      printk(KERN_DEBUG "*** Bus Error *** (%x)%s\n", fs,
++              fs_err_msg[fs & 0xf]);
++#endif
++      switch (fs) {
++      case 0x5:
++      case 0x6:
++      case 0x7:
++      case 0x9:
++      case 0xa:
++      case 0xd:
++      case 0xe:
++      case 0xf:
++              access_errorCF(fp);
++              break;
++      default:
++              die_if_kernel("bad frame format", &fp->ptregs, 0);
++#if defined(DEBUG)
++              printk(KERN_DEBUG "Unknown SIGSEGV - 4\n");
++#endif
++              force_sig(SIGSEGV, current);
++      }
++}
++
++
++int kstack_depth_to_print = 48;
++
++void show_stack(struct task_struct *task, unsigned long *stack)
++{
++      unsigned long *endstack, addr, symaddr;
++      extern char _start, _etext;
++      int i;
++
++      if (!stack) {
++              if (task)
++                      stack = (unsigned long *)task->thread.ksp;
++              else
++                      stack = (unsigned long *)&stack;
++      }
++
++      addr = (unsigned long) stack;
++      endstack = (unsigned long *) PAGE_ALIGN(addr);
++
++      printk(KERN_EMERG "Stack from %08lx:", (unsigned long)stack);
++      for (i = 0; i < kstack_depth_to_print; i++) {
++              if (stack + 1 > endstack)
++                      break;
++              if (i % 8 == 0)
++                      printk("\n" KERN_EMERG "       ");
++              symaddr = *stack;
++              printk(KERN_EMERG " %08lx", *stack++);
++              if ((symaddr >= 0xc0000000) && (symaddr < 0xc1000000))
++                      print_symbol("(%s)", symaddr);
++      }
++      printk("\n");
++
++      printk(KERN_EMERG "Call Trace:");
++      i = 0;
++      while (stack + 1 <= endstack) {
++              addr = *stack++;
++              /*
++               * If the address is either in the text segment of the
++               * kernel, or in the region which contains vmalloc'ed
++               * memory, it *may* be the address of a calling
++               * routine; if so, print it so that someone tracing
++               * down the cause of the crash will be able to figure
++               * out the call path that was taken.
++               */
++              if (((addr >= (unsigned long) &_start) &&
++                   (addr <= (unsigned long) &_etext))) {
++                      if (i % 4 == 0)
++                              printk("\n" KERN_EMERG "       ");
++                      printk(KERN_EMERG " [<%08lx>]", addr);
++                      i++;
++              }
++      }
++      printk("\n");
++}
++
++void bad_super_trap(struct frame *fp)
++{
++      console_verbose();
++      if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
++              printk(KERN_WARNING "*** %s ***   FORMAT=%X\n",
++                      vec_names[(fp->ptregs.vector) >> 2],
++                      fp->ptregs.format);
++      else
++              printk(KERN_WARNING "*** Exception %d ***   FORMAT=%X\n",
++                      (fp->ptregs.vector) >> 2,
++                      fp->ptregs.format);
++      printk(KERN_WARNING "Current process id is %d\n", current->pid);
++      die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
++}
++
++asmlinkage void trap_c(struct frame *fp)
++{
++      int sig;
++      siginfo_t info;
++
++      if (fp->ptregs.sr & PS_S) {
++              if ((fp->ptregs.vector >> 2) == VEC_TRACE) {
++                      /* traced a trapping instruction */
++                      current->ptrace |= PT_DTRACE;
++              } else
++                      bad_super_trap(fp);
++              return;
++      }
++
++      /* send the appropriate signal to the user program */
++      switch ((fp->ptregs.vector) >> 2) {
++      case VEC_ADDRERR:
++              info.si_code = BUS_ADRALN;
++              sig = SIGBUS;
++              break;
++      case VEC_ILLEGAL:
++      case VEC_LINE10:
++      case VEC_LINE11:
++              info.si_code = ILL_ILLOPC;
++              sig = SIGILL;
++              break;
++      case VEC_PRIV:
++              info.si_code = ILL_PRVOPC;
++              sig = SIGILL;
++              break;
++      case VEC_COPROC:
++              info.si_code = ILL_COPROC;
++              sig = SIGILL;
++              break;
++      case VEC_TRAP1: /* gdbserver breakpoint */
++              fp->ptregs.pc -= 2;
++              info.si_code = TRAP_TRACE;
++              sig = SIGTRAP;
++              break;
++      case VEC_TRAP2:
++      case VEC_TRAP3:
++      case VEC_TRAP4:
++      case VEC_TRAP5:
++      case VEC_TRAP6:
++      case VEC_TRAP7:
++      case VEC_TRAP8:
++      case VEC_TRAP9:
++      case VEC_TRAP10:
++      case VEC_TRAP11:
++      case VEC_TRAP12:
++      case VEC_TRAP13:
++      case VEC_TRAP14:
++              info.si_code = ILL_ILLTRP;
++              sig = SIGILL;
++              break;
++      case VEC_FPBRUC:
++      case VEC_FPOE:
++      case VEC_FPNAN:
++              info.si_code = FPE_FLTINV;
++              sig = SIGFPE;
++              break;
++      case VEC_FPIR:
++              info.si_code = FPE_FLTRES;
++              sig = SIGFPE;
++              break;
++      case VEC_FPDIVZ:
++              info.si_code = FPE_FLTDIV;
++              sig = SIGFPE;
++              break;
++      case VEC_FPUNDER:
++              info.si_code = FPE_FLTUND;
++              sig = SIGFPE;
++              break;
++      case VEC_FPOVER:
++              info.si_code = FPE_FLTOVF;
++              sig = SIGFPE;
++              break;
++      case VEC_ZERODIV:
++              info.si_code = FPE_INTDIV;
++              sig = SIGFPE;
++              break;
++      case VEC_CHK:
++      case VEC_TRAP:
++              info.si_code = FPE_INTOVF;
++              sig = SIGFPE;
++              break;
++      case VEC_TRACE:         /* ptrace single step */
++              info.si_code = TRAP_TRACE;
++              sig = SIGTRAP;
++              break;
++      case VEC_TRAP15:                /* breakpoint */
++              info.si_code = TRAP_BRKPT;
++              sig = SIGTRAP;
++              break;
++      default:
++              info.si_code = ILL_ILLOPC;
++              sig = SIGILL;
++              break;
++      }
++      info.si_signo = sig;
++      info.si_errno = 0;
++      switch (fp->ptregs.format) {
++      default:
++              info.si_addr = (void *) fp->ptregs.pc;
++              break;
++      case 2:
++              info.si_addr = (void *) fp->un.fmt2.iaddr;
++              break;
++      case 7:
++              info.si_addr = (void *) fp->un.fmt7.effaddr;
++              break;
++      case 9:
++              info.si_addr = (void *) fp->un.fmt9.iaddr;
++              break;
++      case 10:
++              info.si_addr = (void *) fp->un.fmta.daddr;
++              break;
++      case 11:
++              info.si_addr = (void *) fp->un.fmtb.daddr;
++              break;
++      }
++      force_sig_info(sig, &info, current);
++}
++
++asmlinkage void set_esp0(unsigned long ssp)
++{
++      current->thread.esp0 = ssp;
++}
++
++/*
++ * The architecture-independent backtrace generator
++ */
++void dump_stack(void)
++{
++      unsigned long stack;
++
++      show_stack(current, &stack);
++}
++EXPORT_SYMBOL(dump_stack);
++
++#ifdef CONFIG_M68KFPU_EMU
++asmlinkage void fpemu_signal(int signal, int code, void *addr)
++{
++      siginfo_t info;
++
++      info.si_signo = signal;
++      info.si_errno = 0;
++      info.si_code = code;
++      info.si_addr = addr;
++      force_sig_info(signal, &info, current);
++}
++#endif
+--- /dev/null
++++ b/arch/m68k/coldfire/vmlinux-cf.lds
+@@ -0,0 +1,92 @@
++/* ld script to make m68k Coldfire Linux kernel */
++
++#include <asm-generic/vmlinux.lds.h>
++
++OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
++OUTPUT_ARCH(m68k)
++ENTRY(_start)
++jiffies = jiffies_64 + 4;
++SECTIONS
++{
++  . = 0xC0020000;
++  _text = .;                  /* Text and read-only data */
++  .text : {
++      *(.text.head)
++      TEXT_TEXT
++      SCHED_TEXT
++      LOCK_TEXT
++      *(.fixup)
++      *(.gnu.warning)
++      } :text = 0x4e75
++
++  _etext = .;                 /* End of text section */
++
++  . = ALIGN(16);
++  __start___ex_table = .;
++  __ex_table : { *(__ex_table) }
++  __stop___ex_table = .;
++
++  RODATA
++
++  .data : {                   /* Data */
++      DATA_DATA
++      CONSTRUCTORS
++      }
++
++  .bss : { *(.bss) }          /* BSS */
++
++  . = ALIGN(16);
++  .data.cacheline_aligned : { *(.data.cacheline_aligned) } :data
++
++  _edata = .;                 /* End of data section */
++
++  . = ALIGN(8192);            /* Initrd */
++  __init_begin = .;
++  .init.text : {
++      _sinittext = .;
++      *(.init.text)
++      _einittext = .;
++  }
++  .init.data : { *(.init.data) }
++  . = ALIGN(16);
++  __setup_start = .;
++  .init.setup : { *(.init.setup) }
++  __setup_end = .;
++  __initcall_start = .;
++  .initcall.init : {
++      INITCALLS
++  }
++  __initcall_end = .;
++  __con_initcall_start = .;
++  .con_initcall.init : { *(.con_initcall.init) }
++  __con_initcall_end = .;
++  SECURITY_INIT
++#ifdef CONFIG_BLK_DEV_INITRD
++  . = ALIGN(8192);
++  __initramfs_start = .;
++  .init.ramfs : { *(.init.ramfs) }
++  __initramfs_end = .;
++#endif
++  . = ALIGN(8192);
++  __init_end = .;
++
++  .data.init_task : { *(.data.init_task) }    /* The initial task and kernel stack */
++
++  _end = . ;
++
++  /* Sections to be discarded */
++  /DISCARD/ : {
++      *(.exit.text)
++      *(.exit.data)
++      *(.exitcall.exit)
++      }
++
++  /* Stabs debugging sections.  */
++  .stab 0 : { *(.stab) }
++  .stabstr 0 : { *(.stabstr) }
++  .stab.excl 0 : { *(.stab.excl) }
++  .stab.exclstr 0 : { *(.stab.exclstr) }
++  .stab.index 0 : { *(.stab.index) }
++  .stab.indexstr 0 : { *(.stab.indexstr) }
++  .comment 0 : { *(.comment) }
++}
diff --git a/target/linux/coldfire/patches/009-m5445x_serial.patch b/target/linux/coldfire/patches/009-m5445x_serial.patch
new file mode 100644 (file)
index 0000000..351ea8a
--- /dev/null
@@ -0,0 +1,73 @@
+From 4b5a534c16325217c05a87938885c0ee1fe69a34 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 17:01:41 -0600
+Subject: [PATCH] MCF5445x core serial support.
+
+LTIBName: m5445x-serial
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/serial/mcfserial.c |   23 +++++++++++++++++++++--
+ 1 files changed, 21 insertions(+), 2 deletions(-)
+
+--- a/drivers/serial/mcfserial.c
++++ b/drivers/serial/mcfserial.c
+@@ -45,7 +45,9 @@
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+ #include <asm/mcfuart.h>
++#ifdef CONFIG_NETtel
+ #include <asm/nettel.h>
++#endif
+ #include <asm/uaccess.h>
+ #include "mcfserial.h"
+@@ -61,7 +63,8 @@ struct timer_list mcfrs_timer_struct;
+ #define       CONSOLE_BAUD_RATE       38400
+ #define       DEFAULT_CBAUD           B38400
+ #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \
+-      defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO)
++      defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \
++      defined(CONFIG_M54455)
+ #define CONSOLE_BAUD_RATE     115200
+ #define DEFAULT_CBAUD         B115200
+ #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \
+@@ -94,7 +97,7 @@ static struct tty_driver *mcfrs_serial_d
+ #undef SERIAL_DEBUG_FLOW
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
+ #define       IRQBASE (MCFINT_VECBASE+MCFINT_UART0)
+ #else
+ #define       IRQBASE 73
+@@ -1604,6 +1607,20 @@ static void mcfrs_irqinit(struct mcf_ser
+               /* GPIOs also must be initalized, depends on board */
+               break;
+       }
++#elif defined(CONFIG_M54455)
++      volatile unsigned char *uartp;
++      uartp = info->addr;
++      switch (info->line) {
++      case 0:
++              MCF_GPIO_PAR_UART |= 0x000F;
++              break;
++      case 1:
++              MCF_GPIO_PAR_UART |= 0x0FF0;
++              break;
++      case 2:
++              /* GPIOs also must be initalized, depends on board */
++              break;
++      }
+ #else
+       volatile unsigned char  *icrp, *uartp;
+@@ -1966,7 +1983,9 @@ struct console mcfrs_console = {
+ static int __init mcfrs_console_init(void)
+ {
++#ifndef CONFIG_M54455
+       register_console(&mcfrs_console);
++#endif
+       return 0;
+ }
diff --git a/target/linux/coldfire/patches/010-m5445x_fec.patch b/target/linux/coldfire/patches/010-m5445x_fec.patch
new file mode 100644 (file)
index 0000000..0a87bd4
--- /dev/null
@@ -0,0 +1,392 @@
+From c562ab80fe383e6fa49dbe38257421cf37f0e4b3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 17:07:25 -0600
+Subject: [PATCH] MCF5445x FEC support.
+
+LTIBName: m5445x-fec
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/net/Kconfig |    8 ++-
+ drivers/net/fec.c   |  207 ++++++++++++++++++++++++++++++++++++++++++++++----
+ drivers/net/fec.h   |    2 +-
+ 3 files changed, 198 insertions(+), 19 deletions(-)
+
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -1973,7 +1973,7 @@ config 68360_ENET
+ config FEC
+       bool "FEC ethernet controller (of ColdFire CPUs)"
+-      depends on M523x || M527x || M5272 || M528x || M520x
++      depends on M523x || M527x || M5272 || M528x || M520x || M54455
+       help
+         Say Y here if you want to use the built-in 10/100 Fast ethernet
+         controller on some Motorola ColdFire processors.
+@@ -1985,6 +1985,12 @@ config FEC2
+         Say Y here if you want to use the second built-in 10/100 Fast
+         ethernet controller on some Motorola ColdFire processors.
++config FEC_SHARED_PHY
++      bool "Shared PHY interface(on some ColdFire designs)"
++      depends on FEC2
++      help
++        Say Y here if both PHYs are controlled via a single channel.
++
+ config FEC_MPC52xx
+       tristate "MPC52xx FEC driver"
+       depends on PPC_MERGE && PPC_MPC52xx && PPC_BESTCOMM_FEC
+--- a/drivers/net/fec.c
++++ b/drivers/net/fec.c
+@@ -51,7 +51,9 @@
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
+     defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || \
++    defined(CONFIG_M54455)
++
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+ #include "fec.h"
+@@ -82,6 +84,11 @@ static unsigned int fec_hw[] = {
+       (MCF_MBAR+0x30000),
+ #elif defined(CONFIG_M532x)
+       (MCF_MBAR+0xfc030000),
++#elif defined(CONFIG_M54455)
++      (MCF_MBAR+0xfc030000),
++#if defined(CONFIG_FEC2)
++      (MCF_MBAR+0xfc034000),
++#endif
+ #else
+       &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec),
+ #endif
+@@ -172,7 +179,7 @@ typedef struct {
+  * account when setting it.
+  */
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
+ #define       OPT_FRAME_SIZE  (PKT_MAXBUF_SIZE << 16)
+ #else
+ #define       OPT_FRAME_SIZE  0
+@@ -213,6 +220,7 @@ struct fec_enet_private {
+       uint    phy_speed;
+       phy_info_t const        *phy;
+       struct work_struct phy_task;
++      volatile fec_t  *phy_hwp;
+       uint    sequence_done;
+       uint    mii_phy_task_queued;
+@@ -349,7 +357,8 @@ fec_enet_start_xmit(struct sk_buff *skb,
+       if (bdp->cbd_bufaddr & 0x3) {
+               unsigned int index;
+               index = bdp - fep->tx_bd_base;
+-              memcpy(fep->tx_bounce[index], (void *) bdp->cbd_bufaddr, bdp->cbd_datlen);
++              memcpy(fep->tx_bounce[index],
++                     (void *)skb->data, bdp->cbd_datlen);
+               bdp->cbd_bufaddr = __pa(fep->tx_bounce[index]);
+       }
+@@ -702,7 +711,7 @@ fec_enet_mii(struct net_device *dev)
+       uint            mii_reg;
+       fep = netdev_priv(dev);
+-      ep = fep->hwp;
++      ep = fep->phy_hwp;
+       mii_reg = ep->fec_mii_data;
+       spin_lock(&fep->lock);
+@@ -753,7 +762,7 @@ mii_queue(struct net_device *dev, int re
+                       mii_tail = mip;
+               } else {
+                       mii_head = mii_tail = mip;
+-                      fep->hwp->fec_mii_data = regval;
++                      fep->phy_hwp->fec_mii_data = regval;
+               }
+       } else {
+               retval = 1;
+@@ -1151,8 +1160,7 @@ static phy_info_t const phy_info_ks8721b
+ };
+ /* ------------------------------------------------------------------------- */
+-/* register definitions for the DP83848 */
+-
++/* register definitions for the DP83848 and DP83849 */
+ #define MII_DP8384X_PHYSTST    16  /* PHY Status Register */
+ static void mii_parse_dp8384x_sr2(uint mii_reg, struct net_device *dev)
+@@ -1186,27 +1194,50 @@ static void mii_parse_dp8384x_sr2(uint m
+               *s |= PHY_STAT_FAULT;
+ }
++static phy_cmd_t const phy_cmd_dp8384x_ack_int[] = {
++              { mk_mii_end, }
++      };
++
++static phy_cmd_t const phy_cmd_dp8384x_shutdown[] = {
++              { mk_mii_end, }
++      };
++
+ static phy_info_t phy_info_dp83848= {
+-      0x020005c9,
+-      "DP83848",
++      .id = 0x020005c9,
++      .name = "DP83848",
+-      (const phy_cmd_t []) {  /* config */
++      .config = (const phy_cmd_t []) {  /* config */
+               { mk_mii_read(MII_REG_CR), mii_parse_cr },
+               { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
+               { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 },
+               { mk_mii_end, }
+       },
+-      (const phy_cmd_t []) {  /* startup - enable interrupts */
++      .startup = (const phy_cmd_t []) {  /* startup - enable interrupts */
+               { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */
+               { mk_mii_read(MII_REG_SR), mii_parse_sr },
+               { mk_mii_end, }
+       },
+-      (const phy_cmd_t []) { /* ack_int - never happens, no interrupt */
++      .ack_int = phy_cmd_dp8384x_ack_int,
++      .shutdown = phy_cmd_dp8384x_shutdown,
++};
++
++static phy_info_t phy_info_dp83849 = {
++      .id = 0x020005ca,
++      .name = "DP83849",
++
++      .config = (const phy_cmd_t []) {  /* config */
++              { mk_mii_read(MII_REG_CR), mii_parse_cr },
++              { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
++              { mk_mii_read(MII_DP8384X_PHYSTST), mii_parse_dp8384x_sr2 },
+               { mk_mii_end, }
+       },
+-      (const phy_cmd_t []) {  /* shutdown */
++      .startup = (const phy_cmd_t []) {  /* startup - enable interrupts */
++              { mk_mii_write(MII_REG_CR, 0x1200), NULL }, /* autonegotiate */
++              { mk_mii_read(MII_REG_SR), mii_parse_sr },
+               { mk_mii_end, }
+       },
++      .ack_int = phy_cmd_dp8384x_ack_int,
++      .shutdown = phy_cmd_dp8384x_shutdown,
+ };
+ /* ------------------------------------------------------------------------- */
+@@ -1218,6 +1249,7 @@ static phy_info_t const * const phy_info
+       &phy_info_am79c874,
+       &phy_info_ks8721bl,
+       &phy_info_dp83848,
++      &phy_info_dp83849,
+       NULL
+ };
+@@ -1799,6 +1831,138 @@ static void __inline__ fec_uncache(unsig
+ /* ------------------------------------------------------------------------- */
++#elif defined(CONFIG_M54455)
++/*
++ * Code specific for M54455
++ */
++
++static void __inline__ fec_request_intrs(struct net_device *dev)
++{
++      struct fec_enet_private *fep;
++      int b;
++      static const struct idesc {
++              char *name;
++              unsigned short irq;
++      } *idp, id[] = {
++          { "fec(TXF)", 36 },
++          { "fec(TXB)", 37 },
++          { "fec(TXFIFO)", 38 },
++          { "fec(TXCR)", 39 },
++          { "fec(RXF)", 40 },
++          { "fec(RXB)", 41 },
++          { "fec(MII)", 42 },
++          { "fec(LC)", 43 },
++          { "fec(HBERR)", 44 },
++          { "fec(GRA)", 45 },
++          { "fec(EBERR)", 46 },
++          { "fec(BABT)", 47 },
++          { "fec(BABR)", 48 },
++          { NULL },
++      };
++
++      fep = netdev_priv(dev);
++      b = (fep->index) ? 77 : 64;
++
++      /* Setup interrupt handlers. */
++      for (idp = id; idp->name; idp++) {
++              if (request_irq(b+idp->irq, fec_enet_interrupt, 0,
++                  idp->name, dev) != 0)
++                      printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n",
++                              idp->name, b+idp->irq);
++      }
++
++      if (fep->index) {
++              /* Configure RMII */
++              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
++                      MCF_GPIO_PAR_FEC_FEC1_MASK) |
++                      MCF_GPIO_PAR_FEC_FEC1_RMII_GPIO;
++      } else {
++              /* Configure RMII */
++              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
++                      MCF_GPIO_PAR_FEC_FEC0_MASK) |
++                      MCF_GPIO_PAR_FEC_FEC0_RMII_GPIO;
++      }
++
++      /* Set up gpio outputs for MII lines on FEC0 */
++      MCF_GPIO_PAR_FECI2C |= (0 |
++              MCF_GPIO_PAR_FECI2C_MDIO0_MDIO0 |
++              MCF_GPIO_PAR_FECI2C_MDC0_MDC0);
++}
++
++static void __inline__ fec_set_mii(struct net_device *dev,
++      struct fec_enet_private *fep)
++{
++      volatile fec_t *fecp;
++
++      fecp = fep->hwp;
++      fecp->fec_r_cntrl = OPT_FRAME_SIZE | 0x04;
++      fecp->fec_x_cntrl = 0x00;
++
++      /*
++       * Set MII speed to 2.5 MHz
++       */
++      fep->phy_speed = ((((MCF_CLK / 2) / (2500000 / 10)) + 5) / 10) * 2;
++      fecp->fec_mii_speed = fep->phy_speed;
++
++      fec_restart(dev, 0);
++}
++
++static void __inline__ fec_get_mac(struct net_device *dev)
++{
++      struct fec_enet_private *fep = netdev_priv(dev);
++      volatile fec_t *fecp;
++      unsigned char *iap, tmpaddr[ETH_ALEN];
++
++      fecp = fep->hwp;
++
++      if (FEC_FLASHMAC) {
++              /*
++               * Get MAC address from FLASH.
++               * If it is all 1's or 0's, use the default.
++               */
++              iap = FEC_FLASHMAC;
++              if ((iap[0] == 0) && (iap[1] == 0) && (iap[2] == 0) &&
++                  (iap[3] == 0) && (iap[4] == 0) && (iap[5] == 0))
++                      iap = fec_mac_default;
++              if ((iap[0] == 0xff) && (iap[1] == 0xff) && (iap[2] == 0xff) &&
++                  (iap[3] == 0xff) && (iap[4] == 0xff) && (iap[5] == 0xff))
++                      iap = fec_mac_default;
++      } else {
++              *((unsigned long *) &tmpaddr[0]) = fecp->fec_addr_low;
++              *((unsigned short *) &tmpaddr[4]) = (fecp->fec_addr_high >> 16);
++              iap = &tmpaddr[0];
++      }
++
++      memcpy(dev->dev_addr, iap, ETH_ALEN);
++
++      /* Adjust MAC if using default MAC address */
++      if (iap == fec_mac_default)
++              dev->dev_addr[ETH_ALEN-1] = fec_mac_default[ETH_ALEN-1] +
++                      fep->index;
++}
++
++static void __inline__ fec_enable_phy_intr(void)
++{
++}
++
++static void __inline__ fec_disable_phy_intr(void)
++{
++}
++
++static void __inline__ fec_phy_ack_intr(void)
++{
++}
++
++static void __inline__ fec_localhw_setup(void)
++{
++}
++
++static void __inline__ fec_uncache(unsigned long addr)
++{
++}
++
++/* ------------------------------------------------------------------------- */
++
+ #else
+@@ -2305,7 +2469,7 @@ fec_set_mac_address(struct net_device *d
+ }
+-/* Initialize the FEC Ethernet on 860T (or ColdFire 5272).
++/* Initialize the FEC Ethernet.
+  */
+  /*
+   * XXX:  We need to clean up on failure exits here.
+@@ -2326,7 +2490,7 @@ int __init fec_enet_init(struct net_devi
+       /* Allocate memory for buffer descriptors.
+       */
+-      mem_addr = __get_free_page(GFP_KERNEL);
++      mem_addr = __get_free_page(GFP_DMA);
+       if (mem_addr == 0) {
+               printk("FEC: allocate descriptor memory failed?\n");
+               return -ENOMEM;
+@@ -2339,6 +2503,11 @@ int __init fec_enet_init(struct net_devi
+       fep->index = index;
+       fep->hwp = fecp;
+       fep->netdev = dev;
++#ifdef CONFIG_FEC_SHARED_PHY
++      fep->phy_hwp = (volatile fec_t *) fec_hw[index & ~1];
++#else
++      fep->phy_hwp = fecp;
++#endif
+       /* Whack a reset.  We should wait for this.
+       */
+@@ -2375,7 +2544,7 @@ int __init fec_enet_init(struct net_devi
+               /* Allocate a page.
+               */
+-              mem_addr = __get_free_page(GFP_KERNEL);
++              mem_addr = __get_free_page(GFP_DMA);
+               /* XXX: missing check for allocation failure */
+               fec_uncache(mem_addr);
+@@ -2400,7 +2569,7 @@ int __init fec_enet_init(struct net_devi
+       bdp = fep->tx_bd_base;
+       for (i=0, j=FEC_ENET_TX_FRPPG; i<TX_RING_SIZE; i++) {
+               if (j >= FEC_ENET_TX_FRPPG) {
+-                      mem_addr = __get_free_page(GFP_KERNEL);
++                      mem_addr = __get_free_page(GFP_DMA);
+                       j = 1;
+               } else {
+                       mem_addr += FEC_ENET_TX_FRSIZE;
+@@ -2462,7 +2631,11 @@ int __init fec_enet_init(struct net_devi
+        * remainder of the interface.
+        */
+       fep->phy_id_done = 0;
++#ifndef CONFIG_FEC_SHARED_PHY
+       fep->phy_addr = 0;
++#else
++      fep->phy_addr = fep->index;
++#endif
+       mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy);
+       index++;
+--- a/drivers/net/fec.h
++++ b/drivers/net/fec.h
+@@ -14,7 +14,7 @@
+ /****************************************************************************/
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
+ /*
+  *    Just figures, Motorola would have to change the offsets for
+  *    registers in the same peripheral device on different models
diff --git a/target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch b/target/linux/coldfire/patches/011-mcfv4e_namespace_align.patch
new file mode 100644 (file)
index 0000000..6bdac88
--- /dev/null
@@ -0,0 +1,25 @@
+From a51f4e9bff26cc43b53938169f98c27183ec63ea Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 17:08:59 -0600
+Subject: [PATCH] Change to align on page size for COLDFIRE.
+
+LTIBName: mcfv4e-namespace-align
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ fs/namespace.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+--- a/fs/namespace.c
++++ b/fs/namespace.c
+@@ -1364,7 +1364,11 @@ int copy_mount_options(const void __user
+       /* copy_from_user cannot cross TASK_SIZE ! */
+       size = TASK_SIZE - (unsigned long)data;
+       if (size > PAGE_SIZE)
++#ifndef CONFIG_COLDFIRE
+               size = PAGE_SIZE;
++#else
++              size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK);
++#endif
+       i = size - exact_copy_from_user((void *)page, data, size);
+       if (!i) {
diff --git a/target/linux/coldfire/patches/012-m5445x_defconfig_base.patch b/target/linux/coldfire/patches/012-m5445x_defconfig_base.patch
new file mode 100644 (file)
index 0000000..32e4b0d
--- /dev/null
@@ -0,0 +1,877 @@
+From d0910067712299dc63cf58447b5dd83513fcbdb4 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 31 Oct 2007 17:12:03 -0600
+Subject: [PATCH] MCF54455 EVB default configuration.
+
+LTIBName: m5445x-defconfig-base
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/configs/m54455evb_defconfig |  862 +++++++++++++++++++++++++++++++++
+ 1 files changed, 862 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/configs/m54455evb_defconfig
+
+--- /dev/null
++++ b/arch/m68k/configs/m54455evb_defconfig
+@@ -0,0 +1,862 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.23
++# Tue Nov 27 23:42:38 2007
++#
++CONFIG_M68K=y
++CONFIG_MMU=y
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_TIME_LOW_RES=y
++CONFIG_GENERIC_IOMAP=y
++CONFIG_NO_IOPORT=y
++# CONFIG_NO_DMA is not set
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=17
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++# CONFIG_EMBEDDED is not set
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++
++#
++# Platform dependent setup
++#
++# CONFIG_SUN3 is not set
++CONFIG_COLDFIRE=y
++CONFIG_CFV4E=y
++# CONFIG_AMIGA is not set
++# CONFIG_ATARI is not set
++# CONFIG_MAC is not set
++# CONFIG_APOLLO is not set
++# CONFIG_VME is not set
++# CONFIG_HP300 is not set
++# CONFIG_SUN3X is not set
++# CONFIG_Q40 is not set
++
++#
++# Processor type
++#
++# CONFIG_M68020 is not set
++# CONFIG_M68030 is not set
++# CONFIG_M68040 is not set
++# CONFIG_M68060 is not set
++CONFIG_M54455=y
++CONFIG_MCFCLK=266666666
++# CONFIG_MCF_USER_HALT is not set
++CONFIG_MMU_CFV4E=y
++CONFIG_SDRAM_BASE=0x40000000
++CONFIG_SDRAM_SIZE=0x0FFFFFFF
++CONFIG_NOR_FLASH_BASE=0x00000000
++# CONFIG_M68KFPU_EMU is not set
++CONFIG_ADVANCED=y
++# CONFIG_RMW_INSNS is not set
++CONFIG_SINGLE_MEMORY_CHUNK=y
++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_NEED_MULTIPLE_NODES=y
++# CONFIG_SPARSEMEM_STATIC is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++
++#
++# General setup
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++CONFIG_PROC_HARDWARE=y
++CONFIG_ZONE_DMA=y
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++CONFIG_NET_KEY=y
++# CONFIG_NET_KEY_MIGRATE is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++
++#
++# QoS and/or fair queueing
++#
++# CONFIG_NET_SCHED is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++# CONFIG_STANDALONE is not set
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++CONFIG_MTD_DEBUG=y
++CONFIG_MTD_DEBUG_VERBOSE=0
++CONFIG_MTD_CONCAT=y
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++CONFIG_MTD_CHAR=y
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++CONFIG_MTD_CFI=y
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_GEN_PROBE=y
++CONFIG_MTD_CFI_ADV_OPTIONS=y
++CONFIG_MTD_CFI_NOSWAP=y
++# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
++# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
++CONFIG_MTD_CFI_GEOMETRY=y
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_4 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++# CONFIG_MTD_CFI_I2 is not set
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++# CONFIG_MTD_OTP is not set
++CONFIG_MTD_CFI_INTELEXT=y
++# CONFIG_MTD_CFI_AMDSTD is not set
++# CONFIG_MTD_CFI_STAA is not set
++CONFIG_MTD_CFI_UTIL=y
++# CONFIG_MTD_RAM is not set
++# CONFIG_MTD_ROM is not set
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++CONFIG_MTD_PHYSMAP=y
++CONFIG_MTD_PHYSMAP_START=0x00000000
++CONFIG_MTD_PHYSMAP_LEN=0x1000000
++CONFIG_MTD_PHYSMAP_BANKWIDTH=1
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=64000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=m
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_TGT is not set
++# CONFIG_SCSI_NETLINK is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=m
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++# CONFIG_SCSI_MULTI_LUN is not set
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_SCSI_DEBUG is not set
++CONFIG_ATA=m
++# CONFIG_ATA_NONSTANDARD is not set
++CONFIG_PATA_FSL=m
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_FEC=y
++# CONFIG_FEC2 is not set
++CONFIG_NETDEV_1000=y
++CONFIG_NETDEV_10000=y
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++# CONFIG_INPUT_TSDEV is not set
++# CONFIG_INPUT_EVDEV is not set
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++# CONFIG_INPUT_KEYBOARD is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_COLDFIRE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_WATCHDOG is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_SM501 is not set
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++CONFIG_DAB=y
++
++#
++# Graphics support
++#
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
++CONFIG_HID_DEBUG=y
++CONFIG_USB_SUPPORT=y
++# CONFIG_USB_ARCH_HAS_HCD is not set
++# CONFIG_USB_ARCH_HAS_OHCI is not set
++# CONFIG_USB_ARCH_HAS_EHCI is not set
++
++#
++# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
++#
++
++#
++# USB Gadget Support
++#
++# CONFIG_USB_GADGET is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# DMA Engine support
++#
++# CONFIG_DMA_ENGINE is not set
++
++#
++# DMA Clients
++#
++
++#
++# DMA Devices
++#
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# Character devices
++#
++# CONFIG_SERIAL_CONSOLE is not set
++
++#
++# File systems
++#
++# CONFIG_EXT2_FS is not set
++CONFIG_EXT3_FS=y
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++# CONFIG_JBD_DEBUG is not set
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++CONFIG_MINIX_FS=y
++# CONFIG_ROMFS_FS is not set
++# CONFIG_INOTIFY is not set
++# CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=y
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++CONFIG_RAMFS=y
++# CONFIG_CONFIGFS_FS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++CONFIG_JFFS2_FS=y
++CONFIG_JFFS2_FS_DEBUG=0
++CONFIG_JFFS2_FS_WRITEBUFFER=y
++# CONFIG_JFFS2_SUMMARY is not set
++# CONFIG_JFFS2_FS_XATTR is not set
++# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
++CONFIG_JFFS2_ZLIB=y
++CONFIG_JFFS2_RTIME=y
++# CONFIG_JFFS2_RUBIN is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++
++#
++# Network File Systems
++#
++CONFIG_NFS_FS=y
++# CONFIG_NFS_V3 is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++
++#
++# Native Language Support
++#
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++CONFIG_NLS_ISO8859_1=y
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++
++#
++# Distributed Lock Manager
++#
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++# CONFIG_ENABLE_MUST_CHECK is not set
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++CONFIG_DEBUG_SLAB=y
++# CONFIG_DEBUG_SLAB_LEAK is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_FRAME_POINTER is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++CONFIG_BOOTPARAM=y
++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
++
++#
++# CodeTEST Setup
++#
++# CONFIG_CODETEST is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++CONFIG_CRYPTO_HW=y
++CONFIG_CRYPTO_DEV_MCFCAU=y
++CONFIG_CRYPTO_DEV_MCFCAU_DES=y
++CONFIG_CRYPTO_DEV_MCFCAU_AES=y
++CONFIG_CRYPTO_DEV_MCFCAU_MD5=y
++CONFIG_CRYPTO_DEV_MCFCAU_SHA1=y
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++CONFIG_ZLIB_INFLATE=y
++CONFIG_ZLIB_DEFLATE=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_DMA=y
diff --git a/target/linux/coldfire/patches/013-m5445x_ata.patch b/target/linux/coldfire/patches/013-m5445x_ata.patch
new file mode 100644 (file)
index 0000000..0f269c1
--- /dev/null
@@ -0,0 +1,1079 @@
+From c9e68ea1a541b9762ec0b656509aef3cdd75e035 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 19 Nov 2007 12:01:34 -0700
+Subject: [PATCH] Add support for the M5445x ATA controller.
+
+LTIBName: m5445x-ata
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/Makefile           |    1 +
+ arch/m68k/coldfire/head.S             |    5 +
+ arch/m68k/coldfire/mcf5445x-devices.c |  125 +++++
+ drivers/ata/Kconfig                   |   11 +-
+ drivers/ata/Makefile                  |    2 +-
+ drivers/ata/pata_fsl.c                |  829 +++++++++++++++++++++++++++++++++
+ include/asm-m68k/pci.h                |   10 +-
+ include/linux/fsl_devices.h           |   11 +
+ 8 files changed, 990 insertions(+), 4 deletions(-)
+ create mode 100644 arch/m68k/coldfire/mcf5445x-devices.c
+ create mode 100644 drivers/ata/pata_fsl.c
+
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -9,3 +9,4 @@ ifneq ($(strip $(CONFIG_USB) $(CONFIG_US
+ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
++obj-$(CONFIG_M54455)  += mcf5445x-devices.o
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -374,6 +374,11 @@ ENTRY(__start)
+               MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
+               0, MMUDR_LK, %d0
++      /* Map ATA registers -- sacrifice a data TLB due to the hw design */
++      mmu_map (0x90000000), (0x90000000), 0, 0, \
++              MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
++              0, MMUDR_LK, %d0
++
+       /* Do unity mapping to enable the MMU.  Map first 16 MB in place as 
+          code (delete TLBs after MMU is enabled and we are executing in high 
+          memory). */
+--- /dev/null
++++ b/arch/m68k/coldfire/mcf5445x-devices.c
+@@ -0,0 +1,125 @@
++/*
++ * arch/m68k/coldfire/mcf5445x-devices.c
++ *
++ * Coldfire M5445x Platform Device Configuration
++ *
++ * Based on the Freescale MXC devices.c
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/fsl_devices.h>
++
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++
++/* ATA Interrupt */
++#define IRQ_ATA               (64 + 64 + 54)
++
++/* ATA Base */
++#define       BASE_IO_ATA     0x90000000
++
++#define ATA_IER               MCF_REG08(BASE_IO_ATA+0x2c)     /* int enable reg */
++#define ATA_ICR               MCF_REG08(BASE_IO_ATA+0x30)     /* int clear reg */
++
++/*
++ * On-chip PATA
++ */
++#if defined(CONFIG_PATA_FSL) || defined(CONFIG_PATA_FSL_MODULE)
++static int ata_init(struct platform_device *pdev)
++{
++      /* clear ints */
++      ATA_IER = 0x00;
++      ATA_ICR = 0xff;
++
++      /* setup shared pins */
++      MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC & MCF_GPIO_PAR_FEC_FEC1_MASK) |
++                         MCF_GPIO_PAR_FEC_FEC1_ATA;
++
++      MCF_GPIO_PAR_FECI2C = (MCF_GPIO_PAR_FECI2C &
++                            (MCF_GPIO_PAR_FECI2C_MDC1_MASK &
++                            MCF_GPIO_PAR_FECI2C_MDIO1_MASK)) |
++                            MCF_GPIO_PAR_FECI2C_MDC1_ATA_DIOR |
++                            MCF_GPIO_PAR_FECI2C_MDIO1_ATA_DIOW;
++
++      MCF_GPIO_PAR_ATA = MCF_GPIO_PAR_ATA_BUFEN |
++                         MCF_GPIO_PAR_ATA_CS1 |
++                         MCF_GPIO_PAR_ATA_CS0 |
++                         MCF_GPIO_PAR_ATA_DA2 |
++                         MCF_GPIO_PAR_ATA_DA1 |
++                         MCF_GPIO_PAR_ATA_DA0 |
++                         MCF_GPIO_PAR_ATA_RESET_RESET |
++                         MCF_GPIO_PAR_ATA_DMARQ_DMARQ |
++                         MCF_GPIO_PAR_ATA_IORDY_IORDY;
++
++      MCF_GPIO_PAR_PCI = (MCF_GPIO_PAR_PCI &
++                           (MCF_GPIO_PAR_PCI_GNT3_MASK &
++                            MCF_GPIO_PAR_PCI_REQ3_MASK)) |
++                         MCF_GPIO_PAR_PCI_GNT3_ATA_DMACK |
++                         MCF_GPIO_PAR_PCI_REQ3_ATA_INTRQ;
++
++      return 0;
++}
++
++static void ata_exit(void)
++{
++      printk(KERN_INFO "** ata_exit\n");
++}
++
++static int ata_get_clk_rate(void)
++{
++      return MCF_BUSCLK;
++}
++
++static struct fsl_ata_platform_data ata_data = {
++      .init             = ata_init,
++      .exit             = ata_exit,
++      .get_clk_rate     = ata_get_clk_rate,
++};
++
++static struct resource pata_fsl_resources[] = {
++      [0] = {         /* I/O */
++              .start          = BASE_IO_ATA,
++              .end            = BASE_IO_ATA + 0x000000d8,
++              .flags          = IORESOURCE_MEM,
++      },
++      [2] = {         /* IRQ */
++              .start          = IRQ_ATA,
++              .end            = IRQ_ATA,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device pata_fsl_device = {
++      .name                   = "pata_fsl",
++      .id                     = -1,
++      .num_resources          = ARRAY_SIZE(pata_fsl_resources),
++      .resource               = pata_fsl_resources,
++      .dev                    = {
++              .platform_data  = &ata_data,
++              .coherent_dma_mask = ~0,        /* $$$ REVISIT */
++      },
++};
++
++static inline void mcf5445x_init_pata(void)
++{
++      (void)platform_device_register(&pata_fsl_device);
++}
++#else
++static inline void mcf5445x_init_pata(void)
++{
++}
++#endif
++
++static int __init mcf5445x_init_devices(void)
++{
++      printk(KERN_INFO "MCF5445x INIT_DEVICES\n");
++      mcf5445x_init_pata();
++
++      return 0;
++}
++arch_initcall(mcf5445x_init_devices);
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -6,7 +6,7 @@ menuconfig ATA
+       tristate "Serial ATA (prod) and Parallel ATA (experimental) drivers"
+       depends on HAS_IOMEM
+       depends on BLOCK
+-      depends on !(M32R || M68K) || BROKEN
++      depends on !M32R || BROKEN
+       depends on !SUN4 || BROKEN
+       select SCSI
+       ---help---
+@@ -679,4 +679,13 @@ config PATA_BF54X
+         If unsure, say N.
++config PATA_FSL
++      tristate "Freescale on-chip PATA support"
++      depends on (ARCH_MX3 || ARCH_MX27 || PPC_512x || M54455)
++      help
++        On Freescale processors, say Y here if you wish to use the on-chip
++        ATA interface.
++
++        If you are unsure, say N to this.
++
+ endif # ATA
+--- a/drivers/ata/Makefile
++++ b/drivers/ata/Makefile
+@@ -1,4 +1,3 @@
+-
+ obj-$(CONFIG_ATA)             += libata.o
+ obj-$(CONFIG_SATA_AHCI)               += ahci.o
+@@ -71,6 +70,7 @@ obj-$(CONFIG_PATA_BF54X)     += pata_bf54x.o
+ obj-$(CONFIG_PATA_PLATFORM)   += pata_platform.o
+ obj-$(CONFIG_PATA_OF_PLATFORM)        += pata_of_platform.o
+ obj-$(CONFIG_PATA_ICSIDE)     += pata_icside.o
++obj-$(CONFIG_PATA_FSL)                += pata_fsl.o
+ # Should be last but two libata driver
+ obj-$(CONFIG_PATA_ACPI)               += pata_acpi.o
+ # Should be last but one libata driver
+--- /dev/null
++++ b/drivers/ata/pata_fsl.c
+@@ -0,0 +1,829 @@
++/*
++ * Freescale integrated PATA driver
++ */
++
++/*
++ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/blkdev.h>
++#include <scsi/scsi_host.h>
++#include <linux/ata.h>
++#include <linux/libata.h>
++#include <linux/platform_device.h>
++#include <linux/fsl_devices.h>
++#ifdef CONFIG_FSL_PATA_USE_DMA
++#include <asm/dma.h>
++#endif
++
++#define DRV_NAME "pata_fsl"
++#define DRV_VERSION "1.0"
++
++#ifdef CONFIG_M54455
++#define WRITE_ATA8(val, reg)                  \
++      __raw_writeb(val, (ata_regs + reg));
++#define WRITE_ATA16(val, reg)                 \
++      __raw_writew(val, (ata_regs + reg));
++#else
++#define WRITE_ATA8(val, reg)                  \
++      __raw_writel(val, (ata_regs + reg));
++#define WRITE_ATA16(val, reg)                 \
++      __raw_writel(val, (ata_regs + reg));
++#endif
++
++struct pata_fsl_priv {
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      int ultra;
++#endif
++      u8 *fsl_ata_regs;
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      int dma_rchan;
++      int dma_wchan;
++      int dma_done;
++      int dma_dir;
++#endif
++};
++
++enum {
++      /* various constants */
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      FSL_ATA_MAX_SG_LEN      = 65534,
++#endif
++
++      /* offsets to registers */
++
++      FSL_ATA_TIMING_REGS     = 0x00,
++      FSL_ATA_FIFO_FILL       = 0x20,
++      FSL_ATA_CONTROL         = 0x24,
++      FSL_ATA_INT_PEND        = 0x28,
++      FSL_ATA_INT_EN          = 0x2C,
++      FSL_ATA_INT_CLEAR       = 0x30,
++      FSL_ATA_FIFO_ALARM      = 0x34,
++      FSL_ATA_DRIVE_DATA      = 0xA0,
++      FSL_ATA_DRIVE_CONTROL   = 0xD8,
++
++      /* bits within FSL_ATA_CONTROL */
++
++      FSL_ATA_CTRL_FIFO_RST_B    = 0x80,
++      FSL_ATA_CTRL_ATA_RST_B     = 0x40,
++      FSL_ATA_CTRL_FIFO_TX_EN    = 0x20,
++      FSL_ATA_CTRL_FIFO_RCV_EN   = 0x10,
++      FSL_ATA_CTRL_DMA_PENDING   = 0x08,
++      FSL_ATA_CTRL_DMA_ULTRA     = 0x04,
++      FSL_ATA_CTRL_DMA_WRITE     = 0x02,
++      FSL_ATA_CTRL_IORDY_EN      = 0x01,
++
++      /* bits within the interrupt control registers */
++
++      FSL_ATA_INTR_ATA_INTRQ1      = 0x80,
++      FSL_ATA_INTR_FIFO_UNDERFLOW  = 0x40,
++      FSL_ATA_INTR_FIFO_OVERFLOW   = 0x20,
++      FSL_ATA_INTR_CTRL_IDLE       = 0x10,
++      FSL_ATA_INTR_ATA_INTRQ2      = 0x08,
++};
++
++/*
++ * This structure contains the timing parameters for
++ * ATA bus timing in the 5 PIO modes.  The timings
++ * are in nanoseconds, and are converted to clock
++ * cycles before being stored in the ATA controller
++ * timing registers.
++ */
++static struct {
++      short t0, t1, t2_8, t2_16, t2i, t4, t9, tA;
++} pio_specs[] = {
++      [0] = {
++              .t0 = 600, .t1 = 70, .t2_8 = 290, .t2_16 = 165, .t2i = 0,
++              .t4 = 30,.t9 = 20,.tA = 50
++      },
++      [1] = {
++              .t0 = 383, .t1 = 50, .t2_8 = 290, .t2_16 = 125, .t2i = 0,
++              .t4 = 20, .t9 = 15, .tA = 50
++      },
++      [2] = {
++              .t0 = 240, .t1 = 30, .t2_8 = 290, .t2_16 = 100, .t2i = 0,
++              .t4 = 15, .t9 = 10, .tA = 50
++      },
++      [3] = {
++              .t0 = 180, .t1 = 30, .t2_8 = 80, .t2_16 = 80, .t2i = 0,
++              .t4 = 10, .t9 = 10, .tA = 50
++      },
++      [4] = {
++              .t0 = 120, .t1 = 25, .t2_8 = 70, .t2_16 = 70, .t2i = 0,
++              .t4 = 10, .t9 = 10, .tA = 50
++      },
++};
++
++#define NR_PIO_SPECS (sizeof pio_specs / sizeof pio_specs[0])
++
++/*
++ * This structure contains the timing parameters for
++ * ATA bus timing in the 3 MDMA modes.  The timings
++ * are in nanoseconds, and are converted to clock
++ * cycles before being stored in the ATA controller
++ * timing registers.
++ */
++static struct {
++      short t0M, tD, tH, tJ, tKW, tM, tN, tJNH;
++} mdma_specs[] = {
++      [0] = {
++              .t0M = 480, .tD = 215, .tH = 20, .tJ = 20, .tKW = 215,
++              .tM = 50, .tN = 15, .tJNH = 20
++      },
++      [1] = {
++              .t0M = 150, .tD = 80, .tH = 15, .tJ = 5, .tKW = 50,
++              .tM = 30, .tN = 10, .tJNH = 15
++      },
++      [2] = {
++              .t0M = 120, .tD = 70, .tH = 10, .tJ = 5, .tKW = 25,
++              .tM = 25, .tN = 10, .tJNH = 10
++      },
++};
++
++#define NR_MDMA_SPECS (sizeof mdma_specs / sizeof mdma_specs[0])
++
++/*
++ * This structure contains the timing parameters for
++ * ATA bus timing in the 6 UDMA modes.  The timings
++ * are in nanoseconds, and are converted to clock
++ * cycles before being stored in the ATA controller
++ * timing registers.
++ */
++static struct {
++      short t2CYC, tCYC, tDS, tDH, tDVS, tDVH, tCVS, tCVH, tFS_min, tLI_max,
++          tMLI, tAZ, tZAH, tENV_min, tSR, tRFS, tRP, tACK, tSS, tDZFS;
++} udma_specs[] = {
++      [0] = {
++              .t2CYC = 235, .tCYC = 114, .tDS = 15, .tDH = 5, .tDVS = 70,
++              .tDVH = 6, .tCVS = 70, .tCVH = 6, .tFS_min = 0,
++              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 50, .tRFS = 75, .tRP = 160,
++              .tACK = 20, .tSS = 50, .tDZFS = 80
++      },
++      [1] = {
++              .t2CYC = 156, .tCYC = 75, .tDS = 10, .tDH = 5, .tDVS = 48,
++              .tDVH = 6, .tCVS = 48, .tCVH = 6, .tFS_min = 0,
++              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 30, .tRFS = 70, .tRP = 125,
++              .tACK = 20, .tSS = 50, .tDZFS = 63
++      },
++      [2] = {
++              .t2CYC = 117, .tCYC = 55, .tDS = 7, .tDH = 5, .tDVS = 34,
++              .tDVH = 6, .tCVS = 34, .tCVH = 6, .tFS_min = 0,
++              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100,
++              .tACK = 20, .tSS = 50, .tDZFS = 47
++      },
++      [3] = {
++              .t2CYC = 86, .tCYC = 39, .tDS = 7, .tDH = 5, .tDVS = 20,
++              .tDVH = 6, .tCVS = 20, .tCVH = 6, .tFS_min = 0,
++              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 20, .tRFS = 60, .tRP = 100,
++              .tACK = 20, .tSS = 50, .tDZFS = 35
++      },
++      [4] = {
++              .t2CYC = 57, .tCYC = 25, .tDS = 5, .tDH = 5, .tDVS = 7,
++              .tDVH = 6, .tCVS = 7, .tCVH = 6, .tFS_min = 0,
++              .tLI_max = 100, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 50, .tRFS = 60, .tRP = 100,
++              .tACK = 20, .tSS = 50, .tDZFS = 25
++      },
++      [5] = {
++              .t2CYC = 38, .tCYC = 17, .tDS = 4, .tDH = 5, .tDVS = 5,
++              .tDVH = 6, .tCVS = 10, .tCVH = 10, .tFS_min = 0,
++              .tLI_max = 75, .tMLI = 20, .tAZ = 10, .tZAH = 20,
++              .tENV_min = 20, .tSR = 20, .tRFS = 50, .tRP = 85,
++              .tACK = 20, .tSS = 50, .tDZFS = 40
++      },
++};
++
++#define NR_UDMA_SPECS (sizeof udma_specs / sizeof udma_specs[0])
++
++struct fsl_ata_time_regs {
++      u8 time_off, time_on, time_1, time_2w;
++      u8 time_2r, time_ax, time_pio_rdx, time_4;
++      u8 time_9, time_m, time_jn, time_d;
++      u8 time_k, time_ack, time_env, time_rpx;
++      u8 time_zah, time_mlix, time_dvh, time_dzfs;
++      u8 time_dvs, time_cvh, time_ss, time_cyc;
++};
++
++static void update_timing_config(struct fsl_ata_time_regs *tp, struct ata_host *host)
++{
++      u32 *lp = (u32 *)tp;
++      struct pata_fsl_priv *priv = host->private_data;
++      u32 *ctlp = (u32 *)priv->fsl_ata_regs;
++      int i;
++
++      /* 
++       * JKM - this could have endianess issues on BE depending
++       * on how the controller is glued to the bus -- probably
++       * should rewrite this to write byte at a time.
++       */
++      for (i = 0; i < 5; i++) {
++              __raw_writel(*lp, ctlp);
++              lp++;
++              ctlp++;
++      }
++      mb();
++}
++
++/*!
++ * Calculate values for the ATA bus timing registers and store
++ * them into the hardware.
++ *
++ * @param       xfer_mode   specifies XFER xfer_mode
++ * @param       pdev        specifies platform_device
++ *
++ * @return      EINVAL      speed out of range, or illegal mode
++ */
++static int set_ata_bus_timing(u8 xfer_mode, struct platform_device *pdev)
++{
++      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
++                                           pdev->dev.platform_data;
++      struct ata_host *host = dev_get_drvdata(&pdev->dev);
++
++      /* get the bus clock cycle time, in ns */
++      int T = 1 * 1000 * 1000 * 1000 / plat->get_clk_rate();
++      struct fsl_ata_time_regs tr = {0};
++      DPRINTK("clk_rate = %d  T = %d\n",plat->get_clk_rate(), T);
++
++      /*
++       * every mode gets the same t_off and t_on
++       */
++      tr.time_off = 3;
++      tr.time_on = 3;
++
++      if (xfer_mode >= XFER_UDMA_0) {
++              int speed = xfer_mode - XFER_UDMA_0;
++              if (speed >= NR_UDMA_SPECS) {
++                      return -EINVAL;
++              }
++              tr.time_ack = (udma_specs[speed].tACK + T) / T;
++              tr.time_env = (udma_specs[speed].tENV_min + T) / T;
++              tr.time_rpx = (udma_specs[speed].tRP + T) / T + 2;
++
++              tr.time_zah = (udma_specs[speed].tZAH + T) / T;
++              tr.time_mlix = (udma_specs[speed].tMLI + T) / T;
++              tr.time_dvh = (udma_specs[speed].tDVH + T) / T + 1;
++              tr.time_dzfs = (udma_specs[speed].tDZFS + T) / T;
++
++              tr.time_dvs = (udma_specs[speed].tDVS + T) / T;
++              tr.time_cvh = (udma_specs[speed].tCVH + T) / T;
++              tr.time_ss = (udma_specs[speed].tSS + T) / T;
++              tr.time_cyc = (udma_specs[speed].tCYC + T) / T;
++      } else if (xfer_mode >= XFER_MW_DMA_0) {
++              int speed = xfer_mode - XFER_MW_DMA_0;
++              if (speed >= NR_MDMA_SPECS) {
++                      return -EINVAL;
++              }
++              tr.time_m = (mdma_specs[speed].tM + T) / T;
++              tr.time_jn = (mdma_specs[speed].tJNH + T) / T;
++              tr.time_d = (mdma_specs[speed].tD + T) / T;
++
++              tr.time_k = (mdma_specs[speed].tKW + T) / T;
++      } else {
++              int speed = xfer_mode - XFER_PIO_0;
++              if (speed >= NR_PIO_SPECS) {
++                      return -EINVAL;
++              }
++              tr.time_1 = (pio_specs[speed].t1 + T) / T;
++              tr.time_2w = (pio_specs[speed].t2_8 + T) / T;
++
++              tr.time_2r = (pio_specs[speed].t2_8 + T) / T;
++              tr.time_ax = (pio_specs[speed].tA + T) / T + 2;
++              tr.time_pio_rdx = 1;
++              tr.time_4 = (pio_specs[speed].t4 + T) / T;
++
++              tr.time_9 = (pio_specs[speed].t9 + T) / T;
++      }
++
++      update_timing_config(&tr, host);
++
++      return 0;
++}
++
++static void pata_fsl_set_piomode(struct ata_port *ap, struct ata_device *adev)
++{
++      set_ata_bus_timing(adev->pio_mode, to_platform_device(ap->dev));
++}
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++static void pata_fsl_set_dmamode(struct ata_port *ap, struct ata_device *adev)
++{
++      struct pata_fsl_priv *priv = ap->host->private_data;
++
++      priv->ultra = adev->dma_mode >= XFER_UDMA_0;
++
++      set_ata_bus_timing(adev->dma_mode, to_platform_device(ap->dev));
++}
++#endif
++
++static int pata_fsl_port_start(struct ata_port *ap)
++{
++      return 0;
++}
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++static void dma_callback(void *arg, int error_status, unsigned int count)
++{
++      struct ata_port *ap = arg;
++      struct pata_fsl_priv *priv = ap->host->private_data;
++      u8 *ata_regs = priv->fsl_ata_regs;
++
++      priv->dma_done = 1;
++      /* 
++       * DMA is finished, so unmask INTRQ from the drive to allow the
++       * normal ISR to fire.
++       */
++#if 0
++      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
++#else
++      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
++#endif
++      mb();
++}
++
++static void pata_fsl_bmdma_setup(struct ata_queued_cmd *qc)
++{
++      int nr_sg = 0;
++      int chan;
++      int dma_mode = 0, dma_ultra;
++      u8 ata_control;
++      struct ata_port *ap = qc->ap;
++      struct pata_fsl_priv *priv = ap->host->private_data;
++      u8 *ata_regs = priv->fsl_ata_regs;
++      struct fsl_ata_platform_data *plat = ap->dev->platform_data;
++      struct scatterlist tmp[plat->max_sg], *tsg, *sg;
++      int err;
++
++      DPRINTK("ENTER\n");
++
++      priv->dma_dir = qc->dma_dir;
++
++      /*
++       * Configure the on-chip ATA interface hardware.
++       */
++      dma_ultra = priv->ultra ?
++              FSL_ATA_CTRL_DMA_ULTRA : 0;
++
++      ata_control = FSL_ATA_CTRL_FIFO_RST_B |
++                    FSL_ATA_CTRL_ATA_RST_B |
++                    FSL_ATA_CTRL_DMA_PENDING |
++                    dma_ultra;
++
++      if (qc->dma_dir == DMA_TO_DEVICE) {
++              chan = priv->dma_wchan;
++              ata_control |= FSL_ATA_CTRL_FIFO_TX_EN |
++                            FSL_ATA_CTRL_DMA_WRITE;
++              dma_mode = DMA_MODE_WRITE;
++      } else {
++              chan = priv->dma_rchan;
++              ata_control |= FSL_ATA_CTRL_FIFO_RCV_EN;
++              dma_mode = DMA_MODE_READ;
++      }
++#if 0
++      __raw_writel(ata_control, ata_regs + FSL_ATA_CONTROL);
++      __raw_writel(plat->fifo_alarm, ata_regs + FSL_ATA_FIFO_ALARM);
++      __raw_writel(FSL_ATA_INTR_ATA_INTRQ1, ata_regs + FSL_ATA_INT_EN);
++#else
++      WRITE_ATA8(ata_control, FSL_ATA_CONTROL);
++      WRITE_ATA8(plat->fifo_alarm, FSL_ATA_FIFO_ALARM);
++      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ1, FSL_ATA_INT_EN);
++#endif
++      mb();
++
++      /*
++       * Set up the DMA completion callback.
++       */
++      mxc_dma_callback_set(chan, dma_callback, (void *)ap);
++
++      /*
++       * Copy the sg list to an array.
++       */
++      tsg = tmp;
++      ata_for_each_sg(sg, qc) {
++              memcpy(tsg, sg, sizeof *sg);
++              tsg++;
++              nr_sg++;
++      }
++      
++      err = mxc_dma_sg_config(chan, tmp, nr_sg, 0, dma_mode);
++      if (err) {
++              printk(KERN_ERR "pata_fsl_bmdma_setup: error %d\n", err);
++      }
++      DPRINTK("EXIT\n");
++}
++
++static void pata_fsl_bmdma_start(struct ata_queued_cmd *qc)
++{
++      struct ata_port *ap = qc->ap;
++      struct pata_fsl_priv *priv = ap->host->private_data;
++      int chan;
++      int err;
++
++      /*
++       * Start the channel.
++       */
++      chan = qc->dma_dir == DMA_TO_DEVICE ? priv->dma_wchan : priv->dma_rchan;
++
++      priv->dma_done = 0;
++
++      err = mxc_dma_enable(chan);
++      if (err) {
++              printk(KERN_ERR "%s: : error %d\n", __func__, err);
++      }
++
++      ap->ops->exec_command(ap, &qc->tf);
++}
++
++static void pata_fsl_bmdma_stop(struct ata_queued_cmd *qc)
++{
++      struct ata_port *ap = qc->ap;
++
++      /* do a dummy read as in ata_bmdma_stop */
++      ata_altstatus(ap);
++}
++
++static u8 pata_fsl_bmdma_status(struct ata_port *ap)
++{
++      struct pata_fsl_priv *priv = ap->host->private_data;
++
++      return priv->dma_done ? ATA_DMA_INTR : 0;
++}
++
++static void pata_fsl_dma_init(struct ata_port *ap)
++{
++      struct pata_fsl_priv *priv = ap->host->private_data;
++
++      priv->dma_rchan = -1;
++      priv->dma_wchan = -1;
++
++      priv->dma_rchan = mxc_dma_request(MXC_DMA_ATA_RX, "MXC ATA RX");
++      if (priv->dma_rchan < 0) {
++              dev_printk(KERN_ERR, ap->dev, "couldn't get RX DMA channel\n");
++              goto err_out;
++      }
++
++      priv->dma_wchan = mxc_dma_request(MXC_DMA_ATA_TX, "MXC ATA TX");
++      if (priv->dma_wchan < 0) {
++              dev_printk(KERN_ERR, ap->dev, "couldn't get TX DMA channel\n");
++              goto err_out;
++      }       
++
++      dev_printk(KERN_ERR, ap->dev, "rchan=%d wchan=%d\n", priv->dma_rchan,
++                 priv->dma_wchan);
++      return;
++
++err_out:
++      ap->mwdma_mask = 0;
++      ap->udma_mask = 0;
++      mxc_dma_free(priv->dma_rchan);
++      mxc_dma_free(priv->dma_wchan);
++      kfree(priv);
++}
++#endif /* CONFIG_FSL_PATA_USE_DMA */
++
++static u8 pata_fsl_irq_ack(struct ata_port *ap, unsigned int chk_drq)
++{
++      unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
++      u8 status;
++
++      status = ata_busy_wait(ap, bits, 1000);
++      if (status & bits)
++              if (ata_msg_err(ap))
++                      printk(KERN_ERR "abnormal status 0x%X\n", status);
++
++      return status;
++}
++
++static void ata_dummy_noret(struct ata_port *ap) { return; }
++
++static struct scsi_host_template pata_fsl_sht = {
++      .module                 = THIS_MODULE,
++      .name                   = DRV_NAME,
++      .ioctl                  = ata_scsi_ioctl,
++      .queuecommand           = ata_scsi_queuecmd,
++      .can_queue              = ATA_DEF_QUEUE,
++      .this_id                = ATA_SHT_THIS_ID,
++      .sg_tablesize           = LIBATA_MAX_PRD,
++      .cmd_per_lun            = ATA_SHT_CMD_PER_LUN,
++      .emulated               = ATA_SHT_EMULATED,
++      .use_clustering         = ATA_SHT_USE_CLUSTERING,
++      .proc_name              = DRV_NAME,
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      .dma_boundary           = FSL_ATA_MAX_SG_LEN,
++#endif
++      .slave_configure        = ata_scsi_slave_config,
++      .slave_destroy          = ata_scsi_slave_destroy,
++      .bios_param             = ata_std_bios_param,
++};
++
++static struct ata_port_operations pata_fsl_port_ops = {
++      .set_piomode            = pata_fsl_set_piomode,
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      .set_dmamode            = pata_fsl_set_dmamode,
++#endif
++
++      .port_disable           = ata_port_disable,
++      .tf_load                = ata_tf_load,
++      .tf_read                = ata_tf_read,
++      .check_status           = ata_check_status,
++      .exec_command           = ata_exec_command,
++      .dev_select             = ata_std_dev_select,
++
++      .freeze                 = ata_bmdma_freeze,
++      .thaw                   = ata_bmdma_thaw,
++      .error_handler          = ata_bmdma_error_handler,
++      .post_internal_cmd      = ata_bmdma_post_internal_cmd,
++      .cable_detect           = ata_cable_unknown,
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      .bmdma_setup            = pata_fsl_bmdma_setup,
++      .bmdma_start            = pata_fsl_bmdma_start,
++#endif
++
++      .qc_prep                = ata_noop_qc_prep,
++      .qc_issue               = ata_qc_issue_prot,
++
++      .data_xfer              = ata_data_xfer_noirq,
++
++      .irq_clear              = ata_dummy_noret,
++      .irq_on                 = ata_irq_on,
++      .irq_ack                = pata_fsl_irq_ack,
++
++      .port_start             = pata_fsl_port_start,
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      .bmdma_stop             = pata_fsl_bmdma_stop,
++      .bmdma_status           = pata_fsl_bmdma_status,
++#endif
++};
++
++static void fsl_setup_port(struct ata_ioports *ioaddr)
++{
++      unsigned int shift = 2;
++
++      ioaddr->data_addr       = ioaddr->cmd_addr + (ATA_REG_DATA    << shift);
++      ioaddr->error_addr      = ioaddr->cmd_addr + (ATA_REG_ERR     << shift);
++      ioaddr->feature_addr    = ioaddr->cmd_addr + (ATA_REG_FEATURE << shift);
++      ioaddr->nsect_addr      = ioaddr->cmd_addr + (ATA_REG_NSECT   << shift);
++      ioaddr->lbal_addr       = ioaddr->cmd_addr + (ATA_REG_LBAL    << shift);
++      ioaddr->lbam_addr       = ioaddr->cmd_addr + (ATA_REG_LBAM    << shift);
++      ioaddr->lbah_addr       = ioaddr->cmd_addr + (ATA_REG_LBAH    << shift);
++      ioaddr->device_addr     = ioaddr->cmd_addr + (ATA_REG_DEVICE  << shift);
++      ioaddr->status_addr     = ioaddr->cmd_addr + (ATA_REG_STATUS  << shift);
++      ioaddr->command_addr    = ioaddr->cmd_addr + (ATA_REG_CMD     << shift);
++}
++
++/**
++ *    pata_fsl_probe          -       attach a platform interface
++ *    @pdev: platform device
++ *
++ *    Register a platform bus integrated ATA host controller
++ *
++ *    The 3 platform device resources are used as follows:
++ *
++ *            - I/O Base (IORESOURCE_MEM) virt. addr. of ATA controller regs
++ *            - CTL Base (IORESOURCE_MEM) unused
++ *            - IRQ      (IORESOURCE_IRQ) platform IRQ assigned to ATA
++ *
++ */
++static int __devinit pata_fsl_probe(struct platform_device *pdev)
++{
++      struct resource *io_res;
++      struct ata_host *host;
++      struct ata_port *ap;
++      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
++                                           pdev->dev.platform_data;
++      struct pata_fsl_priv *priv;
++      u8 *ata_regs;
++      int ret;
++
++      DPRINTK("ENTER\n");
++      /* 
++       * Get an ata_host structure for this device
++       */
++      host = ata_host_alloc(&pdev->dev, 1);
++      if (!host)
++              return -ENOMEM;
++      ap = host->ports[0];
++
++      /* 
++       * Allocate private data
++       */
++      priv = kzalloc(sizeof (struct pata_fsl_priv), GFP_KERNEL);
++      if(priv == NULL) {
++              /* free(host); */
++              return -ENOMEM;
++      }
++      host->private_data = priv;
++
++      /*
++       * Set up resources
++       */
++      if (unlikely(pdev->num_resources != 3)) {
++              dev_err(&pdev->dev, "invalid number of resources\n");
++              return -EINVAL;
++      }
++
++      io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      ata_regs = (u8 *)io_res->start;
++      priv->fsl_ata_regs = ata_regs;
++      ap->ioaddr.cmd_addr = (void *)(ata_regs + FSL_ATA_DRIVE_DATA);
++      ap->ioaddr.ctl_addr = (void *)(ata_regs + FSL_ATA_DRIVE_CONTROL);
++      ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
++      ap->ops = &pata_fsl_port_ops;
++      ap->pio_mask = 0x7F;
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      ap->mwdma_mask = 0x7F;
++      ap->udma_mask = plat->udma_mask;
++      pata_fsl_sht.sg_tablesize = plat->max_sg;
++#else
++      ap->mwdma_mask = 0x00;
++      ap->udma_mask = 0x00;
++#endif
++      fsl_setup_port(&ap->ioaddr);
++
++      /*
++       * Do platform-specific initialization (e.g. allocate pins,
++       * turn on clock).  After this call it is assumed that
++       * plat->get_clk_rate() can be called to calculate
++       * timing.
++       */
++      if (plat->init && plat->init(pdev)) {
++              /* REVISIT: don't leak what ata_host_alloc() allocated */
++              return -ENODEV;
++      }
++
++      /* Deassert the reset bit to enable the interface */
++      WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL);
++      mb();
++
++      /* Set initial timing and mode */
++      set_ata_bus_timing(XFER_PIO_4, pdev);
++
++#ifdef CONFIG_FSL_PATA_USE_DMA
++      /* get DMA ready */
++      pata_fsl_dma_init(ap);
++#endif
++
++      /*
++       * Enable the ATA INTRQ interrupt from the bus, but
++       * only allow the CPU to see it (INTRQ2) at this point.
++       * INTRQ1, which goes to the DMA, will be enabled later.
++       */
++#if 0
++      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
++#else
++      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
++#endif
++      mb();
++
++      /* activate */
++      ret = ata_host_activate(host, platform_get_irq(pdev, 0), ata_interrupt,
++                               0, &pata_fsl_sht);
++      DPRINTK("EXIT ret=%d\n", ret);
++      return ret;
++}
++
++/**
++ *    pata_fsl_remove -       unplug a platform interface
++ *    @pdev: platform device
++ *
++ *    A platform bus ATA device has been unplugged. Perform the needed
++ *    cleanup. Also called on module unload for any active devices.
++ */
++static int __devexit pata_fsl_remove(struct platform_device *pdev)
++{
++      struct device *dev = &pdev->dev;
++      struct ata_host *host = dev_get_drvdata(dev);
++      struct pata_fsl_priv *priv = host->private_data;
++      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
++                                           pdev->dev.platform_data;
++      u8 *ata_regs = priv->fsl_ata_regs;
++
++#if 0
++      __raw_writel(0, ata_regs + FSL_ATA_INT_EN);  /* Disable interrupts */
++#else
++      WRITE_ATA8(0, FSL_ATA_INT_EN); /* Disable interrupts */
++#endif
++      mb();
++
++      ata_host_detach(host);
++
++      if (plat->exit)
++              plat->exit();
++
++      kfree(priv);
++
++      return 0;
++}
++
++#ifdef CONFIG_PM
++static int pata_fsl_suspend(struct platform_device *pdev, pm_message_t state)
++{
++      struct ata_host *host = dev_get_drvdata(&pdev->dev);
++      struct pata_fsl_priv *priv = host->private_data;
++      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
++                                           pdev->dev.platform_data;
++      u8 *ata_regs = priv->fsl_ata_regs;
++
++      /* Disable interrupts. */
++#if 0
++      __raw_writel(0, ata_regs + FSL_ATA_INT_EN);
++#else
++      WRITE_ATA8(0, FSL_ATA_INT_EN);
++#endif
++      mb();
++
++      if (plat->exit)
++              plat->exit();
++
++      return 0;
++}
++
++static int pata_fsl_resume(struct platform_device *pdev)
++{
++      struct ata_host *host = dev_get_drvdata(&pdev->dev);
++      struct pata_fsl_priv *priv = host->private_data;
++      struct fsl_ata_platform_data *plat = (struct fsl_ata_platform_data *)
++                                           pdev->dev.platform_data;
++      u8 *ata_regs = priv->fsl_ata_regs;
++
++      if (plat->init && plat->init(pdev)) {
++              return -ENODEV;
++      }
++
++      /* Deassert the reset bit to enable the interface */
++#if 0
++      __raw_writel(FSL_ATA_CTRL_ATA_RST_B, ata_regs + FSL_ATA_CONTROL);
++#else
++      WRITE_ATA8(FSL_ATA_CTRL_ATA_RST_B, FSL_ATA_CONTROL);
++#endif
++      mb();
++
++      /* Set initial timing and mode */
++      set_ata_bus_timing(XFER_PIO_4, pdev);
++
++      /*
++       * Enable hardware interrupts.
++       */
++#if 0
++      __raw_writel(FSL_ATA_INTR_ATA_INTRQ2, ata_regs + FSL_ATA_INT_EN);
++#else
++      WRITE_ATA8(FSL_ATA_INTR_ATA_INTRQ2, FSL_ATA_INT_EN);
++#endif
++      mb();
++
++      return 0;
++}
++#endif
++
++static struct platform_driver pata_fsl_driver = {
++      .probe          = pata_fsl_probe,
++      .remove         = __devexit_p(pata_fsl_remove),
++#ifdef CONFIG_PM
++      .suspend        = pata_fsl_suspend,
++      .resume         = pata_fsl_resume,
++#endif
++      .driver = {
++              .name           = DRV_NAME,
++              .owner          = THIS_MODULE,
++      },
++};
++
++static int __init pata_fsl_init(void)
++{
++      int ret;
++
++      DPRINTK("ENTER\n");
++      ret = platform_driver_register(&pata_fsl_driver);
++      DPRINTK("EXIT ret=%d\n", ret);
++      return ret;
++}
++
++static void __exit pata_fsl_exit(void)
++{
++      platform_driver_unregister(&pata_fsl_driver);
++}
++module_init(pata_fsl_init);
++module_exit(pata_fsl_exit);
++
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("low-level driver for Freescale ATA");
++MODULE_LICENSE("GPL");
++MODULE_VERSION(DRV_VERSION);
+--- a/include/asm-m68k/pci.h
++++ b/include/asm-m68k/pci.h
+@@ -7,8 +7,14 @@
+ #ifndef _ASM_M68K_PCI_H
+ #define _ASM_M68K_PCI_H
+-#ifdef CONFIG_PCI
+-
++#ifndef CONFIG_PCI
++/*
++ * The PCI address space does equal the physical memory
++ * address space.  The networking and block device layers use
++ * this boolean for bounce buffer decisions.
++ */
++#define PCI_DMA_BUS_IS_PHYS           (1)
++#else
+ #include <asm-generic/pci-dma-compat.h>
+ /*
+--- a/include/linux/fsl_devices.h
++++ b/include/linux/fsl_devices.h
+@@ -126,5 +126,16 @@ struct mpc8xx_pcmcia_ops {
+       int(*voltage_set)(int slot, int vcc, int vpp);
+ };
++struct fsl_ata_platform_data {
++#ifdef        CONFIG_FSL_PATA_USE_DMA
++      int     udma_mask;      /* UDMA modes h/w can handle */
++      int     fifo_alarm;     /* value for fifo_alarm reg */
++      int     max_sg;         /* longest sglist h/w can handle */
++#endif
++      int     (*init)(struct platform_device *pdev);
++      void    (*exit)(void);
++      int     (*get_clk_rate)(void);
++};
++
+ #endif /* _FSL_DEVICE_H_ */
+ #endif /* __KERNEL__ */
diff --git a/target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch b/target/linux/coldfire/patches/014-m5445x_ioremap_xf0000000.patch
new file mode 100644 (file)
index 0000000..11bbbe2
--- /dev/null
@@ -0,0 +1,61 @@
+From ed9d4b88136173a4e17701d9c1162ddfecf902e4 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 19 Nov 2007 15:24:30 -0700
+Subject: [PATCH] Short circuit IOREMAP calls in the 0xF0000000 range.
+
+LTIBName: m5445x-ioremap-xf0000000
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S |    4 ++--
+ arch/m68k/mm/kmap.c       |   14 ++++++++++++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -56,13 +56,13 @@
+  * Setup ACR mappings to provide the following memory map:
+  *   Data
+  *     0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY
+- *     0xFC000000 -> 0xFCFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY
++ *     0xF0000000 -> 0xFFFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY
+  *   Code
+  *     None currently (mapped via TLBs)
+  */
+ #define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
+-#define ACR1_DEFAULT  #0xFC00A040   /* ACR1 default value */
++#define ACR1_DEFAULT  #0xF00FA040   /* ACR1 default value */
+ #define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+ #define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -133,8 +133,18 @@ void __iomem *__ioremap(unsigned long ph
+       }
+ #endif
++#ifdef CONFIG_M54455
++      if (physaddr >= 0xf0000000) {
++              /* short circuit mappings for xf0000000 */
+ #ifdef DEBUG
+-      printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag);
++              printk(KERN_INFO "ioremap: short circuiting 0x%lx mapping\n", physaddr);
++#endif
++              return (void __iomem *)physaddr;
++      }
++#endif
++
++#ifdef DEBUG
++      printk("ioremap: paddr=0x%lx,size=0x%lx(%d) - ", physaddr, size, cacheflag);
+ #endif
+       /*
+        * Mappings have to be aligned
+@@ -153,7 +163,7 @@ void __iomem *__ioremap(unsigned long ph
+       virtaddr = (unsigned long)area->addr;
+       retaddr = virtaddr + offset;
+ #ifdef DEBUG
+-      printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr);
++      printk(" paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx", physaddr, virtaddr, retaddr);
+ #endif
+       /*
diff --git a/target/linux/coldfire/patches/015-m5445x_cau_crypto.patch b/target/linux/coldfire/patches/015-m5445x_cau_crypto.patch
new file mode 100644 (file)
index 0000000..dac62e2
--- /dev/null
@@ -0,0 +1,1937 @@
+From 67e24d4008a39fa02a4748a3abf54410b15262b3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 20 Nov 2007 10:02:16 -0700
+Subject: [PATCH] Add Coldfire CAU crypto support for DES/3DES/AES/MD5/AES.
+
+LTIBName: m5445x-cau-crypto
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/crypto/Kconfig       |   63 ++++
+ drivers/crypto/Makefile      |    5 +
+ drivers/crypto/mcfcau-aes.c  |  311 ++++++++++++++++++++
+ drivers/crypto/mcfcau-des.c  |  437 ++++++++++++++++++++++++++++
+ drivers/crypto/mcfcau-md5.c  |  654 ++++++++++++++++++++++++++++++++++++++++++
+ drivers/crypto/mcfcau-sha1.c |  280 ++++++++++++++++++
+ drivers/crypto/mcfcau.c      |   32 ++
+ drivers/crypto/mcfcau.h      |   98 +++++++
+ 8 files changed, 1880 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/crypto/mcfcau-aes.c
+ create mode 100644 drivers/crypto/mcfcau-des.c
+ create mode 100644 drivers/crypto/mcfcau-md5.c
+ create mode 100644 drivers/crypto/mcfcau-sha1.c
+ create mode 100644 drivers/crypto/mcfcau.c
+ create mode 100644 drivers/crypto/mcfcau.h
+
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -60,6 +60,69 @@ config CRYPTO_DEV_GEODE
+         To compile this driver as a module, choose M here: the module
+         will be called geode-aes.
++config CRYPTO_DEV_MCFCAU
++      bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)"
++      depends on M54455
++      select CRYPTO_ALGAPI
++      help
++        The cryptographic acceleration unit (CAU) is a ColdFire coprocessor
++        implementing a set of specialized operations in hardware. For example, you can
++        find it on MCF54455.
++
++config CRYPTO_DEV_MCFCAU_DES
++      tristate "DES and Triple DES cipher algorithms (MCF54455)"
++      depends on CRYPTO_DEV_MCFCAU
++      select CRYPTO_ALGAPI
++      select CRYPTO_BLKCIPHER
++      help
++        DES cipher algorithm (FIPS 46-2), and Triple DES EDE (FIPS 46-3).
++        
++        Say 'Y' here to use the CAU coprocessor for 
++        the CryptoAPI DES and 3DES alogrithms.
++                
++        To compile this driver as a module, choose M here: the module
++        will be called mcfcau-des.
++
++config CRYPTO_DEV_MCFCAU_AES
++      tristate "AES cipher algorithm (MCF54455)"
++      depends on CRYPTO_DEV_MCFCAU
++      select CRYPTO_ALGAPI
++      select CRYPTO_BLKCIPHER
++      help
++        AES cipher algorithm (FIPS 197).
++
++        Say 'Y' here to use the CAU coprocessor for
++        the CryptoAPI AES alogrithm.
++
++        To compile this driver as a module, choose M here: the module
++        will be called mcfcau-aes.
++
++config CRYPTO_DEV_MCFCAU_MD5
++      tristate "MD5 digest algorithm (MCF54455)"
++      depends on CRYPTO_DEV_MCFCAU
++      select CRYPTO_ALGAPI
++      help
++        MD5 message digest algorithm (RFC1321).
++
++        Say 'Y' here to use the CAU coprocessor for
++        the CryptoAPI MD5 alogrithm.
++
++        To compile this driver as a module, choose M here: the module
++        will be called mcfcau-md5.
++
++config CRYPTO_DEV_MCFCAU_SHA1
++      tristate "SHA1 digest algorithm (MCF54455)"
++      depends on CRYPTO_DEV_MCFCAU
++      select CRYPTO_ALGAPI
++      help
++        SHA-1 secure hash standard (FIPS 180-1/DFIPS 180-2).
++
++        Say 'Y' here to use the CAU coprocessor for
++        the CryptoAPI SHA1 alogrithm.
++
++        To compile this driver as a module, choose M here: the module
++        will be called mcfcau-sha1.
++
+ config ZCRYPT
+       tristate "Support for PCI-attached cryptographic adapters"
+       depends on S390
+--- a/drivers/crypto/Makefile
++++ b/drivers/crypto/Makefile
+@@ -2,3 +2,8 @@ obj-$(CONFIG_CRYPTO_DEV_PADLOCK_AES) += 
+ obj-$(CONFIG_CRYPTO_DEV_PADLOCK_SHA) += padlock-sha.o
+ obj-$(CONFIG_CRYPTO_DEV_GEODE) += geode-aes.o
+ obj-$(CONFIG_CRYPTO_DEV_HIFN_795X) += hifn_795x.o
++obj-$(CONFIG_CRYPTO_DEV_MCFCAU) += mcfcau.o
++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_DES) += mcfcau-des.o
++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_AES) += mcfcau-aes.o
++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_MD5) += mcfcau-md5.o
++obj-$(CONFIG_CRYPTO_DEV_MCFCAU_SHA1) += mcfcau-sha1.o
+--- /dev/null
++++ b/drivers/crypto/mcfcau-aes.c
+@@ -0,0 +1,311 @@
++ /***************************************************************************
++ * mcfcau-aes.c - Implementation of AES Cipher Algorithm
++ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      17 September 2007       Andrey Butok
++ *            Initial Release - developed on 2.6.20 Linux kernel.
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/crypto.h>
++
++/*
++#undef DEBUG
++#define DEBUG 1
++*/
++
++#include "mcfcau.h"
++
++#define MCFCAU_AES_MIN_KEY_SIZE       (16)
++#define MCFCAU_AES_MAX_KEY_SIZE       (32)
++#define MCFCAU_AES_BLOCK_SIZE (16)
++
++#define       MCFCAU_AES_DRIVER_DESC          "AES ColdFire CAU driver"
++#define       MCFCAU_AES_DRIVER_VERSION       "v0.01"
++
++struct mcfcau_aes_ctx {
++      int Nr_1;
++      u32 buf[120];
++      u32 buf_tmp[16];
++};
++
++static u32 mcfcau_rco_tab[10]={ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
++                              0x10000000, 0x20000000, 0x40000000, 0x80000000,
++                              0x1b000000, 0x36000000};
++
++int mcfcau_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
++                     unsigned int key_len)
++{
++      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
++      const u32 * key = (const u32 *)in_key;
++      u32 *flags = &tfm->crt_flags;
++      u32 i;
++      u32* key_sch = (&ctx->buf[0]);
++      u32 * temp_p, * rcon_p;
++      u32 Nx;
++      u32 Nk;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      if (key_len % 8) {
++              *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
++              return -EINVAL;
++      }
++
++      Nk = key_len>>2;
++
++      for(i=0;i<Nk;i++){
++              key_sch[i] = key[i];
++      }
++
++      ctx->Nr_1 = Nk+5;
++
++      /* Key Expansion */
++      temp_p=&key_sch[Nk-1];
++      rcon_p=&mcfcau_rco_tab[0];
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      asm volatile ("move.l   %0, %%a1"::"m"(temp_p):"a1");
++      asm volatile ("move.l   %0, %%a3"::"m"(rcon_p):"a3");
++      asm volatile ("move.l   %0, %%a4"::"m"(key_sch):"a4");
++
++      Nx=(Nk+7)<<2; /* (Nr+1)*Nb */
++
++      for(i=Nk; i<Nx; i++)
++      {
++              /* temp = key_sch[Nk-1] */
++              asm volatile ("cp0ld.l  (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");
++
++              if(i%Nk==0){
++                      asm volatile ("moveq    #8, %%d0":::"d0");
++                      /* CAA=RotWord(temp) */
++                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA):"d0");
++                      /* SubWord(CAA) */
++                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_AESS+MCFCAU_CAA));
++                      /* ACC xor rcon[i/Nk] */
++                      asm volatile ("cp0ld.l  (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a3");
++
++              }else if((Nk>6) && (i%Nk ==4)){
++                      /* SubWord(ACC) */
++                      asm volatile ("cp0ld.l  %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_AESS+MCFCAU_CAA));
++              }
++
++              /* key_sch[i]^=key_sch[i-Nk]; store ACC to key_sch[i] */
++              asm volatile ("cp0ld.l  (%%a4)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CAA):"a4");
++              asm volatile ("cp0st.l  %%d0,(%%a1),#1,%0"      ::"n"(MCFCAU_STR+MCFCAU_CAA));
++      }
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++
++      return 0;
++}
++
++
++/* encrypt a block of text */
++static void mcfcau_aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
++{
++      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
++      const int Nr_1 = ctx->Nr_1;
++
++      u32* key_sch = &(ctx->buf[0]);
++      u32 i;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++      asm("move.l     %0, %%a1"::"m"(in):"a1");
++      asm("move.l     %0, %%a0"::"m"(key_sch):"a0");
++      /* state=in */
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");
++      /* AddRoundKey() */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
++
++      for(i=Nr_1;i>0;i--){
++              /* SubBytes(state) */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3));
++              /* ShiftRows(state) */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR));
++              /* MixColumns(state); AddRoundKey() */
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA0):"a0");
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA1):"a0");
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA2):"a0");
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_AESC+MCFCAU_CA3):"a0");
++      }
++      /* SubBytes(state)*/
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA0));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESS+MCFCAU_CA3));
++      /* ShiftRows(state) */
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESR));
++      /* AddRoundKey() */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
++      /* out = state */
++      asm("move.l     %0, %%a1"               ::"m"(out):"a1");
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1");
++
++      asm("move.l     %%d0,(%%a1)+":::"a1");
++      asm("move.l     %%d1,(%%a1)+":::"a1");
++
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++
++      asm("move.l     %%d0,(%%a1)+":::"a1");
++      asm("move.l     %%d1,(%%a1)+":::"a1");
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++
++/* decrypt a block of text */
++static void mcfcau_aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
++{
++      struct mcfcau_aes_ctx *ctx = crypto_tfm_ctx(tfm);
++      u32* key_sch = &(ctx->buf[0]);
++      u32 i;
++      unsigned long iflags;
++      const int Nr_1 = ctx->Nr_1;
++      key_sch=&key_sch[(Nr_1+2)*4];
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      asm("move.l     %0, %%a1"::"m"(in):"a1");
++      asm("move.l     %0, %%a0"::"m"(key_sch):"a0");
++      /* state=in */
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");
++      /* AddRoundKey() */
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
++
++      for(i=Nr_1;i>0;i--){
++              /* InvShiftRows(state) */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR));
++              /* InvSubBytes(state) */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0));
++              /* InvMixColumns(state); AddRoundKey() */
++              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA3):"a0");
++              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA2):"a0");
++              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA1):"a0");
++              asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_AESIC+MCFCAU_CA0):"a0");
++      }
++      /* InvShiftRows(state) */
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIR));
++      /* InvSubBytes(state)*/
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA3));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_AESIS+MCFCAU_CA0));
++      /* AddRoundKey() */
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA3):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA1):"a0");
++      asm("cp0ld.l    -(%%a0),%%d0,#1,%0"     ::"n"(MCFCAU_XOR+MCFCAU_CA0):"a0");
++      /* out = state */
++      asm("move.l     %0, %%a1"               ::"m"(out):"a1");
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA0):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA1):"d1");
++
++      asm("move.l     %%d0,(%%a1)+":::"a1");
++      asm("move.l     %%d1,(%%a1)+":::"a1");
++
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++
++      asm("move.l     %%d0,(%%a1)+":::"a1");
++      asm("move.l     %%d1,(%%a1)+":::"a1");
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++
++}
++
++
++static struct crypto_alg mcfcau_aes_alg = {
++      .cra_name               =       "aes",
++      .cra_driver_name        =       "aes-mcfcau",
++      .cra_priority           =       MCFCAU_CRA_PRIORITY,
++      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
++      .cra_blocksize          =       MCFCAU_AES_BLOCK_SIZE,
++      .cra_ctxsize            =       sizeof(struct mcfcau_aes_ctx),
++      .cra_alignmask          =       3,
++      .cra_module             =       THIS_MODULE,
++      .cra_list               =       LIST_HEAD_INIT(mcfcau_aes_alg.cra_list),
++      .cra_u                  =       {
++              .cipher = {
++                      .cia_min_keysize        =       MCFCAU_AES_MIN_KEY_SIZE,
++                      .cia_max_keysize        =       MCFCAU_AES_MAX_KEY_SIZE,
++                      .cia_setkey             =       mcfcau_aes_setkey,
++                      .cia_encrypt            =       mcfcau_aes_encrypt,
++                      .cia_decrypt            =       mcfcau_aes_decrypt
++              }
++      }
++};
++
++static int __init mcfcau_aes_init(void)
++{
++      int ret = crypto_register_alg(&mcfcau_aes_alg);
++
++      printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " "
++              MCFCAU_AES_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
++      return ret;
++}
++
++static void __exit mcfcau_aes_fini(void)
++{
++      crypto_unregister_alg(&mcfcau_aes_alg);
++      printk(KERN_INFO MCFCAU_AES_DRIVER_DESC " "
++              MCFCAU_AES_DRIVER_VERSION " unregistered.\n");
++}
++
++module_init(mcfcau_aes_init);
++module_exit(mcfcau_aes_fini);
++
++MODULE_DESCRIPTION(MCFCAU_AES_DRIVER_DESC);
++MODULE_LICENSE("Dual BSD/GPL");
++MODULE_AUTHOR("Andrey Butok");
+--- /dev/null
++++ b/drivers/crypto/mcfcau-des.c
+@@ -0,0 +1,437 @@
++/***************************************************************************
++ * mcfcau-des.c - Implementation of DES & Triple DES EDE Cipher Algorithms
++ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      14 August 2007  Andrey Butok
++ *            Initial Release - developed on 2.6.20 Linux kernel.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/errno.h>
++#include <linux/crypto.h>
++#include <linux/types.h>
++
++/*
++#undef DEBUG
++#define DEBUG 1
++*/
++
++#include "mcfcau.h"
++
++#define MCFCAU_DES_KEY_SIZE           (8)
++#define MCFCAU_DES_EXPKEY_WORDS               (32)
++#define MCFCAU_DES_BLOCK_SIZE         (8)
++
++#define MCFCAU_DES3_EDE_KEY_SIZE      (3 * MCFCAU_DES_KEY_SIZE)
++#define MCFCAU_DES3_EDE_EXPKEY_WORDS  (3 * MCFCAU_DES_EXPKEY_WORDS)
++#define MCFCAU_DES3_EDE_BLOCK_SIZE    (MCFCAU_DES_BLOCK_SIZE)
++
++#define       MCFCAU_DES_DRIVER_DESC          "DES & 3DES ColdFire CAU driver"
++#define       MCFCAU_DES_DRIVER_VERSION       "v0.01"
++
++struct mcfcau_des_ctx {
++      u32 expkey[MCFCAU_DES_EXPKEY_WORDS];
++};
++
++struct mcfcau_des3_ede_ctx {
++      u32 expkey[MCFCAU_DES3_EDE_EXPKEY_WORDS];
++};
++
++/* DES round operations */
++static inline void mcfcau_des_encipher(void)
++{
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSL1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSL1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1));
++}
++
++static inline void mcfcau_des_decipher(void)
++{
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESK+MCFCAU_DC));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_IP+MCFCAU_KSR1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR2));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_KSR1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"::"n"(MCFCAU_DESR+MCFCAU_FP+MCFCAU_KSL1));
++}
++
++
++static int mcfcau_des_setkey(struct crypto_tfm *tfm, const u8 *key_p,
++                    unsigned int keylen)
++{
++      struct mcfcau_des_ctx *dctx = crypto_tfm_ctx(tfm);
++      u32 *flags = &tfm->crt_flags;
++      u32 * key = (u32 *) key_p;
++
++      DBG("\n");
++
++      /*
++      * RFC2451: Weak key checks SHOULD be performed.
++      *
++      * FIPS 74:
++      *   Keys having duals are keys which produce all zeros, all ones, or
++      *   alternating zero-one patterns in the C and D registers after Permuted
++      *   Choice 1 has operated on the key.
++      *
++      */
++      if(*flags & CRYPTO_TFM_REQ_WEAK_KEY){ /* FIPS 74 */
++              if(key[0]<0xE001E00l){
++                      if(key[0]<0x1FE01FE0){
++                              if(key[0]<0x01E001E0){
++                                      if(((key[0]==0x01010101)&&(key[1]==0x01010101))||
++                                              ((key[0]==0x011F011F)&&(key[1]==0x010E010E)) )
++                                              goto WEAK_KEY;
++                              }
++                              else{
++                                      if(((key[0]==0x01E001E0)&&(key[1]==0x01F101F1))||
++                                              ((key[0]==0x01FE01FE)&&(key[1]==0x01FE01FE)) )
++                                              goto WEAK_KEY;
++                              }
++                      }
++                      else{
++                              if(key[0]<0x1F1F1F1F){
++                                      if(((key[0]==0x1FE01FE0)&&(key[1]==0x0EF10EF1))||
++                                              ((key[0]==0x1F011F0l)&&(key[1]==0x0E010E01)) )
++                                              goto WEAK_KEY;
++                              }
++                              else{
++                                      if(((key[0]==0x1F1F1F1F)&&(key[1]==0x0E0E0E0E))||
++                                              ((key[0]==0x1FFE1FFE)&&(key[1]==0x0EFE0EFE)) )
++                                              goto WEAK_KEY;
++                              }
++                      }
++              } else {
++                      if(key[0]<0xFE01FE01){
++                              if(key[0]<0xE0E0E0E0){
++                                      if(((key[0]==0xE001E00l)&&(key[1]==0xF101F101))||
++                                              ((key[0]==0xE01FE01F)&&(key[1]==0xF10EF10E)) )
++                                              goto WEAK_KEY;
++                              }
++                              else{
++                                      if(((key[0]==0xE0E0E0E0)&&(key[1]==0xF1F1F1F1))||
++                                              ((key[0]==0xE0FEE0FE)&&(key[1]==0xF1FEF1FE)) )
++                                              goto WEAK_KEY;
++                              }
++                      }
++                      else{
++                              if(key[0]<0xFEE0FEE0){
++                                      if(((key[0]==0xFE01FE01)&&(key[1]==0xFE01FE01))||
++                                              ((key[0]==0xFE1FFE1F)&&(key[1]==0xFE0EFE0E)) )
++                                              goto WEAK_KEY;
++                              }
++                              else{
++                                      if(((key[0]==0xFEE0FEE0)&&(key[1]==0xFEF1FEF1))||
++                                              ((key[0]==0xFEFEFEFE)&&(key[1]==0xFEFEFEFE)) )
++                                              goto WEAK_KEY;
++                              }
++                      }
++              }
++      }
++      memcpy(dctx->expkey, key_p, keylen);
++      return 0;
++WEAK_KEY:
++      *flags |= CRYPTO_TFM_RES_WEAK_KEY;
++      return -EINVAL;
++}
++
++
++void mcfcau_des_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
++{
++      struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm);
++      u32 * des_key_tmp = ctx->expkey;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      asm("move.l     %0, %%a0"::"m"(src):"a0");
++      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
++
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_encipher();
++
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
++      asm("move.l     %d0,(%a1)+");
++      asm("move.l     %d1,(%a1)");
++
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++
++void mcfcau_des_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
++{
++      struct mcfcau_des_ctx *ctx = crypto_tfm_ctx(tfm);
++      u32 * des_key_tmp = ctx->expkey;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      asm("move.l     %0, %%a0"::"m"(src):"a0");
++      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
++
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_decipher();
++
++      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++      asm("move.l     %d0,(%a1)+");
++      asm("move.l     %d1,(%a1)");
++
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++
++/*
++ * RFC2451:
++ *
++ *   For DES-EDE3, there is no known need to reject weak or
++ *   complementation keys.  Any weakness is obviated by the use of
++ *   multiple keys.
++ *
++ *   However, if the first two or last two independent 64-bit keys are
++ *   equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
++ *   same as DES.  Implementers MUST reject keys that exhibit this
++ *   property.
++ *
++ */
++
++static int mcfcau_des3_ede_setkey(struct crypto_tfm *tfm, const u8 *key_p, unsigned int keylen)
++{
++      const u32 *key = (const u32 *)key_p;
++      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
++      u32 *flags = &tfm->crt_flags;
++
++DBG("\n");
++
++      if (unlikely(!((key[0] ^ key[2]) | (key[1] ^ key[3])) ||
++                   !((key[2] ^ key[4]) | (key[3] ^ key[5]))))
++      {
++              *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
++              return -EINVAL;
++      }
++
++      memcpy(dctx->expkey,key_p,keylen);
++
++      return 0;
++}
++
++static void mcfcau_des3_ede_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
++{
++      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
++      const u32 * des_key_tmp = dctx->expkey;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      /*EK1*/
++      asm("move.l     %0, %%a0"::"m"(src):"a0");
++      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
++
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
++
++      mcfcau_des_encipher();
++
++      /*DK2*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");
++
++      mcfcau_des_decipher();
++
++      /*EK3*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_encipher();
++
++      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++      asm("move.l     %d0,(%a1)+");
++      asm("move.l     %d1,(%a1)");
++
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++static void mcfcau_des3_ede_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
++{
++      struct mcfcau_des3_ede_ctx *dctx = crypto_tfm_ctx(tfm);
++      const u32 * des_key_tmp = dctx->expkey + 6 - 2;
++      unsigned long iflags;
++
++      DBG("\n");
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++
++      /*DK3*/
++      asm("move.l     %0, %%a0"::"m"(src):"a0");
++      asm("move.l     %0, %%a1"::"m"(des_key_tmp):"a1");
++
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0");
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA3));
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_decipher();
++
++      /*EK2*/
++      asm("suba.l     #12,%a1");      /*dec key pointer*/
++
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_encipher();
++
++      /*DK1*/
++      asm("suba.l     #12,%a1");      /*dec key pointer*/
++
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a1");
++      asm("cp0ld.l    (%%a1),%%d0,#1,%0"      ::"n"(MCFCAU_LDR+MCFCAU_CA1));
++
++      mcfcau_des_decipher();
++
++      asm("move.l     %0, %%a1"               ::"m"(dst):"a1");
++      asm("cp0st.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA2):"d0");
++      asm("cp0st.l    %%d0,%%d1,#1,%0"        ::"n"(MCFCAU_STR+MCFCAU_CA3):"d1");
++      asm("move.l     %d0,(%a1)+");
++      asm("move.l     %d1,(%a1)");
++
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++
++static struct crypto_alg mcfcau_des_alg = {
++      .cra_name               =       "des",
++      .cra_driver_name        =       "des-mcfcau",
++      .cra_priority           =       MCFCAU_CRA_PRIORITY,
++      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
++      .cra_blocksize          =       MCFCAU_DES_BLOCK_SIZE,
++      .cra_ctxsize            =       sizeof(struct mcfcau_des_ctx),
++      .cra_module             =       THIS_MODULE,
++      .cra_alignmask          =       3,
++      .cra_list               =       LIST_HEAD_INIT(mcfcau_des_alg.cra_list),
++      .cra_u                  =       { .cipher = {
++      .cia_min_keysize        =       MCFCAU_DES_KEY_SIZE,
++      .cia_max_keysize        =       MCFCAU_DES_KEY_SIZE,
++      .cia_setkey             =       mcfcau_des_setkey,
++      .cia_encrypt            =       mcfcau_des_encrypt,
++      .cia_decrypt            =       mcfcau_des_decrypt } }
++};
++
++static struct crypto_alg mcfcau_des3_ede_alg = {
++      .cra_name               =       "des3_ede",
++      .cra_driver_name        =       "des3_ede-mcfcau",
++      .cra_priority           =       MCFCAU_CRA_PRIORITY,
++      .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
++      .cra_blocksize          =       MCFCAU_DES3_EDE_BLOCK_SIZE,
++      .cra_ctxsize            =       sizeof(struct mcfcau_des3_ede_ctx),
++      .cra_module             =       THIS_MODULE,
++      .cra_alignmask          =       3,
++      .cra_list               =       LIST_HEAD_INIT(mcfcau_des3_ede_alg.cra_list),
++      .cra_u                  =       { .cipher = {
++      .cia_min_keysize        =       MCFCAU_DES3_EDE_KEY_SIZE,
++      .cia_max_keysize        =       MCFCAU_DES3_EDE_KEY_SIZE,
++      .cia_setkey             =       mcfcau_des3_ede_setkey,
++      .cia_encrypt            =       mcfcau_des3_ede_encrypt,
++      .cia_decrypt            =       mcfcau_des3_ede_decrypt } }
++};
++
++MODULE_ALIAS("mcfcau_des3_ede");
++
++static int __init mcfcau_des_init(void)
++{
++      int ret;
++
++      ret = crypto_register_alg(&mcfcau_des_alg);
++      if (ret < 0)
++              goto out;
++
++      ret = crypto_register_alg(&mcfcau_des3_ede_alg);
++      if (ret < 0)
++              crypto_unregister_alg(&mcfcau_des_alg);
++out:
++      printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " "
++              MCFCAU_DES_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
++      return ret;
++}
++
++static void __exit mcfcau_des_exit(void)
++{
++      crypto_unregister_alg(&mcfcau_des3_ede_alg);
++      crypto_unregister_alg(&mcfcau_des_alg);
++
++      printk(KERN_INFO MCFCAU_DES_DRIVER_DESC " "
++              MCFCAU_DES_DRIVER_VERSION " unregistered.\n");
++}
++
++module_init(mcfcau_des_init);
++module_exit(mcfcau_des_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms for ColdFire CAU");
++MODULE_AUTHOR("Andrey Butok");
+--- /dev/null
++++ b/drivers/crypto/mcfcau-md5.c
+@@ -0,0 +1,654 @@
++ /***************************************************************************
++ * mcfcau-md5.c - Implementation of MD5 Message Digest Algorithm (RFC1321)
++ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      30 September 2007       Andrey Butok
++ *            Initial Release - developed on 2.6.20 Linux kernel.
++ */
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/string.h>
++#include <linux/crypto.h>
++#include <linux/types.h>
++#include <asm/byteorder.h>
++
++/*
++#undef DEBUG
++#define DEBUG 1
++*/
++
++#include "mcfcau.h"
++
++
++#define MCFCAU_MD5_DIGEST_SIZE                (16)
++#define MCFCAU_MD5_HMAC_BLOCK_SIZE    (64)
++#define MCFCAU_MD5_BLOCK_WORDS                (16)
++#define MCFCAU_MD5_HASH_WORDS         (4)
++
++#define       MCFCAU_MD5_DRIVER_DESC          "MD5 ColdFire CAU driver"
++#define       MCFCAU_MD5_DRIVER_VERSION       "v0.01"
++
++
++struct mcfcau_md5_ctx {
++      u32 hash[MCFCAU_MD5_HASH_WORDS];
++      u32 block[MCFCAU_MD5_BLOCK_WORDS];
++      u64 byte_count;
++};
++
++u32 mcfcau_md5_t[64]={0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
++                      0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
++                      0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
++                      0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
++                      0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
++                      0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
++                      0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
++                      0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
++                      0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
++                      0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
++                      0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
++                      0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
++                      0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
++                      0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
++                      0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
++                      0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
++
++
++
++static void mcfcau_md5_transform(u32 *hash, u32 const *in)
++{
++      int i;
++      u32 * md5_t_p=&mcfcau_md5_t[0];
++      unsigned long iflags;
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++      asm("move.l     %0, %%a1"::"m"(hash):"a1");
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CAA):"a1");/*a*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a1");/*b*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a1");/*c*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a1");/*d*/
++      asm("move.l     %0, %%a0"::"m"(in):"a0");       /* X[] */
++      asm("move.l     %0, %%a3"::"m"(md5_t_p):"a3");  /* T[] */
++
++      
++      /*  Round 1 */
++      asm("moveq.l    #7, %%d4":::"d4");      /* for rotating by 7 */
++      asm("moveq.l    #12, %%d5":::"d5");     /* for rotating by 12 */
++      asm("moveq.l    #17, %%d6":::"d6");     /* for rotating by 17 */
++      asm("moveq.l    #22, %%d7":::"d7");     /* for rotating by 22 */
++
++      for(i=0; i<4;i++){
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));         /* a+F(b,c,d) */
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");    /* add byterev x[i] */
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");     /* add t[i] */
++              asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));         /* rotate by 7 */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));         /* add b */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));                     /* register to register shift */
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFF));
++              asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++      };
++
++
++      /* Round 2 */
++      asm("moveq.l    #5, %%d4":::"d4");      /* for rotating by 5 */
++      asm("moveq.l    #9, %%d5":::"d5");      /* for rotating by 9 */
++      asm("moveq.l    #14, %%d6":::"d6");     /* for rotating by 14 */
++      asm("moveq.l    #20, %%d7":::"d7");     /* for rotating by 20 */
++
++      asm("lea -60(%%a0),%%a0":::"a0");
++
++      for(i=0; i<2;i++){
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("lea        20(%%a0),%%a0"          :::"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("lea        20(%%a0),%%a0"          :::"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("lea        -44(%%a0),%%a0"         :::"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++              asm("lea        20(%%a0),%%a0"          :::"a0");
++              asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++              asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++      };
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        20(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -44(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        20(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        20(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -44(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        20(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        20(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFG));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -28(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      /* Round 3 */
++      asm("moveq.l    #4, %%d4":::"d4");      /* for rotating by 5 */
++      asm("moveq.l    #11, %%d5":::"d5");     /* for rotating by 9 */
++      asm("moveq.l    #16, %%d6":::"d6");     /* for rotating by 14 */
++      asm("moveq.l    #23, %%d7":::"d7");     /* for rotating by 20 */
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -52(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -52(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        12(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -52(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -8(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      
++      /* Round 4 */
++      asm("moveq.l    #6, %%d4":::"d4");      /* for rotating by 6 */
++      asm("moveq.l    #10, %%d5":::"d5");     /* for rotating by 10 */
++      asm("moveq.l    #15, %%d6":::"d6");     /* for rotating by 15 */
++      asm("moveq.l    #21, %%d7":::"d7");     /* for rotating by 21 */
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d4,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        -36(%%a0),%%a0"         :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d5,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d6,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFI));
++      asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_RADR+MCFCAU_CAA):"a0");
++      asm("lea        28(%%a0),%%a0"          :::"a0");
++      asm("cp0ld.l    (%%a3)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a3");
++      asm("cp0ld.l    %%d7,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA1));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MDS));
++
++      
++      asm("move.l     %0, %%a1"::"m"(hash):"a1");
++
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1");/*a*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a1");/*b*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a1");/*c*/
++      asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a1");/*d*/
++
++      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA3):"a1");/*d*/
++      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA2):"a1");/*c*/
++      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA1):"a1");/*b*/
++      asm("cp0st.l    %%d0,-(%%a1),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CAA):"a1");/*a*/
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++static inline void le32_to_cpu_array(u32 *buf, unsigned int words)
++{
++      while (words--) {
++              __le32_to_cpus(buf);
++              buf++;
++      }
++}
++
++static inline void cpu_to_le32_array(u32 *buf, unsigned int words)
++{
++      while (words--) {
++              __cpu_to_le32s(buf);
++              buf++;
++      }
++}
++
++static void mcfcau_md5_initialization(struct crypto_tfm *tfm)
++{
++      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
++
++      DBG("\n");
++      mctx->hash[0] = 0x67452301;
++      mctx->hash[1] = 0xefcdab89;
++      mctx->hash[2] = 0x98badcfe;
++      mctx->hash[3] = 0x10325476;
++      mctx->byte_count = 0;
++}
++
++static void mcfcau_md5_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len)
++{
++      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
++      const u32 avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f);
++
++      DBG("\n");
++      mctx->byte_count += len;
++
++      if (avail > len) {
++              memcpy((char *)mctx->block + (sizeof(mctx->block) - avail),
++                     data, len);
++      }
++      else {
++              memcpy((char *)mctx->block + (sizeof(mctx->block) - avail), data, avail);
++
++              mcfcau_md5_transform(mctx->hash, mctx->block);
++              data += avail;
++              len -= avail;
++
++              while (len >= sizeof(mctx->block)) {
++                      memcpy(mctx->block, data, sizeof(mctx->block));
++                      mcfcau_md5_transform(mctx->hash, mctx->block);
++                      data += sizeof(mctx->block);
++                      len -= sizeof(mctx->block);
++              }
++
++              memcpy(mctx->block, data, len);
++      }
++}
++
++static void mcfcau_md5_final(struct crypto_tfm *tfm, u8 *out)
++{
++      struct mcfcau_md5_ctx *mctx = crypto_tfm_ctx(tfm);
++      const unsigned int offset = mctx->byte_count & 0x3f;
++      char *p = (char *)mctx->block + offset;
++      int padding = 56 - (offset + 1);
++
++      DBG("\n");
++
++      *p++ = 0x80;
++      if (padding < 0) {
++              memset(p, 0x00, padding + sizeof (u64));
++              mcfcau_md5_transform(mctx->hash, mctx->block);
++              p = (char *)mctx->block;
++              padding = 56;
++      }
++
++      memset(p, 0, padding);
++      mctx->block[14] = mctx->byte_count << 3;
++      mctx->block[15] = mctx->byte_count >> 29;
++      le32_to_cpu_array(&mctx->block[14], 2);
++
++      mcfcau_md5_transform(mctx->hash, mctx->block);
++
++      cpu_to_le32_array(mctx->hash, sizeof(mctx->hash) / sizeof(u32));
++      memcpy(out, mctx->hash, sizeof(mctx->hash));
++      memset(mctx, 0, sizeof(*mctx));
++}
++
++static struct crypto_alg mcfcau_md5_alg = {
++      .cra_name               =       "md5",
++      .cra_driver_name        =       "md5-mcfcau",
++      .cra_priority           =       MCFCAU_CRA_PRIORITY,
++      .cra_flags              =       CRYPTO_ALG_TYPE_DIGEST,
++      .cra_blocksize          =       MCFCAU_MD5_HMAC_BLOCK_SIZE,
++      .cra_ctxsize            =       sizeof(struct mcfcau_md5_ctx),
++      .cra_module             =       THIS_MODULE,
++      .cra_list               =       LIST_HEAD_INIT(mcfcau_md5_alg.cra_list),
++      .cra_u                  =       { .digest = {
++      .dia_digestsize         =       MCFCAU_MD5_DIGEST_SIZE,
++      .dia_init               =       mcfcau_md5_initialization,
++      .dia_update             =       mcfcau_md5_update,
++      .dia_final              =       mcfcau_md5_final } }
++};
++
++static int __init mcfcau_md5_init(void)
++{
++      int ret = crypto_register_alg(&mcfcau_md5_alg);
++      printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " "
++              MCFCAU_MD5_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
++      return ret;
++}
++
++static void __exit mcfcau_md5_exit(void)
++{
++      crypto_unregister_alg(&mcfcau_md5_alg);
++      printk(KERN_INFO MCFCAU_MD5_DRIVER_DESC " "
++              MCFCAU_MD5_DRIVER_VERSION " unregistered.\n");
++}
++
++module_init(mcfcau_md5_init);
++module_exit(mcfcau_md5_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION(MCFCAU_MD5_DRIVER_DESC);
++MODULE_AUTHOR("Andrey Butok");
+--- /dev/null
++++ b/drivers/crypto/mcfcau-sha1.c
+@@ -0,0 +1,280 @@
++ /***************************************************************************
++ * mcfcau-sha1.c - Implementation of SHA1 Secure Hash Algorithm
++ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      15 October 2007 Andrey Butok
++ *            Initial Release - developed on 2.6.20 Linux kernel.
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/mm.h>
++#include <linux/crypto.h>
++#include <linux/types.h>
++
++
++/*
++#undef DEBUG
++#define DEBUG 1
++*/
++
++#include "mcfcau.h"
++
++#define MCFCAU_SHA1_DIGEST_WORDS      (5)
++#define MCFCAU_SHA1_WORKSPACE_WORDS   (80)
++
++#define MCFCAU_SHA1_DIGEST_SIZE               (20)
++#define MCFCAU_SHA1_HMAC_BLOCK_SIZE   (64)
++
++#define       MCFCAU_SHA1_DRIVER_DESC         "SHA1 ColdFire CAU driver"
++#define       MCFCAU_SHA1_DRIVER_VERSION      "v0.01"
++
++struct mcfcau_sha1_ctx {
++        u64 count;
++        u32 state[5];
++        u8 buffer[64];
++};
++
++const static u32 K[4]={0x5A827999L,   /* Rounds  0-19: sqrt(2) * 2^30 */
++                      0x6ED9EBA1L,    /* Rounds 20-39: sqrt(3) * 2^30 */
++                      0x8F1BBCDCL,    /* Rounds 40-59: sqrt(5) * 2^30 */
++                      0xCA62C1D6L};   /* Rounds 60-79: sqrt(10) * 2^30 */
++
++static void noinline mcfcau_sha1_transform(__u32 *digest, const char *in, __u32 *W)
++{
++      int i;
++      u32 * tmp_p;
++      unsigned long iflags;
++
++      /* (a) Devide M(i) into 16 words W */
++      for (i = 0; i < 16; i++)
++              W[i] = ((const u32 *)in)[i];
++
++      /* (b) W[i+16] = S^1(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i]) */
++      tmp_p=&W[16];
++
++      spin_lock_irqsave(&mcfcau_lock, iflags);
++      asm("move.l     %0, %%a0"::"m"(tmp_p):"a0");
++      asm("moveq.l    #1, %%d3":::"d3");
++
++      for (i = 0; i < 64; i++){
++              asm("cp0ld.l    -64(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_LDR+MCFCAU_CA0));
++              asm("cp0ld.l    -56(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
++              asm("cp0ld.l    -32(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
++              asm("cp0ld.l    -12(%%a0),%%d0,#1,%0"   ::"n"(MCFCAU_XOR+MCFCAU_CA0));
++              asm("cp0ld.l    %%d3,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CA0):"d3");
++              asm("cp0st.l    %%d0,(%%a0)+,#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA0));
++      }
++
++      /* (c) */
++      asm("move.l     %0, %%a0"::"m"(digest):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA0):"a0"); /* a */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA1):"a0"); /* b */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA2):"a0"); /* c */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA3):"a0"); /* d */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_LDR+MCFCAU_CA4):"a0"); /* e */
++
++      /* (d) */
++      asm("moveq.l    #5, %%d0":::"d0");
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_MVRA+MCFCAU_CA0));
++      asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ROTL+MCFCAU_CAA)); /*S^5(A)*/
++
++      tmp_p=(u32*)K;
++      asm("move.l     %0, %%a0"::"m"(tmp_p):"a0");
++      asm("move.l     %0, %%a1"::"m"(W):"a1");
++
++      for (i = 0; i < 20; i++) {
++              /* t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; */
++              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFC)); /*f(b,c,d)*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
++              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
++      }
++
++      asm("add.l #4,%%a0"     :::"a0"); /* update K */
++
++      for (; i < 40; i ++) {
++              /* t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; */
++              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
++              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
++      }
++
++      asm("add.l #4,%%a0"     :::"a0"); /* update K */
++
++      for (; i < 60; i ++) {
++              /* t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; */
++              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFM)); /*f(b,c,d)*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
++              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
++      }
++
++      asm("add.l #4,%%a0"     :::"a0"); /* update K */
++
++      for (; i < 80; i ++) {
++              /* t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; */
++              /* e = d; d = c; c = rol32(b, 30); b = a; a = t; */
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_HASH+MCFCAU_HFH)); /*f(b,c,d)*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_ADRA+MCFCAU_CA4)); /*+e*/
++              asm("cp0ld.l    (%%a0),%%d0,#1,%0"      ::"n"(MCFCAU_ADR+MCFCAU_CAA)); /*+K*/
++              asm("cp0ld.l    (%%a1)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CAA):"a1"); /*+W*/
++              asm("cp0ld.l    %%d0,%%d0,#1,%0"        ::"n"(MCFCAU_SHS));
++      }
++
++      /* (e) */
++      asm("move.l     %0, %%a0"::"m"(digest):"a0");
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA0):"a0"); /* +a */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA1):"a0"); /* +b */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA2):"a0"); /* +c */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA3):"a0"); /* +d */
++      asm("cp0ld.l    (%%a0)+,%%d0,#1,%0"     ::"n"(MCFCAU_ADR+MCFCAU_CA4):"a0"); /* +e */
++
++      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA4):"a0");
++      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA3):"a0");
++      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA2):"a0");
++      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA1):"a0");
++      asm("cp0st.l    %%d0,-(%%a0),#1,%0"     ::"n"(MCFCAU_STR+MCFCAU_CA0):"a0");
++      spin_unlock_irqrestore(&mcfcau_lock, iflags);
++}
++
++static void mcfcau_sha1_init(struct crypto_tfm *tfm)
++{
++      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
++      static const struct mcfcau_sha1_ctx initstate = {
++        0,
++        { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 },
++        { 0, }
++      };
++
++      *sctx = initstate;
++}
++
++static void mcfcau_sha1_update(struct crypto_tfm *tfm, const u8 *data,
++                      unsigned int len)
++{
++      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
++      unsigned int partial, done;
++      const u8 *src;
++
++      partial = sctx->count & 0x3f;
++      sctx->count += len;
++      done = 0;
++      src = data;
++
++      if ((partial + len) > 63) {
++              u32 temp[MCFCAU_SHA1_WORKSPACE_WORDS];
++
++              if (partial) {
++                      done = -partial;
++                      memcpy(sctx->buffer + partial, data, done + 64);
++                      src = sctx->buffer;
++              }
++
++              do {
++                      mcfcau_sha1_transform(sctx->state, src, temp);
++                      done += 64;
++                      src = data + done;
++              } while (done + 63 < len);
++
++              memset(temp, 0, sizeof(temp));
++              partial = 0;
++      }
++      memcpy(sctx->buffer + partial, src, len - done);
++}
++
++
++/* Add padding and return the message digest. */
++static void mcfcau_sha1_final(struct crypto_tfm *tfm, u8 *out)
++{
++      struct mcfcau_sha1_ctx *sctx = crypto_tfm_ctx(tfm);
++      u32 *dst = (u32 *)out;
++      u32 i, index, padlen;
++      u64 bits;
++      static const u8 padding[64] = { 0x80, };
++
++      bits = sctx->count << 3;
++
++      /* Pad out to 56 mod 64 */
++      index = sctx->count & 0x3f;
++      padlen = (index < 56) ? (56 - index) : ((64+56) - index);
++      mcfcau_sha1_update(tfm, padding, padlen);
++
++      /* Append length */
++      mcfcau_sha1_update(tfm, (const u8 *)&bits, sizeof(bits));
++
++      /* Store state in digest */
++      for (i = 0; i < 5; i++)
++              dst[i] = sctx->state[i];
++
++
++      /* Wipe context */
++      memset(sctx, 0, sizeof *sctx);
++}
++
++static struct crypto_alg mcfcau_sha1_alg = {
++      .cra_name       =       "sha1",
++      .cra_driver_name=       "sha1-mcfcau",
++      .cra_priority   =       MCFCAU_CRA_PRIORITY,
++      .cra_flags      =       CRYPTO_ALG_TYPE_DIGEST,
++      .cra_blocksize  =       MCFCAU_SHA1_HMAC_BLOCK_SIZE,
++      .cra_ctxsize    =       sizeof(struct mcfcau_sha1_ctx),
++      .cra_module     =       THIS_MODULE,
++      .cra_alignmask  =       3,
++      .cra_list       =       LIST_HEAD_INIT(mcfcau_sha1_alg.cra_list),
++      .cra_u          =       { .digest = {
++      .dia_digestsize =       MCFCAU_SHA1_DIGEST_SIZE,
++      .dia_init       =       mcfcau_sha1_init,
++      .dia_update     =       mcfcau_sha1_update,
++      .dia_final      =       mcfcau_sha1_final } }
++};
++
++static int __init init(void)
++{
++      int ret = crypto_register_alg(&mcfcau_sha1_alg);
++      printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " "
++              MCFCAU_SHA1_DRIVER_VERSION " %s.\n",ret?"failed":"registered");
++      return ret;
++}
++
++static void __exit fini(void)
++{
++      crypto_unregister_alg(&mcfcau_sha1_alg);
++      printk(KERN_INFO MCFCAU_SHA1_DRIVER_DESC " "
++              MCFCAU_SHA1_DRIVER_VERSION " unregistered.\n");
++}
++
++module_init(init);
++module_exit(fini);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION(MCFCAU_SHA1_DRIVER_DESC);
++MODULE_AUTHOR("Andrey Butok");
+--- /dev/null
++++ b/drivers/crypto/mcfcau.c
+@@ -0,0 +1,32 @@
++/***************************************************************************
++ * mcfcau.c - Implementation of DES & Triple DES EDE Cipher Algorithms
++ *                for Freescale ColdFire Cryptographic Acceleration Unit (CAU).
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      28 September 2006       Andrey Butok
++ *            Initial Release - developed on 2.6.20 Linux kernel.
++ */
++#include <linux/module.h>
++
++DEFINE_SPINLOCK(mcfcau_lock);
++EXPORT_SYMBOL(mcfcau_lock);
+--- /dev/null
++++ b/drivers/crypto/mcfcau.h
+@@ -0,0 +1,98 @@
++/***************************************************************************
++ * mcfcau.h - Common header file for Freescale ColdFire
++ *            Cryptographic Acceleration Unit (CAU) drivers.
++ *
++ * Author: Andrey Butok
++ * Copyright Freescale Semiconductor Inc.  2007
++ *
++ * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
++ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
++ * for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software Foundation,
++ * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ ***************************************************************************
++ * Changes:
++ * v0.01      14 August 2007  Andrey Butok
++ */
++
++#ifndef MCFCAU_H
++#define MCFCAU_H
++
++#include <linux/spinlock.h>
++
++/* CAU Registers (CAx) */
++#define MCFCAU_CASR           (0x0)
++#define MCFCAU_CAA            (0x1)
++#define MCFCAU_CA0            (0x2)
++#define MCFCAU_CA1            (0x3)
++#define MCFCAU_CA2            (0x4)
++#define MCFCAU_CA3            (0x5)
++#define MCFCAU_CA4            (0x6)
++#define MCFCAU_CA5            (0x7)
++
++ /* CAU Commands */
++#define MCFCAU_CNOP           (0x000)
++#define MCFCAU_LDR            (0x010)
++#define MCFCAU_STR            (0x020)
++#define MCFCAU_ADR            (0x030)
++#define MCFCAU_RADR           (0x040)
++#define MCFCAU_ADRA           (0x050)
++#define MCFCAU_XOR            (0x060)
++#define MCFCAU_ROTL           (0x070)
++#define MCFCAU_MVRA           (0x080)
++#define MCFCAU_MVAR           (0x090)
++#define MCFCAU_AESS           (0x0A0)
++#define MCFCAU_AESIS          (0x0B0)
++#define MCFCAU_AESC           (0x0C0)
++#define MCFCAU_AESIC          (0x0D0)
++#define MCFCAU_AESR           (0x0E0)
++#define MCFCAU_AESIR          (0x0F0)
++#define MCFCAU_DESR           (0x100)
++#define MCFCAU_DESK           (0x110)
++#define MCFCAU_HASH           (0x120)
++#define MCFCAU_SHS            (0x130)
++#define MCFCAU_MDS            (0x140)
++#define MCFCAU_ILL            (0x1F0)
++
++/* DESR Fields */
++#define MCFCAU_IP             (0x08)  /* initial permutation */
++#define MCFCAU_FP             (0x04)  /* final permutation */
++#define MCFCAU_KSL1           (0x00)  /* key schedule left 1 bit */
++#define MCFCAU_KSL2           (0x01)  /* key schedule left 2 bits */
++#define MCFCAU_KSR1           (0x02)  /* key schedule right 1 bit */
++#define MCFCAU_KSR2           (0x03)  /* key schedule right 2 bits */
++
++/* DESK Field */
++#define MCFCAU_DC             (0x01)  /* decrypt key schedule */
++#define MCFCAU_CP             (0x02)  /* check parity */
++
++/* HASH Functions Codes */
++#define MCFCAU_HFF            (0x0)   /* MD5 F() CA1&CA2 | ~CA1&CA3 */
++#define MCFCAU_HFG            (0x1)   /* MD5 G() CA1&CA3 | CA2&~CA3 */
++#define MCFCAU_HFH            (0x2)   /* MD5 H(), SHA Parity() CA1^CA2^CA3 */
++#define MCFCAU_HFI            (0x3)   /* MD5 I() CA2^(CA1|~CA3) */
++#define MCFCAU_HFC            (0x4)   /* SHA Ch() CA1&CA2 ^ ~CA1&CA3 */
++#define MCFCAU_HFM            (0x5)   /* SHA Maj() CA1&CA2 ^ CA1&CA3 ^ CA2&CA3 */
++
++#define MCFCAU_CRA_PRIORITY   (300)
++
++extern spinlock_t mcfcau_lock;
++
++#ifdef DEBUG
++#define DBG(fmt, args...)     printk( "[%s]  " fmt , __FUNCTION__, ## args)
++#else
++#define DBG(fmt, args...)     do{}while(0)
++#endif
++
++#endif
diff --git a/target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch b/target/linux/coldfire/patches/016-m5445x_usb_initial_port.patch
new file mode 100644 (file)
index 0000000..4321794
--- /dev/null
@@ -0,0 +1,7360 @@
+From 6694c72448723499ce8a8603b4830bbd9d2fa0df Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Tue, 20 Nov 2007 11:06:14 -0700
+Subject: [PATCH] USB: initial port
+
+LTIBName: m5445x-usb-initial-port
+Signed-off-by: Duck <duck@freescale.com>
+---
+ arch/m68k/coldfire/usb.c            |  182 +++
+ arch/m68k/coldfire/usb/Makefile     |   28 +
+ arch/m68k/coldfire/usb/otg_cmn.c    |  106 ++
+ arch/m68k/coldfire/usb/otg_device.c |   89 ++
+ arch/m68k/coldfire/usb/otg_host.c   |   68 +
+ arch/m68k/coldfire/usb/otg_otg.c    |   96 ++
+ arch/m68k/coldfire/usb/xcvr.c       |  156 ++
+ drivers/usb/Kconfig                 |    1 +
+ drivers/usb/Makefile                |    2 +
+ drivers/usb/core/usb.c              |    2 +-
+ drivers/usb/gadget/Kconfig          |   43 +-
+ drivers/usb/gadget/Makefile         |    1 +
+ drivers/usb/gadget/ether.c          |    3 +
+ drivers/usb/gadget/fsl_usb2_udc.h   |  194 +---
+ drivers/usb/gadget/gadget_chips.h   |    7 +
+ drivers/usb/gadget/mcf5445x_udc.c   | 2758 +++++++++++++++++++++++++++++++++++
+ drivers/usb/host/Kconfig            |   21 +-
+ drivers/usb/host/ehci-arc.c         |  431 ++++++
+ drivers/usb/host/ehci-fsl.h         |   28 +-
+ drivers/usb/host/ehci-hcd.c         |    5 +
+ drivers/usb/host/ehci-mem.c         |    9 +-
+ drivers/usb/host/ehci.h             |   22 +
+ drivers/usb/otg/Makefile            |    5 +
+ drivers/usb/otg/fsl_otg.c           | 1515 +++++++++++++++++++
+ drivers/usb/otg/fsl_otg.h           |  139 ++
+ drivers/usb/otg/otg_fsm.c           |  381 +++++
+ drivers/usb/otg/otg_fsm.h           |  170 +++
+ include/asm-m68k/mcf5445x_usb.h     |    3 +-
+ include/linux/fsl_devices.h         |   42 +-
+ include/linux/usb/fsl_usb2.h        |  464 ++++++
+ include/linux/usb/fsl_xcvr.h        |   42 +
+ 31 files changed, 6809 insertions(+), 204 deletions(-)
+ create mode 100644 arch/m68k/coldfire/usb.c
+ create mode 100644 arch/m68k/coldfire/usb/Makefile
+ create mode 100644 arch/m68k/coldfire/usb/otg_cmn.c
+ create mode 100644 arch/m68k/coldfire/usb/otg_device.c
+ create mode 100644 arch/m68k/coldfire/usb/otg_host.c
+ create mode 100644 arch/m68k/coldfire/usb/otg_otg.c
+ create mode 100644 arch/m68k/coldfire/usb/xcvr.c
+ create mode 100644 drivers/usb/gadget/mcf5445x_udc.c
+ create mode 100644 drivers/usb/host/ehci-arc.c
+ create mode 100644 drivers/usb/otg/Makefile
+ create mode 100644 drivers/usb/otg/fsl_otg.c
+ create mode 100644 drivers/usb/otg/fsl_otg.h
+ create mode 100644 drivers/usb/otg/otg_fsm.c
+ create mode 100644 drivers/usb/otg/otg_fsm.h
+ create mode 100644 include/linux/usb/fsl_usb2.h
+ create mode 100644 include/linux/usb/fsl_xcvr.h
+
+--- /dev/null
++++ b/arch/m68k/coldfire/usb.c
+@@ -0,0 +1,182 @@
++/*
++ *
++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ *
++ *    otg_{get,set}_transceiver() are from arm/plat-omap/usb.c.
++ *    which is Copyright (C) 2004 Texas Instruments, Inc.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/usb/otg.h>
++#include <linux/delay.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++
++
++/* The dmamask must be set for EHCI to work */
++static u64 ehci_dmamask = ~(u32) 0;
++
++struct fsl_xcvr_ops *xc_ops[3] = { NULL };
++
++void fsl_usb_enable_clk(void)
++{
++}
++EXPORT_SYMBOL(fsl_usb_enable_clk);
++
++void fsl_usb_disable_clk(void)
++{
++}
++EXPORT_SYMBOL(fsl_usb_disable_clk);
++
++void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops)
++{
++      pr_debug("%s ctrlr=%d\n", __FUNCTION__, xcvr_ops->ctrlr);
++      xc_ops[xcvr_ops->ctrlr] = xcvr_ops;
++
++}
++EXPORT_SYMBOL(fsl_usb_xcvr_register);
++
++void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr)
++{
++      pr_debug("%s ctrlr=%d\n", __FUNCTION__, ctrlr);
++      xc_ops[ctrlr] = NULL;
++}
++EXPORT_SYMBOL(fsl_usb_xcvr_unregister);
++
++/*!
++ * Register an instance of a USB host platform device.
++ *
++ * @param     res:    resource pointer
++ * @param       n_res:        number of resources
++ * @param       config: config pointer
++ *
++ * @return      newly-registered platform_device
++ *
++ * DDD fix this comment:
++ * The USB controller supports 3 host interfaces, and the
++ * kernel can be configured to support some number of them.
++ * Each supported host interface is registered as an instance
++ * of the "fsl-ehci" device.  Call this function multiple times
++ * to register each host interface.
++ */
++static int instance_id;
++struct platform_device *host_pdev_register(struct resource *res, int n_res,
++                                        struct fsl_usb2_platform_data *config)
++{
++      struct platform_device *pdev;
++
++      pr_debug("register host res=0x%p, size=%d\n", res, n_res);
++
++      pdev = platform_device_register_simple("fsl-ehci",
++                                             instance_id, res, n_res);
++      if (IS_ERR(pdev)) {
++              printk(KERN_ERR "usb: can't register %s Host, %ld\n",
++                     config->name, PTR_ERR(pdev));
++              return NULL;
++      }
++
++      pdev->dev.coherent_dma_mask = 0xffffffff;
++      pdev->dev.dma_mask = &ehci_dmamask;
++
++      /*
++       * platform_device_add_data() makes a copy of
++       * the platform_data passed in.  That makes it
++       * impossible to share the same config struct for
++       * all OTG devices (host,gadget,otg).  So, just
++       * set the platform_data pointer ourselves.
++       */
++      pdev->dev.platform_data = config;
++
++      printk(KERN_INFO "usb: %s Host registered\n", config->name);
++      pr_debug("pdev=0x%p  dev=0x%p  resources=0x%p  pdata=0x%p\n",
++               pdev, &pdev->dev, pdev->resource, pdev->dev.platform_data);
++
++      instance_id++;
++
++      return pdev;
++}
++
++
++int fsl_usb_mem_init(struct platform_device *pdev)
++{
++      struct resource *res;
++      struct fsl_usb2_platform_data *pdata;
++
++      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
++
++      pr_debug("%s: pdev=0x%p  pdata=0x%p\n", __FUNCTION__, pdev, pdata);
++
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
++              dev_err(&pdev->dev, "no MEM resource.\n");
++              return -ENODEV;
++      }
++
++      pdata->r_start = res->start;
++      pdata->r_len = res->end - res->start + 1;
++      pr_debug("%s: MEM resource start=0x%x  len=0x%x\n", pdata->name,
++               res->start, pdata->r_len);
++
++      if (!request_mem_region(pdata->r_start, pdata->r_len, "OTG")) {
++              dev_err(&pdev->dev, "request_mem_region failed\n");
++              return -EBUSY;
++      }
++      pdata->regs = ioremap(pdata->r_start, pdata->r_len);
++      pr_debug("ioremapped to 0x%p\n", pdata->regs);
++
++      if (pdata->regs == NULL) {
++              dev_err(&pdev->dev, "ioremap failed\n");
++              release_mem_region(pdata->r_start, pdata->r_len);
++              return -EFAULT;
++      }
++
++      pr_debug("%s: success\n", __FUNCTION__);
++      return 0;
++}
++
++
++#if defined(CONFIG_USB_OTG)
++static struct otg_transceiver *xceiv;
++
++/**
++ * otg_get_transceiver - find the (single) OTG transceiver driver
++ *
++ * Returns the transceiver driver, after getting a refcount to it; or
++ * null if there is no such transceiver.  The caller is responsible for
++ * releasing that count.
++ */
++struct otg_transceiver *otg_get_transceiver(void)
++{
++      pr_debug("%s xceiv=0x%p\n", __FUNCTION__, xceiv);
++      if (xceiv)
++              get_device(xceiv->dev);
++      return xceiv;
++}
++EXPORT_SYMBOL(otg_get_transceiver);
++
++int otg_set_transceiver(struct otg_transceiver *x)
++{
++      pr_debug("%s xceiv=0x%p  x=0x%p\n", __FUNCTION__, xceiv, x);
++      if (xceiv && x)
++              return -EBUSY;
++      xceiv = x;
++      return 0;
++}
++EXPORT_SYMBOL(otg_set_transceiver);
++#endif
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/Makefile
+@@ -0,0 +1,28 @@
++#
++# Makefile for the linux kernel.
++#
++
++# Object file lists.
++
++ifneq ($(CONFIG_USB_EHCI_HCD),)
++      obj-y   += otg_host.o
++endif
++
++ifneq ($(CONFIG_USB_GADGET_MCF5445X),)
++      obj-y   += otg_device.o
++endif
++
++ifneq ($(strip $(CONFIG_USB_GADGET_MCF5445X) $(CONFIG_USB_EHCI_HCD)),)
++      obj-y   += otg_cmn.o
++endif
++
++ifneq ($(CONFIG_USB_OTG),)
++      obj-y   += otg_otg.o
++endif
++
++
++# USB Transceiver driver:
++ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
++      obj-y   += xcvr.o
++endif
++
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/otg_cmn.c
+@@ -0,0 +1,106 @@
++/*
++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/err.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++
++#include <asm/system.h>
++#include <asm/coldfire.h>
++
++extern void fsl_usb_enable_clk(void);
++extern void fsl_usb_disable_clk(void);
++extern int fsl_usb_mem_init(struct platform_device *pdev);
++
++extern struct fsl_xcvr_ops *xc_ops[];
++
++static int otg_used;
++
++int usbotg_init(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata;
++      struct fsl_xcvr_ops *xops = xc_ops[USB_CTRLR_OTG];
++      int rc;
++
++      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
++
++      pr_debug("%s: pdev=0x%p  pdata=0x%p\n", __FUNCTION__, pdev, pdata);
++
++      if (!xops) {
++              printk(KERN_ERR "OTG transceiver ops missing\n");
++              return -EINVAL;
++      }
++      pdata->xcvr_ops = xops;
++      pdata->xcvr_type = xops->xcvr_type;
++
++      if (!otg_used) {
++              /* request_mem_region and ioremap registers */
++              rc = fsl_usb_mem_init(pdev);
++              if (rc)
++                      return rc;
++
++              fsl_usb_enable_clk();
++
++              if (xops->init)
++                      xops->init(pdev);
++      }
++
++      otg_used++;
++      pr_debug("%s: success\n", __FUNCTION__);
++      return 0;
++}
++
++void usbotg_uninit(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata;
++      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
++
++      pr_debug("%s\n", __FUNCTION__);
++
++      otg_used--;
++      if (!otg_used) {
++              if (pdata->xcvr_ops && pdata->xcvr_ops->uninit)
++                      pdata->xcvr_ops->uninit(pdev);
++
++              iounmap(pdata->regs);
++              release_mem_region(pdata->r_start, pdata->r_len);
++
++              pdata->regs = NULL;
++              pdata->r_start = pdata->r_len = 0;
++
++              fsl_usb_disable_clk();
++      }
++}
++
++struct fsl_usb2_platform_data mxc_otg_config = {
++      .name            = "OTG",
++      .platform_init   = usbotg_init,
++      .platform_uninit = usbotg_uninit,
++      .es              = 1,
++      .big_endian_mmio = 1,
++      .big_endian_desc = 1,
++      .le_setup_buf    = 1,
++      .does_otg        = 1,
++      .power_budget    = 500,         /* 500 mA max power */
++      .max_ep_nr       = 4,           /* DDD read from a register ? */
++      .phy_mode        = FSL_USB2_PHY_ULPI, /* DDD redundant with xcvr_type */
++};
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/otg_device.c
+@@ -0,0 +1,89 @@
++/*
++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/usb/otg.h>
++#include <linux/delay.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++
++#include <asm/system.h>
++#include <asm/coldfire.h>
++
++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
++#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
++#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
++
++extern int usbotg_init(struct platform_device *pdev);
++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
++extern struct fsl_usb2_platform_data mxc_otg_config;
++
++struct platform_device otg_udc_device;
++
++/*!
++ * OTG Gadget device
++ */
++
++static void usb_release(struct device *dev)
++{
++      /* normally not freed */
++}
++
++static u64 udc_dmamask = ~(u32) 0;
++static struct resource otg_udc_resources[] = {
++      [0] = {
++              .start = (u32) (&USB_OTGREGS_BASE),
++              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = INT_USB,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++
++struct platform_device otg_udc_device = {
++      .name = "fsl-usb2-udc",
++      .id   = -1,
++      .dev  = {
++              .release           = usb_release,
++              .dma_mask          = &udc_dmamask,
++              .coherent_dma_mask = 0xffffffff,
++              .platform_data     = &mxc_otg_config,
++              },
++      .resource = otg_udc_resources,
++      .num_resources = ARRAY_SIZE(otg_udc_resources),
++};
++
++static int __init udc_init(void)
++{
++      int rc __attribute((unused));
++
++      rc = platform_device_register(&otg_udc_device);
++      if (rc)
++              printk(KERN_ERR "usb: can't register OTG Gadget, rc=%d\n", rc);
++      else
++              printk(KERN_INFO "usb: OTG Gadget registered\n");
++      return rc;
++}
++
++subsys_initcall(udc_init);
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/otg_host.c
+@@ -0,0 +1,68 @@
++/*
++ * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++
++#include <asm/system.h>
++#include <asm/mcfsim.h>
++
++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
++#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
++#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
++
++struct platform_device *otg_host_device;
++
++extern struct platform_device *host_pdev_register(struct resource *res,
++                                                int n_res,
++                                                struct fsl_usb2_platform_data
++                                                *config);
++
++extern int usbotg_init(struct platform_device *pdev);
++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
++extern struct fsl_usb2_platform_data mxc_otg_config;
++
++/*!
++ * OTG host config
++ */
++static struct resource otg_host_resources[] = {
++      [0] = {
++              .start = (u32) (&USB_OTGREGS_BASE),
++              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = INT_USB,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++static int __init otg_host_init(void)
++{
++      otg_host_device = host_pdev_register(otg_host_resources,
++                                           ARRAY_SIZE(otg_host_resources),
++                                           &mxc_otg_config);
++      return 0;
++}
++
++subsys_initcall(otg_host_init);
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/otg_otg.c
+@@ -0,0 +1,96 @@
++/*
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/*
++ * platform_device registration for ULPI OTG device
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/fsl_devices.h>
++
++#include <asm/mcfsim.h>
++
++#define USB_OTGREGS_BASE MCF_REG32(0xFC0B0000)
++#define INT_USB               (64 + 64 + 47)  /* INTC1:47 16.2.9.1 */
++#define INT_UOCSR     (64 + 64 + 53)  /* INTC1:53 16.2.9.1 */
++
++extern int usbotg_init(struct platform_device *pdev);
++extern void usbotg_uninit(struct fsl_usb2_platform_data *pdata);
++extern struct fsl_usb2_platform_data mxc_otg_config;
++
++static void otg_otg_release(struct device *dev)
++{
++      /* normally not freed */
++}
++
++/* *INDENT-OFF* */
++static struct resource otg_otg_resources[] = {
++      [0] = {
++              .start = (u32) (&USB_OTGREGS_BASE),
++              .end   = (u32) (&USB_OTGREGS_BASE + 0x1ff),
++              .flags = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start = INT_USB,
++              .flags = IORESOURCE_IRQ,
++      },
++};
++
++/*!
++ * OTG device
++ */
++static u64 otg_otg_dmamask = ~(u32) 0;
++static struct platform_device otg_otg_device = {
++      .name = "fsl-usb2-otg",
++      .id   = -1,
++      .dev  = {
++              .release           = otg_otg_release,
++              .dma_mask          = &otg_otg_dmamask,
++              .coherent_dma_mask = 0xffffffff,
++              .platform_data     = &mxc_otg_config,
++      },
++      .resource = otg_otg_resources,
++      .num_resources = ARRAY_SIZE(otg_otg_resources),
++};
++/* *INDENT-ON* */
++
++static int __init mx31_otg_otg_init(void)
++{
++      int rc = 0;
++
++      pr_debug("register OTG otg res=0x%p, size=%d\n",
++               otg_otg_device.resource, otg_otg_device.num_resources);
++
++      rc = platform_device_register(&otg_otg_device);
++      if (rc) {
++              pr_debug("can't register ULPI OTG dvc, %d\n", rc);
++      } else {
++              printk(KERN_INFO "usb: OTG ULPI transceiver registered\n");
++              pr_debug("otg_otg_device=0x%p  resources=0x%p.\n",
++                       &otg_otg_device, otg_otg_device.resource);
++      }
++
++      return rc;
++}
++
++subsys_initcall(mx31_otg_otg_init);
++
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("ULPI OTG device registration");
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/arch/m68k/coldfire/usb/xcvr.c
+@@ -0,0 +1,156 @@
++/*
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/err.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++#include <linux/usb/fsl_usb2.h>
++
++#include <asm/mcfsim.h>
++
++extern void fsl_usb_xcvr_register(struct fsl_xcvr_ops *xcvr_ops);
++extern void fsl_usb_xcvr_unregister(enum fsl_usb_ctrlr ctrlr);
++
++#define MCF_SCM_BCR           MCF_REG32(0xFC040024)
++#define MCF_SCM_BCR_GBR               (1 << 9)        /* global bursts for read */
++#define MCF_SCM_BCR_GBW               (1 << 8)        /* global bursts for write */
++#define MCF_SCM_BCR_SBE_ALL   (0xff << 0)     /* slave burst enable */
++
++
++#ifdef ULPI_DEBUG
++void print_ulpi_regs(void)
++{
++      pr_debug("MCF_SCM_BCR=0x%08lx  MCF_CCM_MISCCR=0x%08x  "
++               "MCF_GPIO_PAR_DMA=0x%08x  MCF_GPIO_PAR_USB=08%08x  "
++               "MCF_GPIO_PAR_FEC=08%08x\n",
++               MCF_SCM_BCR, MCF_CCM_MISCCR, MCF_GPIO_PAR_DMA,
++               MCF_GPIO_PAR_USB, MCF_GPIO_PAR_FEC);
++}
++EXPORT_SYMBOL(print_ulpi_regs);
++#endif
++
++
++static void xcvr_init(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      struct fsl_xcvr_ops *this = pdata->xcvr_ops;
++      struct fsl_usb_host_regs *regs = pdata->regs;
++
++      pr_debug("%s: ctrlr=%d  pdata=0x%p  regs=0x%p\n", __FUNCTION__,
++               this->ctrlr, pdata, pdata->regs);
++
++      /* enable USB read, write and slave bursts */
++      MCF_SCM_BCR = MCF_SCM_BCR_GBR | MCF_SCM_BCR_GBW | MCF_SCM_BCR_SBE_ALL;
++
++      /* Use external clock source if PLL isn't a multiple of 60MHz */
++      MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_USBSRC;
++
++      /* Initialize the USB Clock: use USB input clock */
++      MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA & MCF_GPIO_PAR_DMA_DREQ1_MASK) |
++                         MCF_GPIO_PAR_DMA_DREQ1_USB_CLKIN;
++
++      switch (this->xcvr_type) {
++      case PORTSCX_PTS_ULPI:
++              /* Enable the required ULPI signals */
++              MCF_GPIO_PAR_DMA = (MCF_GPIO_PAR_DMA &
++                                  MCF_GPIO_PAR_DMA_DACK1_MASK) |
++                                  MCF_GPIO_PAR_DMA_DACK1_ULPI_DIR;
++
++              MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_ULPI_NXT |
++                                 MCF_GPIO_PAR_USB_VBUSOC_ULPI_STP;
++
++              MCF_GPIO_PAR_FEC = (MCF_GPIO_PAR_FEC &
++                                  MCF_GPIO_PAR_FEC_FEC0_MASK) |
++                                  MCF_GPIO_PAR_FEC_FEC0_RMII_ULPI;
++              break;
++      case PORTSCX_PTS_ONCHIP:
++              /* Enable VBUS_EN and VBUS_OC signals */
++              MCF_GPIO_PAR_USB = MCF_GPIO_PAR_USB_VBUSEN_VBUSEN |
++                                 MCF_GPIO_PAR_USB_VBUSOC_VBUSOC;
++
++              /* Setup USB_VBUS_OC signal to be active-low */
++              MCF_CCM_MISCCR |= MCF_CCM_MISCCR_USBOC;
++
++              break;
++      }
++
++      pr_debug("&regs->portsc1=0x%p  old portsc1=0x%x \n", &regs->portsc1,
++               regs->portsc1);
++
++      regs->portsc1 &= ~PORTSCX_PTS_MASK;
++      regs->portsc1 |= this->xcvr_type;
++
++      /*
++       * need to reset the controller here so that the ID pin
++       * is correctly detected.
++       */
++      regs->usbcmd |= USB_CMD_CTRL_RESET;
++
++      /*
++       * allow controller to reset, and leave time for
++       * the ULPI transceiver to reset too.
++       */
++      mdelay(10);
++
++      pr_debug("DDD %s: done.  portsc1=0x%x\n", __FUNCTION__, regs->portsc1);
++}
++
++static void xcvr_uninit(struct platform_device *pdev)
++{
++      pr_debug("%s: pdev=0x%p\n", __FUNCTION__, pdev);
++}
++
++
++struct fsl_xcvr_ops xcvr_ops_otg = {
++      .ctrlr          = USB_CTRLR_OTG,
++      .init           = xcvr_init,
++      .uninit         = xcvr_uninit,
++
++#ifdef CONFIG_USB_M5445X_ULPI
++      .xcvr_type      = PORTSCX_PTS_ULPI,
++#elif defined CONFIG_USB_M5445X_FSLS
++      .xcvr_type      = PORTSCX_PTS_ONCHIP,
++#else
++#error "Invalid USB transceiver selection."
++#endif
++};
++
++static int __init usb_xcvr_init(void)
++{
++      pr_debug("%s\n", __FUNCTION__);
++
++      fsl_usb_xcvr_register(&xcvr_ops_otg);
++
++      pr_debug("%s done\n", __FUNCTION__);
++      return 0;
++}
++
++static void __exit usb_xcvr_exit(void)
++{
++      fsl_usb_xcvr_unregister(USB_CTRLR_OTG);
++}
++
++module_init(usb_xcvr_init);
++module_exit(usb_xcvr_exit);
++
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("External ULPI xcvr driver");
++MODULE_LICENSE("GPL");
++
+--- a/drivers/usb/Kconfig
++++ b/drivers/usb/Kconfig
+@@ -55,6 +55,7 @@ config USB_ARCH_HAS_EHCI
+       default y if PPC_83xx
+       default y if SOC_AU1200
+       default y if ARCH_IXP4XX
++      default y if M54455
+       default PCI
+ # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
+--- a/drivers/usb/Makefile
++++ b/drivers/usb/Makefile
+@@ -32,3 +32,5 @@ obj-$(CONFIG_USB)            += misc/
+ obj-$(CONFIG_USB_ATM)         += atm/
+ obj-$(CONFIG_USB_SPEEDTOUCH)  += atm/
++
++obj-$(CONFIG_USB_OTG)         += otg/
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -52,7 +52,7 @@ static int nousb;    /* Disable USB when bu
+ struct workqueue_struct *ksuspend_usb_wq;
+ #ifdef        CONFIG_USB_SUSPEND
+-static int usb_autosuspend_delay = 2;         /* Default delay value,
++static int usb_autosuspend_delay = -1;                /* Default delay value,
+                                                * in seconds */
+ module_param_named(autosuspend, usb_autosuspend_delay, int, 0644);
+ MODULE_PARM_DESC(autosuspend, "default autosuspend delay");
+--- a/drivers/usb/gadget/Kconfig
++++ b/drivers/usb/gadget/Kconfig
+@@ -231,6 +231,26 @@ config SUPERH_BUILT_IN_M66592
+          However, this problem is improved if change a value of
+          NET_IP_ALIGN to 4.
++config USB_GADGET_MCF5445X
++      boolean "MCF5445X USB Device Controller"
++      depends on M54455 && USB_M5445X_ULPI
++      select USB_GADGET_DUALSPEED
++      help
++         Freescale's MCF5445X processors include
++         an integrated device controller (as part of the OTG module).
++         It has four programmable, bidirectional endpoints,
++         including endpoint 0.
++
++         Say "y" to link the driver statically, or "m" to build a
++         dynamically linked module called "mcf5445_udc" and force all
++         gadget drivers to also be dynamically linked.
++
++config USB_MCF5445X
++      tristate
++      depends on USB_GADGET_MCF5445X
++      default USB_GADGET
++      select USB_GADGET_SELECTED
++
+ config USB_GADGET_GOKU
+       boolean "Toshiba TC86C001 'Goku-S'"
+       depends on PCI
+@@ -285,17 +305,6 @@ config USB_OMAP
+       default USB_GADGET
+       select USB_GADGET_SELECTED
+-config USB_OTG
+-      boolean "OTG Support"
+-      depends on USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD
+-      help
+-         The most notable feature of USB OTG is support for a
+-         "Dual-Role" device, which can act as either a device
+-         or a host.  The initial role choice can be changed
+-         later, when two dual-role devices talk to each other.
+-
+-         Select this only if your OMAP board has a Mini-AB connector.
+-
+ config USB_GADGET_S3C2410
+       boolean "S3C2410 USB Device Controller"
+       depends on ARCH_S3C2410
+@@ -369,6 +378,18 @@ config USB_DUMMY_HCD
+ endchoice
++config USB_OTG
++      boolean "OTG Support"
++      depends on (USB_GADGET_OMAP && ARCH_OMAP_OTG && USB_OHCI_HCD) || \
++                 (USB_GADGET_MCF5445X && USB_M5445X_ULPI)
++      help
++         The most notable feature of USB OTG is support for a
++         "Dual-Role" device, which can act as either a device
++         or a host.  The initial role choice can be changed
++         later, when two dual-role devices talk to each other.
++
++         Select this only if your OMAP board has a Mini-AB connector.
++
+ config USB_GADGET_DUALSPEED
+       bool
+       depends on USB_GADGET
+--- a/drivers/usb/gadget/Makefile
++++ b/drivers/usb/gadget/Makefile
+@@ -17,6 +17,7 @@ obj-$(CONFIG_USB_AT91)               += at91_udc.o
+ obj-$(CONFIG_USB_ATMEL_USBA)  += atmel_usba_udc.o
+ obj-$(CONFIG_USB_FSL_USB2)    += fsl_usb2_udc.o
+ obj-$(CONFIG_USB_M66592)      += m66592-udc.o
++obj-$(CONFIG_USB_MCF5445X)    += mcf5445x_udc.o
+ #
+ # USB gadget drivers
+--- a/drivers/usb/gadget/ether.c
++++ b/drivers/usb/gadget/ether.c
+@@ -287,6 +287,9 @@ MODULE_PARM_DESC(host_addr, "Host Ethern
+ #define       DEV_CONFIG_CDC
+ #endif
++#ifdef CONFIG_USB_GADGET_MCF5445X
++#define DEV_CONFIG_CDC
++#endif
+ /*-------------------------------------------------------------------------*/
+--- a/drivers/usb/gadget/fsl_usb2_udc.h
++++ b/drivers/usb/gadget/fsl_usb2_udc.h
+@@ -83,16 +83,6 @@ struct usb_dr_host {
+       u32 endptctrl[6];       /* Endpoint Control Registers */
+ };
+- /* non-EHCI USB system interface registers (Big Endian) */
+-struct usb_sys_interface {
+-      u32 snoop1;
+-      u32 snoop2;
+-      u32 age_cnt_thresh;     /* Age Count Threshold Register */
+-      u32 pri_ctrl;           /* Priority Control Register */
+-      u32 si_ctrl;            /* System Interface Control Register */
+-      u8 res[236];
+-      u32 control;            /* General Purpose Control Register */
+-};
+ /* ep0 transfer state */
+ #define WAIT_FOR_SETUP          0
+@@ -101,10 +91,6 @@ struct usb_sys_interface {
+ #define WAIT_FOR_OUT_STATUS     3
+ #define DATA_STATE_RECV         4
+-/* Device Controller Capability Parameter register */
+-#define DCCPARAMS_DC                          0x00000080
+-#define DCCPARAMS_DEN_MASK                    0x0000001f
+-
+ /* Frame Index Register Bit Masks */
+ #define       USB_FRINDEX_MASKS                       0x3fff
+ /* USB CMD  Register Bit Masks */
+@@ -180,172 +166,6 @@ struct usb_sys_interface {
+ /* endpoint list address bit masks */
+ #define USB_EP_LIST_ADDRESS_MASK              0xfffff800
+-/* PORTSCX  Register Bit Masks */
+-#define  PORTSCX_CURRENT_CONNECT_STATUS       0x00000001
+-#define  PORTSCX_CONNECT_STATUS_CHANGE        0x00000002
+-#define  PORTSCX_PORT_ENABLE                  0x00000004
+-#define  PORTSCX_PORT_EN_DIS_CHANGE           0x00000008
+-#define  PORTSCX_OVER_CURRENT_ACT             0x00000010
+-#define  PORTSCX_OVER_CURRENT_CHG             0x00000020
+-#define  PORTSCX_PORT_FORCE_RESUME            0x00000040
+-#define  PORTSCX_PORT_SUSPEND                 0x00000080
+-#define  PORTSCX_PORT_RESET                   0x00000100
+-#define  PORTSCX_LINE_STATUS_BITS             0x00000C00
+-#define  PORTSCX_PORT_POWER                   0x00001000
+-#define  PORTSCX_PORT_INDICTOR_CTRL           0x0000C000
+-#define  PORTSCX_PORT_TEST_CTRL               0x000F0000
+-#define  PORTSCX_WAKE_ON_CONNECT_EN           0x00100000
+-#define  PORTSCX_WAKE_ON_CONNECT_DIS          0x00200000
+-#define  PORTSCX_WAKE_ON_OVER_CURRENT         0x00400000
+-#define  PORTSCX_PHY_LOW_POWER_SPD            0x00800000
+-#define  PORTSCX_PORT_FORCE_FULL_SPEED        0x01000000
+-#define  PORTSCX_PORT_SPEED_MASK              0x0C000000
+-#define  PORTSCX_PORT_WIDTH                   0x10000000
+-#define  PORTSCX_PHY_TYPE_SEL                 0xC0000000
+-
+-/* bit 11-10 are line status */
+-#define  PORTSCX_LINE_STATUS_SE0              0x00000000
+-#define  PORTSCX_LINE_STATUS_JSTATE           0x00000400
+-#define  PORTSCX_LINE_STATUS_KSTATE           0x00000800
+-#define  PORTSCX_LINE_STATUS_UNDEF            0x00000C00
+-#define  PORTSCX_LINE_STATUS_BIT_POS          10
+-
+-/* bit 15-14 are port indicator control */
+-#define  PORTSCX_PIC_OFF                      0x00000000
+-#define  PORTSCX_PIC_AMBER                    0x00004000
+-#define  PORTSCX_PIC_GREEN                    0x00008000
+-#define  PORTSCX_PIC_UNDEF                    0x0000C000
+-#define  PORTSCX_PIC_BIT_POS                  14
+-
+-/* bit 19-16 are port test control */
+-#define  PORTSCX_PTC_DISABLE                  0x00000000
+-#define  PORTSCX_PTC_JSTATE                   0x00010000
+-#define  PORTSCX_PTC_KSTATE                   0x00020000
+-#define  PORTSCX_PTC_SEQNAK                   0x00030000
+-#define  PORTSCX_PTC_PACKET                   0x00040000
+-#define  PORTSCX_PTC_FORCE_EN                 0x00050000
+-#define  PORTSCX_PTC_BIT_POS                  16
+-
+-/* bit 27-26 are port speed */
+-#define  PORTSCX_PORT_SPEED_FULL              0x00000000
+-#define  PORTSCX_PORT_SPEED_LOW               0x04000000
+-#define  PORTSCX_PORT_SPEED_HIGH              0x08000000
+-#define  PORTSCX_PORT_SPEED_UNDEF             0x0C000000
+-#define  PORTSCX_SPEED_BIT_POS                26
+-
+-/* bit 28 is parallel transceiver width for UTMI interface */
+-#define  PORTSCX_PTW                          0x10000000
+-#define  PORTSCX_PTW_8BIT                     0x00000000
+-#define  PORTSCX_PTW_16BIT                    0x10000000
+-
+-/* bit 31-30 are port transceiver select */
+-#define  PORTSCX_PTS_UTMI                     0x00000000
+-#define  PORTSCX_PTS_ULPI                     0x80000000
+-#define  PORTSCX_PTS_FSLS                     0xC0000000
+-#define  PORTSCX_PTS_BIT_POS                  30
+-
+-/* otgsc Register Bit Masks */
+-#define  OTGSC_CTRL_VUSB_DISCHARGE            0x00000001
+-#define  OTGSC_CTRL_VUSB_CHARGE               0x00000002
+-#define  OTGSC_CTRL_OTG_TERM                  0x00000008
+-#define  OTGSC_CTRL_DATA_PULSING              0x00000010
+-#define  OTGSC_STS_USB_ID                     0x00000100
+-#define  OTGSC_STS_A_VBUS_VALID               0x00000200
+-#define  OTGSC_STS_A_SESSION_VALID            0x00000400
+-#define  OTGSC_STS_B_SESSION_VALID            0x00000800
+-#define  OTGSC_STS_B_SESSION_END              0x00001000
+-#define  OTGSC_STS_1MS_TOGGLE                 0x00002000
+-#define  OTGSC_STS_DATA_PULSING               0x00004000
+-#define  OTGSC_INTSTS_USB_ID                  0x00010000
+-#define  OTGSC_INTSTS_A_VBUS_VALID            0x00020000
+-#define  OTGSC_INTSTS_A_SESSION_VALID         0x00040000
+-#define  OTGSC_INTSTS_B_SESSION_VALID         0x00080000
+-#define  OTGSC_INTSTS_B_SESSION_END           0x00100000
+-#define  OTGSC_INTSTS_1MS                     0x00200000
+-#define  OTGSC_INTSTS_DATA_PULSING            0x00400000
+-#define  OTGSC_INTR_USB_ID                    0x01000000
+-#define  OTGSC_INTR_A_VBUS_VALID              0x02000000
+-#define  OTGSC_INTR_A_SESSION_VALID           0x04000000
+-#define  OTGSC_INTR_B_SESSION_VALID           0x08000000
+-#define  OTGSC_INTR_B_SESSION_END             0x10000000
+-#define  OTGSC_INTR_1MS_TIMER                 0x20000000
+-#define  OTGSC_INTR_DATA_PULSING              0x40000000
+-
+-/* USB MODE Register Bit Masks */
+-#define  USB_MODE_CTRL_MODE_IDLE              0x00000000
+-#define  USB_MODE_CTRL_MODE_DEVICE            0x00000002
+-#define  USB_MODE_CTRL_MODE_HOST              0x00000003
+-#define  USB_MODE_CTRL_MODE_RSV               0x00000001
+-#define  USB_MODE_SETUP_LOCK_OFF              0x00000008
+-#define  USB_MODE_STREAM_DISABLE              0x00000010
+-/* Endpoint Flush Register */
+-#define EPFLUSH_TX_OFFSET                   0x00010000
+-#define EPFLUSH_RX_OFFSET                   0x00000000
+-
+-/* Endpoint Setup Status bit masks */
+-#define  EP_SETUP_STATUS_MASK                 0x0000003F
+-#define  EP_SETUP_STATUS_EP0                0x00000001
+-
+-/* ENDPOINTCTRLx  Register Bit Masks */
+-#define  EPCTRL_TX_ENABLE                     0x00800000
+-#define  EPCTRL_TX_DATA_TOGGLE_RST            0x00400000      /* Not EP0 */
+-#define  EPCTRL_TX_DATA_TOGGLE_INH            0x00200000      /* Not EP0 */
+-#define  EPCTRL_TX_TYPE                       0x000C0000
+-#define  EPCTRL_TX_DATA_SOURCE                0x00020000      /* Not EP0 */
+-#define  EPCTRL_TX_EP_STALL                   0x00010000
+-#define  EPCTRL_RX_ENABLE                     0x00000080
+-#define  EPCTRL_RX_DATA_TOGGLE_RST            0x00000040      /* Not EP0 */
+-#define  EPCTRL_RX_DATA_TOGGLE_INH            0x00000020      /* Not EP0 */
+-#define  EPCTRL_RX_TYPE                       0x0000000C
+-#define  EPCTRL_RX_DATA_SINK                  0x00000002      /* Not EP0 */
+-#define  EPCTRL_RX_EP_STALL                   0x00000001
+-
+-/* bit 19-18 and 3-2 are endpoint type */
+-#define  EPCTRL_EP_TYPE_CONTROL               0
+-#define  EPCTRL_EP_TYPE_ISO                   1
+-#define  EPCTRL_EP_TYPE_BULK                  2
+-#define  EPCTRL_EP_TYPE_INTERRUPT             3
+-#define  EPCTRL_TX_EP_TYPE_SHIFT              18
+-#define  EPCTRL_RX_EP_TYPE_SHIFT              2
+-
+-/* SNOOPn Register Bit Masks */
+-#define  SNOOP_ADDRESS_MASK                   0xFFFFF000
+-#define  SNOOP_SIZE_ZERO                      0x00    /* snooping disable */
+-#define  SNOOP_SIZE_4KB                       0x0B    /* 4KB snoop size */
+-#define  SNOOP_SIZE_8KB                       0x0C
+-#define  SNOOP_SIZE_16KB                      0x0D
+-#define  SNOOP_SIZE_32KB                      0x0E
+-#define  SNOOP_SIZE_64KB                      0x0F
+-#define  SNOOP_SIZE_128KB                     0x10
+-#define  SNOOP_SIZE_256KB                     0x11
+-#define  SNOOP_SIZE_512KB                     0x12
+-#define  SNOOP_SIZE_1MB                       0x13
+-#define  SNOOP_SIZE_2MB                       0x14
+-#define  SNOOP_SIZE_4MB                       0x15
+-#define  SNOOP_SIZE_8MB                       0x16
+-#define  SNOOP_SIZE_16MB                      0x17
+-#define  SNOOP_SIZE_32MB                      0x18
+-#define  SNOOP_SIZE_64MB                      0x19
+-#define  SNOOP_SIZE_128MB                     0x1A
+-#define  SNOOP_SIZE_256MB                     0x1B
+-#define  SNOOP_SIZE_512MB                     0x1C
+-#define  SNOOP_SIZE_1GB                       0x1D
+-#define  SNOOP_SIZE_2GB                       0x1E    /* 2GB snoop size */
+-
+-/* pri_ctrl Register Bit Masks */
+-#define  PRI_CTRL_PRI_LVL1                    0x0000000C
+-#define  PRI_CTRL_PRI_LVL0                    0x00000003
+-
+-/* si_ctrl Register Bit Masks */
+-#define  SI_CTRL_ERR_DISABLE                  0x00000010
+-#define  SI_CTRL_IDRC_DISABLE                 0x00000008
+-#define  SI_CTRL_RD_SAFE_EN                   0x00000004
+-#define  SI_CTRL_RD_PREFETCH_DISABLE          0x00000002
+-#define  SI_CTRL_RD_PREFEFETCH_VAL            0x00000001
+-
+-/* control Register Bit Masks */
+-#define  USB_CTRL_IOENB                       0x00000004
+-#define  USB_CTRL_ULPI_INT0EN                 0x00000001
+ /* Endpoint Queue Head data struct
+  * Rem: all the variables of qh are LittleEndian Mode
+@@ -477,7 +297,10 @@ struct fsl_udc {
+       unsigned int irq;
+       struct usb_ctrlrequest local_setup_buff;
+-      spinlock_t lock;
++      spinlock_t lock;                /* udc lock */
++      struct fsl_usb2_platform_data *pdata;
++      u32 xcvr_type;
++
+       struct otg_transceiver *transceiver;
+       unsigned softconnect:1;
+       unsigned vbus_active:1;
+@@ -514,7 +337,7 @@ struct fsl_udc {
+ #define DBG(fmt, args...)     printk(KERN_DEBUG "[%s]  " fmt "\n", \
+                               __FUNCTION__, ## args)
+ #else
+-#define DBG(fmt, args...)     do{}while(0)
++#define DBG(fmt, args...)     do {} while (0)
+ #endif
+ #if 0
+@@ -548,7 +371,7 @@ static void dump_msg(const char *label, 
+ #ifdef VERBOSE
+ #define VDBG          DBG
+ #else
+-#define VDBG(stuff...)        do{}while(0)
++#define VDBG(stuff...)        do {} while (0)
+ #endif
+ #define ERR(stuff...)         pr_err("udc: " stuff)
+@@ -573,11 +396,14 @@ static void dump_msg(const char *label, 
+ #define ep_maxpacket(EP)      ((EP)->ep.maxpacket)
+ #define ep_is_in(EP)  ( (ep_index(EP) == 0) ? (EP->udc->ep0_dir == \
+                       USB_DIR_IN ):((EP)->desc->bEndpointAddress \
+-                      & USB_DIR_IN)==USB_DIR_IN)
++                      & USB_DIR_IN) == USB_DIR_IN)
+ #define get_ep_by_pipe(udc, pipe)     ((pipe == 1)? &udc->eps[0]: \
+                                       &udc->eps[pipe])
+ #define get_pipe_by_windex(windex)    ((windex & USB_ENDPOINT_NUMBER_MASK) \
+                                       * 2 + ((windex & USB_DIR_IN) ? 1 : 0))
+ #define get_pipe_by_ep(EP)    (ep_index(EP) * 2 + ep_is_in(EP))
++/* Bulk only class request */
++#define USB_BULK_RESET_REQUEST          0xff
++
+ #endif
+--- a/drivers/usb/gadget/gadget_chips.h
++++ b/drivers/usb/gadget/gadget_chips.h
+@@ -147,6 +147,11 @@
+ #define       gadget_is_m66592(g)     0
+ #endif
++#ifdef CONFIG_USB_GADGET_MCF5445X
++#define gadget_is_mcf5445x(g) !strcmp("fsl-usb2-udc", (g)->name)
++#else
++#define gadget_is_mcf5445x(g) 0
++#endif
+ // CONFIG_USB_GADGET_SX2
+ // CONFIG_USB_GADGET_AU1X00
+@@ -212,5 +217,7 @@ static inline int usb_gadget_controller_
+               return 0x20;
+       else if (gadget_is_m66592(gadget))
+               return 0x21;
++      else if (gadget_is_mcf5445x(gadget))
++              return 0x22;
+       return -ENOENT;
+ }
+--- /dev/null
++++ b/drivers/usb/gadget/mcf5445x_udc.c
+@@ -0,0 +1,2758 @@
++/*
++ * Copyright Freescale Semiconductor, Inc. 2006-2007
++ *
++ *      Based on mpc_udc.c code
++ *      of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.)
++ *
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ ***************************************************************************
++ * Changes:
++ *   v0.004   30 July 2007            Duck
++ *            mcf5445x port
++ *   v0.003   27 October 2006         Andrey Butok
++ *            Added M5329EVB support (without external transceiver).
++ *   v0.002   29 September 2006       Andrey Butok
++ *            Some little changes. Added OTG support.
++ *   v0.001   12 July 2006            Andrey Butok
++ *            Initial Release - developed on uClinux with 2.6.17.1 kernel.
++ *            Based on mpc_udc.c code
++ *            of Li Yang and Jiang Bo (Freescale Semiconductor, Inc.)
++ *
++ */
++
++#define DEBUG
++#undef VERBOSE
++
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/types.h>
++#include <linux/errno.h>
++#include <linux/delay.h>
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/irq.h>
++#include <linux/timer.h>
++#include <linux/list.h>
++#include <linux/interrupt.h>
++#include <linux/proc_fs.h>
++#include <linux/mm.h>
++#include <linux/platform_device.h>
++#include <linux/moduleparam.h>
++#include <linux/device.h>
++#include <linux/usb/ch9.h>
++#include <linux/usb_gadget.h>
++#include <linux/usb/otg.h>
++#include <linux/dma-mapping.h>
++#include <linux/dmapool.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_xcvr.h>
++#include <linux/usb/fsl_usb2.h>
++#include <linux/pm.h>
++
++#include <asm/byteorder.h>
++#include <asm/system.h>
++#include <asm/unaligned.h>
++#include <asm/dma.h>
++
++#include <asm/mcfsim.h>
++#include <asm/cacheflush.h>
++
++#include "fsl_usb2_udc.h"
++
++#define       DRIVER_DESC     "Freescale High-Speed USB SoC Device Controller driver"
++#define       DRIVER_AUTHOR   "Freescale Semiconductor Inc."
++#define       DRIVER_VERSION  "30 July 2007"
++
++#define cpu_to_hc32(x)        (x)
++#define hc32_to_cpu(x)        (x)
++
++static int udc_suspend(struct fsl_udc *udc);
++
++#define       DMA_ADDR_INVALID        (~(dma_addr_t)0)
++
++static const char driver_name[] = "fsl-usb2-udc";
++static const char driver_desc[] = DRIVER_DESC;
++
++volatile static struct fsl_usb_device_regs *dr_regs;
++volatile static struct usb_sys_interface *usb_sys_regs;
++
++/* it is initialized in probe()  */
++static struct fsl_udc *udc_controller;
++
++static const struct usb_endpoint_descriptor
++fsl_ep0_desc = {
++      .bLength =              USB_DT_ENDPOINT_SIZE,
++      .bDescriptorType =      USB_DT_ENDPOINT,
++      .bEndpointAddress =     0,
++      .bmAttributes =         USB_ENDPOINT_XFER_CONTROL,
++      .wMaxPacketSize =       USB_MAX_CTRL_PAYLOAD,
++};
++
++static int fsl_udc_suspend(struct device *dev, pm_message_t state);
++static int fsl_udc_resume(struct device *dev);
++static void fsl_ep_fifo_flush(struct usb_ep *_ep);
++
++/********************************************************************
++ *    Internal Used Function
++********************************************************************/
++/*-----------------------------------------------------------------
++ * done() - retire a request; caller blocked irqs
++ * @status : request status to be set, only works when
++ *    request is still in progress.
++ *--------------------------------------------------------------*/
++static void done(struct fsl_ep *ep, struct fsl_req *req, int status)
++{
++      struct fsl_udc *udc = NULL;
++      unsigned char stopped = ep->stopped;
++
++      udc = (struct fsl_udc *)ep->udc;
++
++      pr_debug("udc: req=0x%p\n", req);
++      if (req->head) {
++              pr_debug("udc: freeing head=0x%p\n", req->head);
++              dma_pool_free(udc->td_pool, req->head, req->head->td_dma);
++      }
++
++      /* the req->queue pointer is used by ep_queue() func, in which
++       * the request will be added into a udc_ep->queue 'd tail
++       * so here the req will be dropped from the ep->queue
++       */
++      list_del_init(&req->queue);
++
++      /* req.status should be set as -EINPROGRESS in ep_queue() */
++      if (req->req.status == -EINPROGRESS)
++              req->req.status = status;
++      else
++              status = req->req.status;
++
++      pr_debug("udc: req=0x%p  mapped=%x\n", req, req->mapped);
++
++      if (req->mapped) {
++              pr_debug("udc: calling dma_unmap_single(buf,%s)  req=0x%p  "
++                       "a=0x%x  len=%d\n",
++                       ep_is_in(ep) ? "to_dvc" : "from_dvc",
++                       req, req->req.dma, req->req.length);
++
++              dma_unmap_single(ep->udc->gadget.dev.parent,
++                               req->req.dma, req->req.length, ep_is_in(ep) ?
++                               DMA_TO_DEVICE : DMA_FROM_DEVICE);
++
++              req->req.dma = DMA_ADDR_INVALID;
++              req->mapped = 0;
++              pr_debug("udc: req=0x%p set req.dma=0x%x\n", req, req->req.dma);
++      } else {
++              if ((req->req.length != 0)
++                  && (req->req.dma != DMA_ADDR_INVALID)) {
++                      pr_debug("udc: calling dma_sync_single_for_cpu(buf,%s) "
++                               "req=0x%p  dma=0x%x  len=%d\n",
++                               ep_is_in(ep) ? "to_dvc" : "from_dvc", req,
++                               req->req.dma, req->req.length);
++
++                      dma_sync_single_for_cpu(ep->udc->gadget.dev.parent,
++                                              req->req.dma, req->req.length,
++                                              ep_is_in(ep) ? DMA_TO_DEVICE :
++                                              DMA_FROM_DEVICE);
++              }
++      }
++
++      if (status && (status != -ESHUTDOWN)) {
++              pr_debug("udc: complete %s req 0c%p stat %d len %u/%u\n",
++                       ep->ep.name, &req->req, status,
++                       req->req.actual, req->req.length);
++      }
++
++      /* don't modify queue heads during completion callback */
++      ep->stopped = 1;
++
++      spin_unlock(&ep->udc->lock);
++
++      /* this complete() should a func implemented by gadget layer,
++       * eg fsg->bulk_in_complete() */
++      if (req->req.complete) {
++              pr_debug("udc: calling gadget's complete()  req=0x%p\n", req);
++              req->req.complete(&ep->ep, &req->req);
++              pr_debug("udc: back from gadget's complete()\n");
++      }
++
++      spin_lock(&ep->udc->lock);
++      ep->stopped = stopped;
++}
++
++/*
++ * nuke(): delete all requests related to this ep
++ * called with spinlock held
++ *--------------------------------------------------------------*/
++static void nuke(struct fsl_ep *ep, int status)
++{
++      ep->stopped = 1;
++
++      /* Flush fifo */
++      fsl_ep_fifo_flush(&ep->ep);
++
++      /* Whether this eq has request linked */
++      while (!list_empty(&ep->queue)) {
++              struct fsl_req *req = NULL;
++
++              req = list_entry(ep->queue.next, struct fsl_req, queue);
++              done(ep, req, status);
++      }
++}
++
++/*------------------------------------------------------------------
++      Internal Hardware related function
++ ------------------------------------------------------------------*/
++
++static int dr_controller_setup(struct fsl_udc *udc)
++{
++      unsigned int tmp;
++      unsigned int __attribute((unused)) ctrl = 0;
++      unsigned long timeout;
++      struct fsl_usb2_platform_data *pdata;
++
++#define FSL_UDC_RESET_TIMEOUT 1000
++
++      /* before here, make sure dr_regs has been initialized */
++      if (!udc)
++              return -EINVAL;
++      pdata = udc->pdata;
++
++      /* Stop and reset the usb controller */
++      tmp = fsl_readl(&dr_regs->usbcmd);
++      tmp &= ~USB_CMD_RUN_STOP;
++      fsl_writel(tmp, &dr_regs->usbcmd);
++
++      tmp = fsl_readl(&dr_regs->usbcmd);
++      tmp |= USB_CMD_CTRL_RESET;
++      fsl_writel(tmp, &dr_regs->usbcmd);
++
++      /* Wait for reset to complete */
++      timeout = jiffies + FSL_UDC_RESET_TIMEOUT;
++      while (fsl_readl(&dr_regs->usbcmd) & USB_CMD_CTRL_RESET) {
++              if (time_after(jiffies, timeout)) {
++                      ERR("udc reset timeout! \n");
++                      return -ETIMEDOUT;
++              }
++              cpu_relax();
++      }
++
++      tmp = fsl_readl(&dr_regs->usbmode);
++      tmp &= ~0x3;    /* clear mode bits */
++      tmp |= USB_MODE_CTRL_MODE_DEVICE;
++      /* Disable Setup Lockout */
++      tmp |= USB_MODE_SETUP_LOCK_OFF;
++      if (pdata->es)
++              tmp |= USBMODE_ES;
++      fsl_writel(tmp, &dr_regs->usbmode);
++
++      if (pdata->xcvr_ops && pdata->xcvr_ops->set_device)
++              pdata->xcvr_ops->set_device();
++
++      /* Clear the setup status */
++      fsl_writel(0, &dr_regs->usbsts);
++
++      tmp = udc->ep_qh_dma;
++      tmp &= USB_EP_LIST_ADDRESS_MASK;
++      fsl_writel(tmp, &dr_regs->endpointlistaddr);
++
++      /*
++      VDBG("vir[qh_base] is %p phy[qh_base] is 0x%8x reg is 0x%8x",
++              (int)udc->ep_qh, (int)tmp,
++              fsl_readl(&dr_regs->endpointlistaddr));
++      */
++
++
++      if (pdata->have_sysif_regs) {
++              /* Config control enable i/o output, cpu endian register */
++              ctrl = __raw_readl(&usb_sys_regs->control);
++              ctrl |= USB_CTRL_IOENB;
++              __raw_writel(ctrl, &usb_sys_regs->control);
++      }
++
++#if defined(CONFIG_PPC32) && !defined(CONFIG_NOT_COHERENT_CACHE)
++      /* Turn on cache snooping hardware, since some PowerPC platforms
++       * wholly rely on hardware to deal with cache coherent. */
++
++      if (pdata->have_sysif_regs) {
++              /* Setup Snooping for all the 4GB space */
++              tmp = SNOOP_SIZE_2GB;   /* starts from 0x0, size 2G */
++              __raw_writel(tmp, &usb_sys_regs->snoop1);
++              tmp |= 0x80000000;      /* starts from 0x8000000, size 2G */
++              __raw_writel(tmp, &usb_sys_regs->snoop2);
++      }
++#endif
++
++      return 0;
++}
++
++static void pullup_enable(struct fsl_udc *udc)
++{
++      u32 temp;
++
++      unsigned short ccm = fsl_readw(&MCF_CCM_UOCSR);
++      ccm |= MCF_CCM_UOCSR_BVLD;
++      ccm &= ~MCF_CCM_UOCSR_SEND;
++      fsl_writew(ccm, &MCF_CCM_UOCSR);
++
++      /* Enable DR irq reg */
++      temp = USB_INTR_INT_EN | USB_INTR_ERR_INT_EN
++              | USB_INTR_PTC_DETECT_EN | USB_INTR_RESET_EN
++              | USB_INTR_DEVICE_SUSPEND | USB_INTR_SYS_ERR_EN;
++
++      fsl_writel(temp, &dr_regs->usbintr);
++
++      /* Set controller to Run */
++      temp = fsl_readl(&dr_regs->usbcmd);
++      temp |= USB_CMD_RUN_STOP;
++      fsl_writel(temp, &dr_regs->usbcmd);
++
++#ifdef NEVER /* DDD FIXME: we want this? */
++      if (!udc->transceiver)
++              *((u16 *)(MCF_FBCS1_CSAR)) &= ~0x1; /* Enable pullup register */
++#endif
++}
++
++static void pullup_disable(struct fsl_udc *udc)
++{
++      unsigned int tmp;
++      unsigned short ccm;
++
++      VDBG();
++      /* disable all INTRs */
++      fsl_writel(0, &dr_regs->usbintr);
++
++      ccm = fsl_readw(&MCF_CCM_UOCSR);
++      ccm &= ~MCF_CCM_UOCSR_BVLD;
++      fsl_writew(ccm, &MCF_CCM_UOCSR);
++
++      /* set controller to Stop */
++      tmp = fsl_readl(&dr_regs->usbcmd);
++      tmp &= ~USB_CMD_RUN_STOP;
++      fsl_writel(tmp, &dr_regs->usbcmd);
++
++#ifdef NEVER /* DDD FIXME: we want this? */
++      if (!udc->transceiver)
++              *((u16 *)(MCF_FBCS1_CSAR)) |= 0x1; /* Disable pullup register */
++#endif
++
++}
++
++static void dr_controller_run(struct fsl_udc *udc)
++{
++      VDBG();
++      pullup_enable(udc);
++      udc->stopped = 0;
++}
++
++static void dr_controller_stop(struct fsl_udc *udc)
++{
++      pullup_disable(udc);
++      udc->stopped = 1;
++      udc->gadget.b_hnp_enable = 0;
++      udc->gadget.a_hnp_support = 0;
++      udc->gadget.a_alt_hnp_support = 0;
++}
++
++void dr_ep_setup(unsigned char ep_num, unsigned char dir, unsigned char ep_type)
++{
++      unsigned int tmp_epctrl = 0;
++
++      tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++      if (dir) {
++              if (ep_num)
++                      tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST;
++              tmp_epctrl |= EPCTRL_TX_ENABLE;
++              tmp_epctrl |= ((unsigned int)(ep_type)
++                              << EPCTRL_TX_EP_TYPE_SHIFT);
++      } else {
++              if (ep_num)
++                      tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST;
++              tmp_epctrl |= EPCTRL_RX_ENABLE;
++              tmp_epctrl |= ((unsigned int)(ep_type)
++                              << EPCTRL_RX_EP_TYPE_SHIFT);
++      }
++
++      fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]);
++}
++
++static void dr_ep_change_stall(unsigned char ep_num, unsigned char dir,
++                             int value)
++{
++      u32 tmp_epctrl = 0;
++
++      tmp_epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++
++      if (value) {
++              /* set the stall bit */
++              if (dir)
++                      tmp_epctrl |= EPCTRL_TX_EP_STALL;
++              else
++                      tmp_epctrl |= EPCTRL_RX_EP_STALL;
++      } else {
++              /* clear the stall bit and reset data toggle */
++              if (dir) {
++                      tmp_epctrl &= ~EPCTRL_TX_EP_STALL;
++                      tmp_epctrl |= EPCTRL_TX_DATA_TOGGLE_RST;
++              } else {
++                      tmp_epctrl &= ~EPCTRL_RX_EP_STALL;
++                      tmp_epctrl |= EPCTRL_RX_DATA_TOGGLE_RST;
++              }
++      }
++      fsl_writel(tmp_epctrl, &dr_regs->endptctrl[ep_num]);
++}
++
++/* Get stall status of a specific ep
++   Return: 0: not stalled; 1:stalled */
++static int dr_ep_get_stall(unsigned char ep_num, unsigned char dir)
++{
++      u32 epctrl;
++
++      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++      if (dir)
++              return (epctrl & EPCTRL_TX_EP_STALL) ? 1 : 0;
++      else
++              return (epctrl & EPCTRL_RX_EP_STALL) ? 1 : 0;
++}
++
++/********************************************************************
++      Internal Structure Build up functions
++********************************************************************/
++
++/*------------------------------------------------------------------
++* struct_ep_qh_setup(): set the Endpoint Capabilites field of QH
++ * @zlt: Zero Length Termination Select (1: disable; 0: enable)
++ * @mult: Mult field
++ ------------------------------------------------------------------*/
++static void struct_ep_qh_setup(struct fsl_udc *udc, unsigned char ep_num,
++              unsigned char dir, unsigned char ep_type,
++              unsigned int max_pkt_len,
++              unsigned int zlt, unsigned char mult)
++{
++      struct ep_queue_head *p_QH = &udc->ep_qh[2 * ep_num + dir];
++      unsigned int tmp = 0;
++
++      /* set the Endpoint Capabilites in QH */
++      switch (ep_type) {
++      case USB_ENDPOINT_XFER_CONTROL:
++              /* Interrupt On Setup (IOS). for control ep  */
++              tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS)
++                      | EP_QUEUE_HEAD_IOS;
++              break;
++      case USB_ENDPOINT_XFER_ISOC:
++              tmp = (max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS)
++                      | (mult << EP_QUEUE_HEAD_MULT_POS);
++              break;
++      case USB_ENDPOINT_XFER_BULK:
++      case USB_ENDPOINT_XFER_INT:
++              tmp = max_pkt_len << EP_QUEUE_HEAD_MAX_PKT_LEN_POS;
++              break;
++      default:
++              VDBG("error ep type is %d", ep_type);
++              return;
++      }
++      if (zlt)
++              tmp |= EP_QUEUE_HEAD_ZLT_SEL;
++      p_QH->max_pkt_length = cpu_to_hc32(tmp);
++
++      return;
++}
++
++/* Setup qh structure and ep register for ep0. */
++static void ep0_setup(struct fsl_udc *udc)
++{
++      /* the intialization of an ep includes: fields in QH, Regs,
++       * fsl_ep struct */
++      struct_ep_qh_setup(udc, 0, USB_RECV, USB_ENDPOINT_XFER_CONTROL,
++                      USB_MAX_CTRL_PAYLOAD, 0, 0);
++      struct_ep_qh_setup(udc, 0, USB_SEND, USB_ENDPOINT_XFER_CONTROL,
++                      USB_MAX_CTRL_PAYLOAD, 0, 0);
++      dr_ep_setup(0, USB_RECV, USB_ENDPOINT_XFER_CONTROL);
++      dr_ep_setup(0, USB_SEND, USB_ENDPOINT_XFER_CONTROL);
++
++      return;
++
++}
++
++/***********************************************************************
++              Endpoint Management Functions
++***********************************************************************/
++
++/*-------------------------------------------------------------------------
++ * when configurations are set, or when interface settings change
++ * for example the do_set_interface() in gadget layer,
++ * the driver will enable or disable the relevant endpoints
++ * ep0 doesn't use this routine. It is always enabled.
++-------------------------------------------------------------------------*/
++static int fsl_ep_enable(struct usb_ep *_ep,
++              const struct usb_endpoint_descriptor *desc)
++{
++      struct fsl_udc *udc = NULL;
++      struct fsl_ep *ep = NULL;
++      unsigned short max = 0;
++      unsigned char mult = 0, zlt;
++      int retval = -EINVAL;
++      unsigned long flags = 0;
++
++      ep = container_of(_ep, struct fsl_ep, ep);
++
++      /* catch various bogus parameters */
++      if (!_ep || !desc || ep->desc
++                      || (desc->bDescriptorType != USB_DT_ENDPOINT))
++              return -EINVAL;
++
++      udc = ep->udc;
++
++      if (!udc->driver || (udc->gadget.speed == USB_SPEED_UNKNOWN))
++              return -ESHUTDOWN;
++
++      max = le16_to_cpu(desc->wMaxPacketSize);
++
++      /* Disable automatic zlp generation.  Driver is reponsible to indicate
++       * explicitly through req->req.zero.  This is needed to enable multi-td
++       * request. */
++      zlt = 1;
++
++      /* Assume the max packet size from gadget is always correct */
++      switch (desc->bmAttributes & 0x03) {
++      case USB_ENDPOINT_XFER_CONTROL:
++      case USB_ENDPOINT_XFER_BULK:
++      case USB_ENDPOINT_XFER_INT:
++              /* mult = 0.  Execute N Transactions as demonstrated by
++               * the USB variable length packet protocol where N is
++               * computed using the Maximum Packet Length (dQH) and
++               * the Total Bytes field (dTD) */
++              mult = 0;
++              break;
++      case USB_ENDPOINT_XFER_ISOC:
++              /* Calculate transactions needed for high bandwidth iso */
++              mult = (unsigned char)(1 + ((max >> 11) & 0x03));
++              max = max & 0x8ff;      /* bit 0~10 */
++              /* 3 transactions at most */
++              if (mult > 3)
++                      goto en_done;
++              break;
++      default:
++              goto en_done;
++      }
++
++      spin_lock_irqsave(&udc->lock, flags);
++      ep->ep.maxpacket = max;
++      ep->desc = desc;
++      ep->stopped = 0;
++
++      /* Controller related setup */
++      /* Init EPx Queue Head (Ep Capabilites field in QH
++       * according to max, zlt, mult) */
++      struct_ep_qh_setup(udc, (unsigned char) ep_index(ep),
++                      (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN)
++                                      ?  USB_SEND : USB_RECV),
++                      (unsigned char) (desc->bmAttributes
++                                      & USB_ENDPOINT_XFERTYPE_MASK),
++                      max, zlt, mult);
++
++      /* Init endpoint ctrl register */
++      dr_ep_setup((unsigned char) ep_index(ep),
++                      (unsigned char) ((desc->bEndpointAddress & USB_DIR_IN)
++                                      ? USB_SEND : USB_RECV),
++                      (unsigned char) (desc->bmAttributes
++                                      & USB_ENDPOINT_XFERTYPE_MASK));
++
++      spin_unlock_irqrestore(&udc->lock, flags);
++      retval = 0;
++
++      VDBG("enabled %s (ep%d%s) maxpacket %d", ep->ep.name,
++                      ep->desc->bEndpointAddress & 0x0f,
++                      (desc->bEndpointAddress & USB_DIR_IN)
++                              ? "in" : "out", max);
++en_done:
++      return retval;
++}
++
++/*---------------------------------------------------------------------
++ * @ep : the ep being unconfigured. May not be ep0
++ * Any pending and uncomplete req will complete with status (-ESHUTDOWN)
++*---------------------------------------------------------------------*/
++static int fsl_ep_disable(struct usb_ep *_ep)
++{
++      struct fsl_udc *udc = NULL;
++      struct fsl_ep *ep = NULL;
++      unsigned long flags = 0;
++      u32 epctrl;
++      int ep_num;
++
++      ep = container_of(_ep, struct fsl_ep, ep);
++      if (!_ep || !ep->desc) {
++              pr_debug("udc: %s not enabled\n", _ep ? ep->ep.name : NULL);
++              return -EINVAL;
++      }
++
++      /* disable ep on controller */
++      ep_num = ep_index(ep);
++      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++      if (ep_is_in(ep))
++              epctrl &= ~EPCTRL_TX_ENABLE;
++      else
++              epctrl &= ~EPCTRL_RX_ENABLE;
++      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
++
++      udc = (struct fsl_udc *)ep->udc;
++      spin_lock_irqsave(&udc->lock, flags);
++
++      /* nuke all pending requests (does flush) */
++      nuke(ep, -ESHUTDOWN);
++
++      ep->desc = 0;
++      ep->stopped = 1;
++      spin_unlock_irqrestore(&udc->lock, flags);
++
++      pr_debug("udc: disabled %s OK\n", _ep->name);
++      return 0;
++}
++
++/*---------------------------------------------------------------------
++ * allocate a request object used by this endpoint
++ * the main operation is to insert the req->queue to the eq->queue
++ * Returns the request, or null if one could not be allocated
++*---------------------------------------------------------------------*/
++static struct usb_request *
++fsl_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
++{
++      struct fsl_req *req = NULL;
++
++      req = kzalloc(sizeof *req, gfp_flags);
++      if (!req)
++              return NULL;
++
++      req->req.dma = DMA_ADDR_INVALID;
++      pr_debug("udc: req=0x%p   set req.dma=0x%x\n", req, req->req.dma);
++      INIT_LIST_HEAD(&req->queue);
++
++      return &req->req;
++}
++
++static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req)
++{
++      struct fsl_req *req;
++
++      req = container_of(_req, struct fsl_req, req);
++      pr_debug("udc: req=0x%p\n", req);
++
++      if (_req)
++              kfree(req);
++}
++
++/*-------------------------------------------------------------------------*/
++static int fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
++{
++      int i = ep_index(ep) * 2 + ep_is_in(ep);
++      u32 temp, bitmask, tmp_stat;
++      struct ep_queue_head *dQH = &ep->udc->ep_qh[i];
++
++      pr_debug("udc: queue req=0x%p to ep index %d\n", req, i);
++
++      bitmask = ep_is_in(ep)
++              ? (1 << (ep_index(ep) + 16))
++              : (1 << (ep_index(ep)));
++
++      /* check if the pipe is empty */
++      if (!(list_empty(&ep->queue))) {
++              /* Add td to the end */
++              struct fsl_req *lastreq;
++              lastreq = list_entry(ep->queue.prev, struct fsl_req, queue);
++              lastreq->tail->next_td_ptr =
++                      cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK);
++              /* Read prime bit, if 1 goto done */
++              if (fsl_readl(&dr_regs->endpointprime) & bitmask)
++                      goto out;
++
++              do {
++                      /* Set ATDTW bit in USBCMD */
++                      temp = fsl_readl(&dr_regs->usbcmd);
++                      fsl_writel(temp | USB_CMD_ATDTW, &dr_regs->usbcmd);
++
++                      /* Read correct status bit */
++                      tmp_stat = fsl_readl(&dr_regs->endptstatus) & bitmask;
++
++              } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_ATDTW));
++
++              /* Write ATDTW bit to 0 */
++              temp = fsl_readl(&dr_regs->usbcmd);
++              fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd);
++
++              if (tmp_stat)
++                      goto out;
++      }
++
++      /* Write dQH next pointer and terminate bit to 0 */
++      temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK;
++      dQH->next_dtd_ptr = cpu_to_hc32(temp);
++
++      /* Clear active and halt bit */
++      temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE
++                      | EP_QUEUE_HEAD_STATUS_HALT));
++      dQH->size_ioc_int_sts &= temp;
++
++      /* Prime endpoint by writing 1 to ENDPTPRIME */
++      temp = ep_is_in(ep)
++              ? (1 << (ep_index(ep) + 16))
++              : (1 << (ep_index(ep)));
++      fsl_writel(temp, &dr_regs->endpointprime);
++out:
++      return 0;
++}
++
++/* Fill in the dTD structure
++ * @req: request that the transfer belongs to
++ * @length: return actually data length of the dTD
++ * @dma: return dma address of the dTD
++ * @is_last: return flag if it is the last dTD of the request
++ * return: pointer to the built dTD */
++static struct ep_td_struct *fsl_build_dtd(struct fsl_req *req, unsigned *length,
++              dma_addr_t *dma, int *is_last)
++{
++      u32 swap_temp;
++      struct ep_td_struct *dtd;
++
++      /* how big will this transfer be? */
++      *length = min(req->req.length - req->req.actual,
++                      (unsigned)EP_MAX_LENGTH_TRANSFER);
++
++      dtd = dma_pool_alloc(udc_controller->td_pool, GFP_KERNEL, dma);
++      if (dtd == NULL)
++              return dtd;
++
++      dtd->td_dma = *dma;
++      /* Clear reserved field */
++      swap_temp = hc32_to_cpu(dtd->size_ioc_sts);
++      swap_temp &= ~DTD_RESERVED_FIELDS;
++      dtd->size_ioc_sts = cpu_to_hc32(swap_temp);
++
++      /* Init all of buffer page pointers */
++      swap_temp = (u32) (req->req.dma + req->req.actual);
++      dtd->buff_ptr0 = cpu_to_hc32(swap_temp);
++      dtd->buff_ptr1 = cpu_to_hc32(swap_temp + 0x1000);
++      dtd->buff_ptr2 = cpu_to_hc32(swap_temp + 0x2000);
++      dtd->buff_ptr3 = cpu_to_hc32(swap_temp + 0x3000);
++      dtd->buff_ptr4 = cpu_to_hc32(swap_temp + 0x4000);
++
++      req->req.actual += *length;
++
++      /* zlp is needed if req->req.zero is set */
++      if (req->req.zero) {
++              if (*length == 0 || (*length % req->ep->ep.maxpacket) != 0)
++                      *is_last = 1;
++              else
++                      *is_last = 0;
++      } else if (req->req.length == req->req.actual)
++              *is_last = 1;
++      else
++              *is_last = 0;
++
++      if ((*is_last) == 0)
++              VDBG("multi-dtd request!\n");
++      /* Fill in the transfer size; set active bit */
++      swap_temp = ((*length << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE);
++
++      /* Enable interrupt for the last dtd of a request */
++      if (*is_last && !req->req.no_interrupt)
++              swap_temp |= DTD_IOC;
++
++      dtd->size_ioc_sts = cpu_to_hc32(swap_temp);
++
++      mb();
++
++      VDBG("length = %d address= 0x%x", *length, (int)*dma);
++
++      return dtd;
++}
++
++/* Generate dtd chain for a request */
++static int fsl_req_to_dtd(struct fsl_req *req)
++{
++      unsigned        count;
++      int             is_last;
++      int             is_first = 1;
++      struct ep_td_struct     *last_dtd = NULL, *dtd;
++      dma_addr_t dma;
++
++      do {
++              dtd = fsl_build_dtd(req, &count, &dma, &is_last);
++              if (dtd == NULL)
++                      return -ENOMEM;
++
++              if (is_first) {
++                      is_first = 0;
++                      req->head = dtd;
++              } else {
++                      last_dtd->next_td_ptr = hc32_to_cpu(dma);
++                      last_dtd->next_td_virt = dtd;
++              }
++              last_dtd = dtd;
++
++              req->dtd_count++;
++      } while (!is_last);
++
++      dtd->next_td_ptr = cpu_to_hc32(DTD_NEXT_TERMINATE);
++
++      req->tail = dtd;
++
++      return 0;
++}
++
++/* queues (submits) an I/O request to an endpoint */
++static int
++fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
++{
++      struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep);
++      struct fsl_req *req = container_of(_req, struct fsl_req, req);
++      struct fsl_udc *udc;
++      unsigned long flags;
++      int is_iso = 0;
++
++      /* catch various bogus parameters */
++      if (!_req || !req->req.complete || !req->req.buf
++                      || !list_empty(&req->queue)) {
++              VDBG("%s, bad params\n", __FUNCTION__);
++              return -EINVAL;
++      }
++      if (!_ep || (!ep->desc && ep_index(ep))) {
++              VDBG("%s, bad ep\n", __FUNCTION__);
++              return -EINVAL;
++      }
++      if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
++              if (req->req.length > ep->ep.maxpacket)
++                      return -EMSGSIZE;
++              is_iso = 1;
++      }
++
++      udc = ep->udc;
++      if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN)
++              return -ESHUTDOWN;
++
++      req->ep = ep;
++
++      /* map virtual address to hardware */
++      if (req->req.dma == DMA_ADDR_INVALID) {
++              req->req.dma = dma_map_single(ep->udc->gadget.dev.parent,
++                                      req->req.buf,
++                                      req->req.length, ep_is_in(ep)
++                                              ? DMA_TO_DEVICE
++                                              : DMA_FROM_DEVICE);
++              req->mapped = 1;
++      } else {
++              dma_sync_single_for_device(ep->udc->gadget.dev.parent,
++                                      req->req.dma, req->req.length,
++                                      ep_is_in(ep)
++                                              ? DMA_TO_DEVICE
++                                              : DMA_FROM_DEVICE);
++              req->mapped = 0;
++      }
++
++      req->req.status = -EINPROGRESS;
++      req->req.actual = 0;
++      req->dtd_count = 0;
++
++      spin_lock_irqsave(&udc->lock, flags);
++
++      /* build dtds and push them to device queue */
++      if (!fsl_req_to_dtd(req)) {
++              fsl_queue_td(ep, req);
++      } else {
++              spin_unlock_irqrestore(&udc->lock, flags);
++              return -ENOMEM;
++      }
++
++      /* Update ep0 state */
++      if ((ep_index(ep) == 0))
++              udc->ep0_state = DATA_STATE_XMIT;
++
++      /* irq handler advances the queue */
++      if (req != NULL)
++              list_add_tail(&req->queue, &ep->queue);
++      spin_unlock_irqrestore(&udc->lock, flags);
++
++      return 0;
++}
++
++/* dequeues (cancels, unlinks) an I/O request from an endpoint */
++static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
++{
++      struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep);
++      struct fsl_req *req;
++      unsigned long flags;
++      int ep_num, stopped, ret = 0;
++      u32 epctrl;
++
++      if (!_ep || !_req)
++              return -EINVAL;
++
++      spin_lock_irqsave(&ep->udc->lock, flags);
++      stopped = ep->stopped;
++
++      /* Stop the ep before we deal with the queue */
++      ep->stopped = 1;
++      ep_num = ep_index(ep);
++      epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++      if (ep_is_in(ep))
++              epctrl &= ~EPCTRL_TX_ENABLE;
++      else
++              epctrl &= ~EPCTRL_RX_ENABLE;
++      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
++
++      /* make sure it's actually queued on this endpoint */
++      list_for_each_entry(req, &ep->queue, queue) {
++              if (&req->req == _req)
++                      break;
++      }
++      if (&req->req != _req) {
++              ret = -EINVAL;
++              goto out;
++      }
++
++      /* The request is in progress, or completed but not dequeued */
++      if (ep->queue.next == &req->queue) {
++              _req->status = -ECONNRESET;
++              fsl_ep_fifo_flush(_ep); /* flush current transfer */
++
++              /* The request isn't the last request in this ep queue */
++              if (req->queue.next != &ep->queue) {
++                      struct ep_queue_head *qh;
++                      struct fsl_req *next_req;
++
++                      qh = ep->qh;
++                      next_req = list_entry(req->queue.next, struct fsl_req,
++                                      queue);
++
++                      /* Point the QH to the first TD of next request */
++                      fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr);
++              }
++
++              /* The request hasn't been processed, patch up the TD chain */
++      } else {
++              struct fsl_req *prev_req;
++
++              prev_req = list_entry(req->queue.prev, struct fsl_req, queue);
++              fsl_writel(fsl_readl(&req->tail->next_td_ptr),
++                              &prev_req->tail->next_td_ptr);
++
++      }
++
++      done(ep, req, -ECONNRESET);
++
++      /* Enable EP */
++out:  epctrl = fsl_readl(&dr_regs->endptctrl[ep_num]);
++      if (ep_is_in(ep))
++              epctrl |= EPCTRL_TX_ENABLE;
++      else
++              epctrl |= EPCTRL_RX_ENABLE;
++      fsl_writel(epctrl, &dr_regs->endptctrl[ep_num]);
++      ep->stopped = stopped;
++
++      spin_unlock_irqrestore(&ep->udc->lock, flags);
++      return ret;
++}
++
++/*-------------------------------------------------------------------------*/
++
++/*-----------------------------------------------------------------
++ * modify the endpoint halt feature
++ * @ep: the non-isochronous endpoint being stalled
++ * @value: 1--set halt  0--clear halt
++ * Returns zero, or a negative error code.
++*----------------------------------------------------------------*/
++static int fsl_ep_set_halt(struct usb_ep *_ep, int value)
++{
++      struct fsl_ep *ep = NULL;
++      unsigned long flags = 0;
++      int status = -EOPNOTSUPP;       /* operation not supported */
++      unsigned char ep_dir = 0, ep_num = 0;
++      struct fsl_udc *udc = NULL;
++
++      ep = container_of(_ep, struct fsl_ep, ep);
++      udc = ep->udc;
++      if (!_ep || !ep->desc) {
++              status = -EINVAL;
++              goto out;
++      }
++
++      if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
++              status = -EOPNOTSUPP;
++              goto out;
++      }
++
++      /* Attempt to halt IN ep will fail if any transfer requests
++       * are still queue */
++      if (value && ep_is_in(ep) && !list_empty(&ep->queue)) {
++              status = -EAGAIN;
++              goto out;
++      }
++
++      status = 0;
++      ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV;
++      ep_num = (unsigned char)(ep_index(ep));
++      spin_lock_irqsave(&ep->udc->lock, flags);
++      dr_ep_change_stall(ep_num, ep_dir, value);
++      spin_unlock_irqrestore(&ep->udc->lock, flags);
++
++      if (ep_index(ep) == 0) {
++              udc->ep0_state = WAIT_FOR_SETUP;
++              udc->ep0_dir = 0;
++      }
++out:
++      VDBG(" %s %s halt stat %d", ep->ep.name,
++                      value ?  "set" : "clear", status);
++
++      return status;
++}
++
++static void fsl_ep_fifo_flush(struct usb_ep *_ep)
++{
++      struct fsl_ep *ep;
++      int ep_num, ep_dir;
++      u32 bits;
++      unsigned long timeout;
++#define FSL_UDC_FLUSH_TIMEOUT 1000
++
++      if (!_ep) {
++              return;
++      } else {
++              ep = container_of(_ep, struct fsl_ep, ep);
++              if (!ep->desc)
++                      return;
++      }
++      ep_num = ep_index(ep);
++      ep_dir = ep_is_in(ep) ? USB_SEND : USB_RECV;
++
++      if (ep_num == 0)
++              bits = (1 << 16) | 1;
++      else if (ep_dir == USB_SEND)
++              bits = 1 << (16 + ep_num);
++      else
++              bits = 1 << ep_num;
++
++      timeout = jiffies + FSL_UDC_FLUSH_TIMEOUT;
++      do {
++              fsl_writel(bits, &dr_regs->endptflush);
++
++              /* Wait until flush complete */
++              while (fsl_readl(&dr_regs->endptflush)) {
++                      if (time_after(jiffies, timeout)) {
++                              ERR("ep flush timeout\n");
++                              return;
++                      }
++                      cpu_relax();
++              }
++              /* See if we need to flush again */
++      } while (fsl_readl(&dr_regs->endptstatus) & bits);
++}
++
++static struct usb_ep_ops fsl_ep_ops = {
++      .enable = fsl_ep_enable,
++      .disable = fsl_ep_disable,
++
++      .alloc_request = fsl_alloc_request,
++      .free_request = fsl_free_request,
++
++      .queue = fsl_ep_queue,
++      .dequeue = fsl_ep_dequeue,
++
++      .set_halt = fsl_ep_set_halt,
++      .fifo_flush = fsl_ep_fifo_flush,        /* flush fifo */
++};
++
++/*-------------------------------------------------------------------------
++              Gadget Driver Layer Operations
++-------------------------------------------------------------------------*/
++
++/*----------------------------------------------------------------------
++ * Get the current frame number (from DR frame_index Reg )
++ *----------------------------------------------------------------------*/
++static int fsl_get_frame(struct usb_gadget *gadget)
++{
++      return (int)(fsl_readl(&dr_regs->frindex) & USB_FRINDEX_MASKS);
++}
++
++/*-----------------------------------------------------------------------
++ * Tries to wake up the host connected to this gadget
++ -----------------------------------------------------------------------*/
++static int fsl_wakeup(struct usb_gadget *gadget)
++{
++      struct fsl_udc *udc = container_of(gadget, struct fsl_udc, gadget);
++      u32 portsc;
++
++      /* Remote wakeup feature not enabled by host */
++      if (!udc->remote_wakeup)
++              return -ENOTSUPP;
++
++      portsc = fsl_readl(&dr_regs->portsc1);
++      /* not suspended? */
++      if (!(portsc & PORTSCX_PORT_SUSPEND))
++              return 0;
++      /* trigger force resume */
++      portsc |= PORTSCX_PORT_FORCE_RESUME;
++      fsl_writel(portsc, &dr_regs->portsc1);
++      return 0;
++}
++
++static int can_pullup(struct fsl_udc *udc)
++{
++      return udc->driver && udc->softconnect && udc->vbus_active;
++}
++
++/*
++ * Notify controller that VBUS is powered, Called by whatever
++ * detects VBUS sessions
++ * @param gadger    gadger pointer
++ * @param is_active is active?
++ * @return Returns zero on success , or a negative error code
++ */
++static int fsl_vbus_session(struct usb_gadget *gadget, int is_active)
++{
++      struct fsl_udc  *udc;
++      unsigned long   flags;
++
++      udc = container_of(gadget, struct fsl_udc, gadget);
++      spin_lock_irqsave(&udc->lock, flags);
++
++      pr_debug("udc: VBUS %s\n", is_active ? "on" : "off");
++      udc->vbus_active = (is_active != 0);
++
++      if (can_pullup(udc)) {
++              pullup_enable(udc);
++              udc_controller->usb_state = USB_STATE_ATTACHED;
++      } else {
++              pullup_disable(udc);
++              udc_controller->usb_state = USB_STATE_NOTATTACHED;
++      }
++      udc_controller->ep0_state = WAIT_FOR_SETUP;
++      udc_controller->ep0_dir = 0;
++
++      spin_unlock_irqrestore(&udc->lock, flags);
++      return 0;
++}
++
++/* constrain controller's VBUS power usage
++ * This call is used by gadget drivers during SET_CONFIGURATION calls,
++ * reporting how much power the device may consume.  For example, this
++ * could affect how quickly batteries are recharged.
++ *
++ * Returns zero on success, else negative errno.
++ */
++static int fsl_vbus_draw(struct usb_gadget *gadget, unsigned mA)
++{
++#ifdef CONFIG_USB_OTG
++      struct fsl_udc *udc;
++
++      udc = container_of(gadget, struct fsl_udc, gadget);
++
++      if (udc->transceiver)
++              return otg_set_power(udc->transceiver, mA);
++#endif
++      return -ENOTSUPP;
++}
++
++/*
++ * Change Data+ pullup status
++ * this func is used by usb_gadget_connect/disconnet
++ */
++static int fsl_pullup(struct usb_gadget *gadget, int is_on)
++{
++      struct fsl_udc *udc;
++
++      udc = container_of(gadget, struct fsl_udc, gadget);
++      udc->softconnect = (is_on != 0);
++      if (can_pullup(udc))
++              fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP),
++                              &dr_regs->usbcmd);
++      else
++              fsl_writel((fsl_readl(&dr_regs->usbcmd) & ~USB_CMD_RUN_STOP),
++                              &dr_regs->usbcmd);
++
++      return 0;
++}
++
++/* defined in usb_gadget.h */
++static struct usb_gadget_ops fsl_gadget_ops = {
++      .get_frame = fsl_get_frame,
++      .wakeup = fsl_wakeup,
++      .vbus_session = fsl_vbus_session,
++      .vbus_draw = fsl_vbus_draw,
++      .pullup = fsl_pullup,
++};
++
++/* Set protocol stall on ep0, protocol stall will automatically be cleared
++   on new transaction */
++static void ep0stall(struct fsl_udc *udc)
++{
++      u32 tmp;
++
++      /* must set tx and rx to stall at the same time */
++      tmp = fsl_readl(&dr_regs->endptctrl[0]);
++      tmp |= EPCTRL_TX_EP_STALL | EPCTRL_RX_EP_STALL;
++      fsl_writel(tmp, &dr_regs->endptctrl[0]);
++      udc->ep0_state = WAIT_FOR_SETUP;
++      udc->ep0_dir = 0;
++}
++
++/* Prime a status phase for ep0 */
++static int ep0_prime_status(struct fsl_udc *udc, int direction)
++{
++      struct fsl_req *req = udc->status_req;
++      struct fsl_ep *ep;
++      int status = 0;
++
++      if (direction == EP_DIR_IN)
++              udc->ep0_dir = USB_DIR_IN;
++      else
++              udc->ep0_dir = USB_DIR_OUT;
++
++      ep = &udc->eps[0];
++      udc->ep0_state = WAIT_FOR_OUT_STATUS;
++
++      req->ep = ep;
++      req->req.length = 0;
++      req->req.status = -EINPROGRESS;
++      req->req.actual = 0;
++      req->req.complete = NULL;
++      req->dtd_count = 0;
++
++      if (fsl_req_to_dtd(req) == 0)
++              status = fsl_queue_td(ep, req);
++      else
++              return -ENOMEM;
++
++      if (status)
++              ERR("Can't queue ep0 status request \n");
++      list_add_tail(&req->queue, &ep->queue);
++
++      return status;
++}
++
++static inline int udc_reset_ep_queue(struct fsl_udc *udc, u8 pipe)
++{
++      struct fsl_ep *ep = get_ep_by_pipe(udc, pipe);
++
++      if (!ep->name)
++              return 0;
++
++      nuke(ep, -ESHUTDOWN);
++
++      return 0;
++}
++
++/*
++ * ch9 Set address
++ */
++static void ch9setaddress(struct fsl_udc *udc, u16 value, u16 index, u16 length)
++{
++      /* Save the new address to device struct */
++      udc->device_address = (u8) value;
++      /* Update usb state */
++      udc->usb_state = USB_STATE_ADDRESS;
++      /* Status phase */
++      if (ep0_prime_status(udc, EP_DIR_IN))
++              ep0stall(udc);
++}
++
++/*
++ * ch9 Get status
++ */
++static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
++                       u16 index, u16 length)
++{
++      u16 tmp = 0;            /* Status, cpu endian */
++
++      struct fsl_req *req;
++      struct fsl_ep *ep;
++      int status = 0;
++
++      ep = &udc->eps[0];
++
++      if ((request_type & USB_RECIP_MASK) == USB_RECIP_DEVICE) {
++              /* Get device status */
++              tmp = 1 << USB_DEVICE_SELF_POWERED;
++              tmp |= udc->remote_wakeup << USB_DEVICE_REMOTE_WAKEUP;
++      } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_INTERFACE) {
++              /* Get interface status */
++              /* We don't have interface information in udc driver */
++              tmp = 0;
++      } else if ((request_type & USB_RECIP_MASK) == USB_RECIP_ENDPOINT) {
++              /* Get endpoint status */
++              struct fsl_ep *target_ep;
++
++              target_ep = get_ep_by_pipe(udc, get_pipe_by_windex(index));
++
++              /* stall if endpoint doesn't exist */
++              if (!target_ep->desc)
++                      goto stall;
++              tmp = dr_ep_get_stall(ep_index(target_ep), ep_is_in(target_ep))
++                              << USB_ENDPOINT_HALT;
++      }
++
++      udc->ep0_dir = USB_DIR_IN;
++      /* Borrow the per device status_req */
++      req = udc->status_req;
++      /* Fill in the reqest structure */
++      *((u16 *) req->req.buf) = cpu_to_le16(tmp);
++      req->ep = ep;
++      req->req.length = 2;
++      req->req.status = -EINPROGRESS;
++      req->req.actual = 0;
++      req->req.complete = NULL;
++      req->dtd_count = 0;
++
++      /* prime the data phase */
++      if ((fsl_req_to_dtd(req) == 0))
++              status = fsl_queue_td(ep, req);
++      else                    /* no mem */
++              goto stall;
++
++      if (status) {
++              ERR("Can't respond to getstatus request \n");
++              goto stall;
++      }
++      list_add_tail(&req->queue, &ep->queue);
++      udc->ep0_state = DATA_STATE_XMIT;
++      return;
++stall:
++      ep0stall(udc);
++}
++
++static void ch9setconfig(struct fsl_udc *udc, u16 value, u16 index,
++                       u16 length)
++{
++      pr_debug("udc: 1 calling gadget driver->setup\n");
++      udc->ep0_dir = USB_DIR_IN;
++      if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff) >= 0) {
++              /* gadget layer deal with the status phase */
++              udc->usb_state = USB_STATE_CONFIGURED;
++              udc->ep0_state = WAIT_FOR_OUT_STATUS;
++              pr_debug("udc: ep0_state now WAIT_FOR_OUT_STATUS\n");
++      }
++}
++
++static void setup_received_irq(struct fsl_udc *udc,
++                             struct usb_ctrlrequest *setup)
++{
++      u32 tmp;
++      u16 ptc = 0;            /* port test control */
++      int handled = 1;        /* set to zero if we do not handle the message,
++                                 and should pass it to the gadget driver */
++
++      /*
++       * gadget drivers expect the setup pkt to be in wire format,
++       * so leave it alone and make local copies of stuff we need.
++       */
++      u16 wValue = le16_to_cpu(setup->wValue);
++      u16 wIndex = le16_to_cpu(setup->wIndex);
++      u16 wLength = le16_to_cpu(setup->wLength);
++
++
++      pr_debug("udc: request=0x%x\n", setup->bRequest);
++
++      udc_reset_ep_queue(udc, 0);
++
++      /* We asume setup only occurs on EP0 */
++      if (setup->bRequestType & USB_DIR_IN)
++              udc->ep0_dir = USB_DIR_IN;
++      else
++              udc->ep0_dir = USB_DIR_OUT;
++
++      if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_CLASS) {
++              /* handle class requests */
++              switch (setup->bRequest) {
++
++              case USB_BULK_RESET_REQUEST:
++                      udc->ep0_dir = USB_DIR_IN;
++                      if (udc->driver->setup(&udc->gadget,
++                                             &udc->local_setup_buff) >= 0) {
++                              udc->ep0_state = WAIT_FOR_SETUP;
++                              pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n");
++                      }
++                      break;
++
++              default:
++                      handled = 0;
++                      break;
++              }
++      } else if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
++              /* handle standard requests */
++              switch (setup->bRequest) {
++
++              case USB_REQ_GET_STATUS:
++                      if ((setup->
++                           bRequestType & (USB_DIR_IN | USB_TYPE_STANDARD))
++                          != (USB_DIR_IN | USB_TYPE_STANDARD))
++                              break;
++                      ch9getstatus(udc, setup->bRequestType, wValue, wIndex,
++                                   wLength);
++                      break;
++
++              case USB_REQ_SET_ADDRESS:
++                      if (setup->bRequestType !=
++                          (USB_DIR_OUT | USB_TYPE_STANDARD |
++                           USB_RECIP_DEVICE))
++                              break;
++                      ch9setaddress(udc, wValue, wIndex, wLength);
++                      break;
++
++              case USB_REQ_SET_CONFIGURATION:
++                      if (setup->bRequestType !=
++                          (USB_DIR_OUT | USB_TYPE_STANDARD |
++                           USB_RECIP_DEVICE))
++                              break;
++                      /* gadget layer take over the status phase */
++                      ch9setconfig(udc, wValue, wIndex, wLength);
++                      break;
++              case USB_REQ_SET_INTERFACE:
++                      if (setup->bRequestType !=
++                          (USB_DIR_OUT | USB_TYPE_STANDARD |
++                           USB_RECIP_INTERFACE))
++                              break;
++                      udc->ep0_dir = USB_DIR_IN;
++                      if (udc->driver->setup(&udc->gadget,
++                                             &udc->local_setup_buff) >= 0)
++                              /* gadget layer take over the status phase */
++                              break;
++                      /* Requests with no data phase */
++              case USB_REQ_CLEAR_FEATURE:
++              case USB_REQ_SET_FEATURE:
++                      {       /* status transaction */
++                              int rc = -EOPNOTSUPP;
++
++                              if ((setup->bRequestType & USB_TYPE_MASK) !=
++                                  USB_TYPE_STANDARD)
++                                      break;
++
++                              /* we only support set/clear feature for
++                               * endpoint */
++                              if (setup->bRequestType == USB_RECIP_ENDPOINT) {
++                                      int dir = (wIndex & 0x0080) ?
++                                          EP_DIR_IN : EP_DIR_OUT;
++                                      int num = (wIndex & 0x000f);
++                                      struct fsl_ep *ep;
++
++                                      if (wValue != 0
++                                          || wLength != 0
++                                          || (num * 2 + dir) > udc->max_ep)
++                                              break;
++                                      ep = &udc->eps[num * 2 + dir];
++
++                                      if (setup->bRequest ==
++                                          USB_REQ_SET_FEATURE) {
++                                              pr_debug("udc: udc: SET_FEATURE"
++                                                       " doing set_halt\n");
++                                              rc = fsl_ep_set_halt(&ep-> ep,
++                                                                   1);
++                                      } else {
++                                              pr_debug("udc: CLEAR_FEATURE"
++                                                       " doing clear_halt\n");
++                                              rc = fsl_ep_set_halt(&ep-> ep,
++                                                                   0);
++                                      }
++
++                              } else if (setup->bRequestType ==
++                                         USB_RECIP_DEVICE) {
++                                      if (setup->bRequest ==
++                                          USB_REQ_SET_FEATURE) {
++                                              ptc = wIndex >> 8;
++                                              rc = 0;
++                                      }
++                                      if (!udc->gadget.is_otg)
++                                              break;
++                                      else if (setup->bRequest ==
++                                               USB_DEVICE_B_HNP_ENABLE)
++                                              udc->gadget.b_hnp_enable = 1;
++                                      else if (setup->bRequest ==
++                                               USB_DEVICE_A_HNP_SUPPORT)
++                                              udc->gadget.a_hnp_support = 1;
++                                      else if (setup->bRequest ==
++                                               USB_DEVICE_A_ALT_HNP_SUPPORT)
++                                              udc->gadget.a_alt_hnp_support =
++                                                  1;
++                                      rc = 0;
++                              }
++                              if (rc == 0) {
++                                      /* send status only if
++                                       * fsl_ep_set_halt success */
++                                      if (ep0_prime_status(udc, EP_DIR_IN))
++                                              ep0stall(udc);
++                              }
++                              break;
++                      }
++              default:
++                      handled = 0;
++                      break;
++              }
++      } else {
++              /* vendor requests */
++              handled = 0;
++      }
++
++      if (!handled) {
++              if (udc->driver->setup(&udc->gadget, &udc->local_setup_buff)
++                  != 0) {
++                      ep0stall(udc);
++              } else if (setup->bRequestType & USB_DIR_IN) {
++                      udc->ep0_state = DATA_STATE_XMIT;
++                      pr_debug("udc: ep0_state now DATA_STATE_XMIT\n");
++              } else {
++                      udc->ep0_state = DATA_STATE_RECV;
++                      pr_debug("udc: ep0_state now DATA_STATE_RECV\n");
++              }
++      }
++
++      if (ptc) {
++              tmp =fsl_readl(&dr_regs->portsc1) | ptc << 16;
++              fsl_writel(tmp, &dr_regs->portsc1);
++              pr_debug("udc: switch to test mode.\n");
++      }
++}
++
++/* Process request for Data or Status phase of ep0
++ * prime status phase if needed */
++static void ep0_req_complete(struct fsl_udc *udc, struct fsl_ep *ep0,
++              struct fsl_req *req)
++{
++      if (udc->usb_state == USB_STATE_ADDRESS) {
++              /* Set the new address */
++              u32 new_address = (u32) udc->device_address;
++              fsl_writel(new_address << USB_DEVICE_ADDRESS_BIT_POS,
++                              &dr_regs->deviceaddr);
++      }
++
++      done(ep0, req, 0);
++
++      switch (udc->ep0_state) {
++      case DATA_STATE_XMIT:
++              /* receive status phase */
++              if (ep0_prime_status(udc, EP_DIR_OUT))
++                      ep0stall(udc);
++              break;
++      case DATA_STATE_RECV:
++              /* send status phase */
++              if (ep0_prime_status(udc, EP_DIR_IN))
++                      ep0stall(udc);
++              break;
++      case WAIT_FOR_OUT_STATUS:
++              udc->ep0_state = WAIT_FOR_SETUP;
++              break;
++      case WAIT_FOR_SETUP:
++              ERR("Unexpect ep0 packets \n");
++              break;
++      default:
++              ep0stall(udc);
++              break;
++      }
++}
++
++/* Tripwire mechanism to ensure a setup packet payload is extracted without
++ * being corrupted by another incoming setup packet */
++static void tripwire_handler(struct fsl_udc *udc, u8 ep_num, u8 *buffer_ptr)
++{
++      u32 temp;
++      struct ep_queue_head *qh;
++      struct fsl_usb2_platform_data *pdata = udc->pdata;
++
++      qh = &udc->ep_qh[ep_num * 2 + EP_DIR_OUT];
++
++      /* Clear bit in ENDPTSETUPSTAT */
++      temp = fsl_readl(&dr_regs->endptsetupstat);
++      fsl_writel(temp | (1 << ep_num), &dr_regs->endptsetupstat);
++
++      /* while a hazard exists when setup package arrives */
++      do {
++              /* Set Setup Tripwire */
++              temp = fsl_readl(&dr_regs->usbcmd);
++              fsl_writel(temp | USB_CMD_SUTW, &dr_regs->usbcmd);
++
++              /* Copy the setup packet to local buffer */
++              if (pdata->le_setup_buf) {
++                      u32 *p = (u32 *)buffer_ptr;
++                      u32 *s = (u32 *)qh->setup_buffer;
++                      
++                      /* Convert little endian setup buffer to CPU endian */
++                      *p++ = le32_to_cpu(*s++);
++                      *p = le32_to_cpu(*s);
++              } else {
++                      memcpy(buffer_ptr, (u8 *) qh->setup_buffer, 8);
++              }
++      } while (!(fsl_readl(&dr_regs->usbcmd) & USB_CMD_SUTW));
++
++      /* Clear Setup Tripwire */
++      temp = fsl_readl(&dr_regs->usbcmd);
++      fsl_writel(temp & ~USB_CMD_SUTW, &dr_regs->usbcmd);
++}
++
++/* process-ep_req(): free the completed Tds for this req */
++static int process_ep_req(struct fsl_udc *udc, int pipe,
++              struct fsl_req *curr_req)
++{
++      struct ep_td_struct *curr_td;
++      int     td_complete, actual, remaining_length, j, tmp;
++      int     status = 0;
++      int     errors = 0;
++      struct  ep_queue_head *curr_qh = &udc->ep_qh[pipe];
++      int direction = pipe % 2;
++
++      curr_td = curr_req->head;
++      td_complete = 0;
++      actual = curr_req->req.length;
++
++      for (j = 0; j < curr_req->dtd_count; j++) {
++              remaining_length = (hc32_to_cpu(curr_td->size_ioc_sts)
++                                      & DTD_PACKET_SIZE)
++                              >> DTD_LENGTH_BIT_POS;
++              actual -= remaining_length;
++
++              (errors = hc32_to_cpu(curr_td->size_ioc_sts) & DTD_ERROR_MASK);
++              if (errors) {
++                      if (errors & DTD_STATUS_HALTED) {
++                              ERR("dTD error %08x QH=%d\n", errors, pipe);
++                              /* Clear the errors and Halt condition */
++                              tmp = hc32_to_cpu(curr_qh->size_ioc_int_sts);
++                              tmp &= ~errors;
++                              curr_qh->size_ioc_int_sts = cpu_to_hc32(tmp);
++                              status = -EPIPE;
++                              /* FIXME: continue with next queued TD? */
++
++                              break;
++                      }
++                      if (errors & DTD_STATUS_DATA_BUFF_ERR) {
++                              VDBG("Transfer overflow");
++                              status = -EPROTO;
++                              break;
++                      } else if (errors & DTD_STATUS_TRANSACTION_ERR) {
++                              VDBG("ISO error");
++                              status = -EILSEQ;
++                              break;
++                      } else
++                              ERR("Unknown error has occured (0x%x)!\r\n",
++                                      errors);
++
++              } else if (hc32_to_cpu(curr_td->size_ioc_sts) &
++                                      DTD_STATUS_ACTIVE) {
++                      VDBG("Request not complete");
++                      status = REQ_UNCOMPLETE;
++                      return status;
++              } else if (remaining_length) {
++                      if (direction) {
++                              VDBG("Transmit dTD remaining length not zero");
++                              status = -EPROTO;
++                              break;
++                      } else {
++                              td_complete++;
++                              break;
++                      }
++              } else {
++                      td_complete++;
++                      VDBG("dTD transmitted successful ");
++              }
++
++              if (j != curr_req->dtd_count - 1)
++                      curr_td = curr_td->next_td_virt;
++      }
++
++      if (status)
++              return status;
++
++      curr_req->req.actual = actual;
++
++      return 0;
++}
++
++/* Process a DTD completion interrupt */
++static void dtd_complete_irq(struct fsl_udc *udc)
++{
++      u32 bit_pos;
++      int i, ep_num, direction, bit_mask, status;
++      struct fsl_ep *curr_ep;
++      struct fsl_req *curr_req, *temp_req;
++
++      /* Clear the bits in the register */
++      bit_pos = fsl_readl(&dr_regs->endptcomplete);
++      fsl_writel(bit_pos, &dr_regs->endptcomplete);
++
++      if (!bit_pos)
++              return;
++
++      for (i = 0; i < udc->max_ep * 2; i++) {
++              ep_num = i >> 1;
++              direction = i % 2;
++
++              bit_mask = 1 << (ep_num + 16 * direction);
++
++              if (!(bit_pos & bit_mask))
++                      continue;
++
++              curr_ep = get_ep_by_pipe(udc, i);
++
++              /* If the ep is configured */
++              if (curr_ep->name == NULL) {
++                      WARN("Invalid EP?");
++                      continue;
++              }
++
++              /* process the req queue until an uncomplete request */
++              list_for_each_entry_safe(curr_req, temp_req, &curr_ep->queue,
++                              queue) {
++                      status = process_ep_req(udc, i, curr_req);
++
++                      VDBG("status of process_ep_req= %d, ep = %d",
++                                      status, ep_num);
++                      if (status == REQ_UNCOMPLETE)
++                              break;
++                      /* write back status to req */
++                      curr_req->req.status = status;
++
++                      if (ep_num == 0) {
++                              ep0_req_complete(udc, curr_ep, curr_req);
++                              break;
++                      } else {
++                              done(curr_ep, curr_req, status);
++                      }
++              }
++      }
++}
++
++/* Process a port change interrupt */
++static void port_change_irq(struct fsl_udc *udc)
++{
++      u32 speed;
++
++      VDBG("portsc=0x%x", fsl_readl(&dr_regs->portsc1) );
++      if (udc->bus_reset)
++              udc->bus_reset = 0;
++
++      /* Bus resetting is finished */
++      if (!(fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET)) {
++              /* Get the speed */
++              speed = fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SPEED_MASK;
++              switch (speed) {
++              case PORTSCX_PORT_SPEED_HIGH:
++                      udc->gadget.speed = USB_SPEED_HIGH;
++                      break;
++              case PORTSCX_PORT_SPEED_FULL:
++                      udc->gadget.speed = USB_SPEED_FULL;
++                      break;
++              case PORTSCX_PORT_SPEED_LOW:
++                      udc->gadget.speed = USB_SPEED_LOW;
++                      break;
++              default:
++                      udc->gadget.speed = USB_SPEED_UNKNOWN;
++                      break;
++              }
++      }
++
++      /* Update USB state */
++      if (!udc->resume_state)
++              udc->usb_state = USB_STATE_DEFAULT;
++}
++
++/* Process suspend interrupt */
++static void suspend_irq(struct fsl_udc *udc)
++{
++      udc->resume_state = udc->usb_state;
++      udc->usb_state = USB_STATE_SUSPENDED;
++
++      /* report suspend to the driver, serial.c does not support this */
++      if (udc->driver->suspend)
++              udc->driver->suspend(&udc->gadget);
++}
++
++static void bus_resume(struct fsl_udc *udc)
++{
++      udc->usb_state = udc->resume_state;
++      udc->resume_state = 0;
++
++      /* report resume to the driver, serial.c does not support this */
++      if (udc->driver->resume)
++              udc->driver->resume(&udc->gadget);
++}
++
++/* Clear up all ep queues */
++static int reset_queues(struct fsl_udc *udc)
++{
++      u8 pipe;
++
++      for (pipe = 0; pipe < udc->max_pipes; pipe++)
++              udc_reset_ep_queue(udc, pipe);
++
++      /* report disconnect; the driver is already quiesced */
++      udc->driver->disconnect(&udc->gadget);
++
++      return 0;
++}
++
++/* Process reset interrupt */
++static void reset_irq(struct fsl_udc *udc)
++{
++      u32 temp;
++      unsigned long timeout;
++
++      /* Clear the device address */
++      temp = fsl_readl(&dr_regs->deviceaddr);
++      fsl_writel(temp & ~USB_DEVICE_ADDRESS_MASK, &dr_regs->deviceaddr);
++
++      udc->device_address = 0;
++
++      /* Clear usb state */
++      udc->resume_state = 0;
++      udc->ep0_dir = 0;
++      udc->ep0_state = WAIT_FOR_SETUP;
++      udc->remote_wakeup = 0; /* default to 0 on reset */
++      udc->gadget.b_hnp_enable = 0;
++      udc->gadget.a_hnp_support = 0;
++      udc->gadget.a_alt_hnp_support = 0;
++
++      /* Clear all the setup token semaphores */
++      temp = fsl_readl(&dr_regs->endptsetupstat);
++      fsl_writel(temp, &dr_regs->endptsetupstat);
++
++      /* Clear all the endpoint complete status bits */
++      temp = fsl_readl(&dr_regs->endptcomplete);
++      fsl_writel(temp, &dr_regs->endptcomplete);
++
++      timeout = jiffies + 100;
++      while (fsl_readl(&dr_regs->endpointprime)) {
++              /* Wait until all endptprime bits cleared */
++              if (time_after(jiffies, timeout)) {
++                      ERR("Timeout for reset\n");
++                      break;
++              }
++              cpu_relax();
++      }
++
++      /* Write 1s to the flush register */
++      fsl_writel(0xffffffff, &dr_regs->endptflush);
++
++      if (fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_RESET) {
++              VDBG("Bus reset");
++              /* Bus is reseting */
++              udc->bus_reset = 1;
++              /* Reset all the queues, include XD, dTD, EP queue
++               * head and TR Queue */
++              reset_queues(udc);
++              udc->usb_state = USB_STATE_DEFAULT;
++      } else {
++              VDBG("Controller reset");
++              /* initialize usb hw reg except for regs for EP, not
++               * touch usbintr reg */
++              dr_controller_setup(udc);
++
++              /* Reset all internal used Queues */
++              reset_queues(udc);
++
++              ep0_setup(udc);
++
++              /* Enable DR IRQ reg, Set Run bit, change udc state */
++              dr_controller_run(udc);
++              udc->usb_state = USB_STATE_ATTACHED;
++      }
++}
++
++/*
++ * USB device controller interrupt handler
++ */
++static irqreturn_t fsl_udc_irq(int irq, void *_udc)
++{
++      struct fsl_udc *udc = _udc;
++      u32 irq_src;
++      irqreturn_t status = IRQ_NONE;
++      unsigned long flags;
++
++      /* Disable ISR for OTG host mode */
++      if (udc->stopped)
++              return IRQ_NONE;
++      spin_lock_irqsave(&udc->lock, flags);
++      irq_src = fsl_readl(&dr_regs->usbsts) & fsl_readl(&dr_regs->usbintr);
++      /* Clear notification bits */
++      fsl_writel(irq_src, &dr_regs->usbsts);
++
++      VDBG("irq_src [0x%8x]  portsc=0x%x", irq_src,
++           fsl_readl(&dr_regs->portsc1));
++
++      /* Need to resume? */
++      if (udc->usb_state == USB_STATE_SUSPENDED)
++              if ((fsl_readl(&dr_regs->portsc1) & PORTSCX_PORT_SUSPEND) == 0)
++                      bus_resume(udc);
++
++      /* USB Interrupt */
++      if (irq_src & USB_STS_INT) {
++              VDBG("Packet int");
++              /* Setup package, we only support ep0 as control ep */
++              if (fsl_readl(&dr_regs->endptsetupstat) & EP_SETUP_STATUS_EP0) {
++                      tripwire_handler(udc, 0,
++                                      (u8 *) (&udc->local_setup_buff));
++                      setup_received_irq(udc, &udc->local_setup_buff);
++                      status = IRQ_HANDLED;
++              }
++
++              /* completion of dtd */
++              if (fsl_readl(&dr_regs->endptcomplete)) {
++                      dtd_complete_irq(udc);
++                      status = IRQ_HANDLED;
++              }
++      }
++
++      /* SOF (for ISO transfer) */
++      if (irq_src & USB_STS_SOF) {
++              status = IRQ_HANDLED;
++      }
++
++      /* Port Change */
++      if (irq_src & USB_STS_PORT_CHANGE) {
++              port_change_irq(udc);
++              status = IRQ_HANDLED;
++      }
++
++      /* Reset Received */
++      if (irq_src & USB_STS_RESET) {
++              reset_irq(udc);
++              status = IRQ_HANDLED;
++      }
++
++      /* Sleep Enable (Suspend) */
++      if (irq_src & USB_STS_SUSPEND) {
++              suspend_irq(udc);
++              status = IRQ_HANDLED;
++      }
++
++      if (irq_src & (USB_STS_ERR | USB_STS_SYS_ERR)) {
++              VDBG("Error IRQ %x ", irq_src);
++      }
++
++      spin_unlock_irqrestore(&udc->lock, flags);
++      return status;
++}
++
++/*----------------------------------------------------------------*
++ * Hook to gadget drivers
++ * Called by initialization code of gadget drivers
++*----------------------------------------------------------------*/
++int usb_gadget_register_driver(struct usb_gadget_driver *driver)
++{
++      int retval = -ENODEV;
++      unsigned long flags = 0;
++      struct fsl_udc *udc = udc_controller;
++
++      pr_debug("udc: udc=0x%p\n", udc);
++
++      if (!udc)
++              return -ENODEV;
++
++      if (!driver || (driver->speed != USB_SPEED_FULL
++                      && driver->speed != USB_SPEED_HIGH)
++                      || !driver->bind || !driver->disconnect
++                      || !driver->setup)
++              return -EINVAL;
++
++      if (udc->driver)
++              return -EBUSY;
++
++      /* lock is needed but whether should use this lock or another */
++      spin_lock_irqsave(&udc->lock, flags);
++
++      driver->driver.bus = 0;
++      udc->softconnect = 1;
++      /* hook up the driver */
++      udc->driver = driver;
++      udc->gadget.dev.driver = &driver->driver;
++      spin_unlock_irqrestore(&udc->lock, flags);
++
++      /* bind udc driver to gadget driver */
++      retval = driver->bind(&udc->gadget);
++      if (retval) {
++              pr_debug("bind to %s --> %d\n", driver->driver.name, retval);
++              udc->gadget.dev.driver = 0;
++              udc->driver = 0;
++              goto out;
++      }
++
++      /* Enable DR IRQ reg and Set usbcmd reg  Run bit */
++      if (udc->transceiver) {
++              /* Suspend the controller until OTG enables it */
++              udc_suspend(udc);
++              pr_debug("udc: suspend udc for OTG auto detect \n");
++
++              /* Export udc suspend/resume call to OTG */
++              udc->gadget.dev.parent->driver->suspend = fsl_udc_suspend;
++              udc->gadget.dev.parent->driver->resume = fsl_udc_resume;
++
++              retval = otg_set_peripheral(udc->transceiver, &udc->gadget);
++              if (retval < 0) {
++                      printk(KERN_ERR "can't bind to transceiver\n");
++                      driver->unbind(&udc->gadget);
++                      udc->gadget.dev.driver = 0;
++                      udc->driver = 0;
++                      return retval;
++              }
++      } else {
++              /* Enable DR IRQ reg and Set usbcmd reg  Run bit */
++              dr_controller_run(udc);
++              udc->usb_state = USB_STATE_ATTACHED;
++              udc->ep0_state = WAIT_FOR_SETUP;
++              pr_debug("udc: ep0_state now WAIT_FOR_SETUP\n");
++              udc->ep0_dir = 0;
++      }
++
++      printk(KERN_INFO "%s: bind to driver %s \n", udc->gadget.name,
++              driver->driver.name);
++
++out:
++      return retval;
++}
++EXPORT_SYMBOL(usb_gadget_register_driver);
++
++/* Disconnect from gadget driver */
++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
++{
++      struct fsl_ep *loop_ep;
++      unsigned long flags;
++
++      if (!udc_controller)
++              return -ENODEV;
++
++      if (!driver || driver != udc_controller->driver || !driver->unbind)
++              return -EINVAL;
++
++#ifdef CONFIG_USB_OTG
++      if (udc_controller->transceiver)
++              (void)otg_set_peripheral(udc_controller->transceiver, 0);
++#endif
++
++      /* stop DR, disable intr */
++      dr_controller_stop(udc_controller);
++
++      /* in fact, no needed */
++      udc_controller->usb_state = USB_STATE_ATTACHED;
++      udc_controller->ep0_state = WAIT_FOR_SETUP;
++      udc_controller->ep0_dir = 0;
++
++      /* stand operation */
++      spin_lock_irqsave(&udc_controller->lock, flags);
++      udc_controller->gadget.speed = USB_SPEED_UNKNOWN;
++      nuke(&udc_controller->eps[0], -ESHUTDOWN);
++      list_for_each_entry(loop_ep, &udc_controller->gadget.ep_list,
++                      ep.ep_list)
++              nuke(loop_ep, -ESHUTDOWN);
++      spin_unlock_irqrestore(&udc_controller->lock, flags);
++
++      /* unbind gadget and unhook driver. */
++      driver->unbind(&udc_controller->gadget);
++      udc_controller->gadget.dev.driver = 0;
++      udc_controller->driver = 0;
++
++      printk(KERN_INFO "unregistered gadget '%s'\n", driver->driver.name);
++      return 0;
++}
++EXPORT_SYMBOL(usb_gadget_unregister_driver);
++
++/*-------------------------------------------------------------------------
++              PROC File System Support
++-------------------------------------------------------------------------*/
++#ifdef CONFIG_USB_GADGET_DEBUG_FILES
++
++#include <linux/seq_file.h>
++
++static const char proc_filename[] = "driver/fsl_usb2_udc";
++
++static int fsl_proc_read(char *page, char **start, off_t off, int count,
++              int *eof, void *_dev)
++{
++      char *buf = page;
++      char *next = buf;
++      unsigned size = count;
++      unsigned long flags;
++      int t, i;
++      u32 tmp_reg;
++      struct fsl_ep *ep = NULL;
++      struct fsl_req *req;
++
++      struct fsl_udc *udc = udc_controller;
++      if (off != 0)
++              return 0;
++
++      spin_lock_irqsave(&udc->lock, flags);
++
++      /* ------basic driver infomation ---- */
++      t = scnprintf(next, size,
++                      DRIVER_DESC "\n"
++                      "%s version: %s\n"
++                      "Gadget driver: %s\n\n",
++                      driver_name, DRIVER_VERSION,
++                      udc->driver ? udc->driver->driver.name : "(none)");
++      size -= t;
++      next += t;
++
++      /* ------ DR Registers ----- */
++      tmp_reg = fsl_readl(&dr_regs->usbcmd);
++      t = scnprintf(next, size,
++                      "USBCMD reg: 0x%08x\n"
++                      "\tSetupTW: %d\n"
++                      "\tRun/Stop: %s\n\n",
++                      tmp_reg,
++                      (tmp_reg & USB_CMD_SUTW) ? 1 : 0,
++                      (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop");
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->usbsts);
++      t = scnprintf(next, size,
++                      "USB Status Reg: 0x%08x\n"
++                      "\tDr Suspend: %d   Reset Received: %d   "
++                      "System Error: %s  USB Error Interrupt: %s\n\n",
++                      tmp_reg,
++                      (tmp_reg & USB_STS_SUSPEND) ? 1 : 0,
++                      (tmp_reg & USB_STS_RESET) ? 1 : 0,
++                      (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal",
++                      (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err");
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->usbintr);
++      t = scnprintf(next, size,
++                      "USB Interrupt Enable Reg: 0x%08x\n"
++                      "\tSleep Enable: %d   SOF Received Enable: %d  "
++                      "Reset Enable: %d\n"
++                      "\tSystem Error Enable: %d  "
++                      "Port Change Dectected Enable: %d\n"
++                      "\tUSB Error Intr Enable: %d  USB Intr Enable: %d\n\n",
++                      tmp_reg,
++                      (tmp_reg & USB_INTR_DEVICE_SUSPEND) ? 1 : 0,
++                      (tmp_reg & USB_INTR_SOF_EN) ? 1 : 0,
++                      (tmp_reg & USB_INTR_RESET_EN) ? 1 : 0,
++                      (tmp_reg & USB_INTR_SYS_ERR_EN) ? 1 : 0,
++                      (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0,
++                      (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0,
++                      (tmp_reg & USB_INTR_INT_EN) ? 1 : 0);
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->frindex);
++      t = scnprintf(next, size,
++                      "USB Frame Index Reg:  Frame Number is 0x%x\n\n",
++                      (tmp_reg & USB_FRINDEX_MASKS));
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->deviceaddr);
++      t = scnprintf(next, size,
++                      "USB Device Address Reg:  Device Addr is 0x%x\n\n",
++                      (tmp_reg & USB_DEVICE_ADDRESS_MASK));
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->endpointlistaddr);
++      t = scnprintf(next, size,
++                      "USB Endpoint List Address Reg:"
++                      "Device Addr is 0x%x\n\n",
++                      (tmp_reg & USB_EP_LIST_ADDRESS_MASK));
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->portsc1);
++      t = scnprintf(next, size,
++              "USB Port Status&Control Reg:\n"
++              "\tPort Transceiver Type : %s" "Port Speed: %s \n"
++              "\tPHY Low Power Suspend: %s" "Port Reset: %s  "
++              "Port Suspend Mode: %s \n" "\tOver-current Change: %s  "
++              "Port Enable/Disable Change: %s\n"
++              "\tPort Enabled/Disabled: %s"
++              "Current Connect Status: %s\n\n", ( {
++                      char *s;
++                      switch (tmp_reg & PORTSCX_PTS_FSLS) {
++                      case PORTSCX_PTS_UTMI:
++                              s = "UTMI"; break;
++                      case PORTSCX_PTS_ULPI:
++                              s = "ULPI "; break;
++                      case PORTSCX_PTS_FSLS:
++                              s = "FS/LS Serial"; break;
++                      default:
++                              s = "None"; break;
++                      }
++                      s; } ), ( {
++                      char *s;
++                      switch (tmp_reg & PORTSCX_PORT_SPEED_UNDEF) {
++                      case PORTSCX_PORT_SPEED_FULL:
++                              s = "Full Speed"; break;
++                      case PORTSCX_PORT_SPEED_LOW:
++                              s = "Low Speed"; break;
++                      case PORTSCX_PORT_SPEED_HIGH:
++                              s = "High Speed"; break;
++                      default:
++                              s = "Undefined"; break;
++                      }
++                      s;
++              } ),
++              (tmp_reg & PORTSCX_PHY_LOW_POWER_SPD) ?
++              "Normal PHY mode" : "Low power mode",
++              (tmp_reg & PORTSCX_PORT_RESET) ? "In Reset" :
++              "Not in Reset",
++              (tmp_reg & PORTSCX_PORT_SUSPEND) ? "In " : "Not in",
++              (tmp_reg & PORTSCX_OVER_CURRENT_CHG) ? "Dected" :
++              "No",
++              (tmp_reg & PORTSCX_PORT_EN_DIS_CHANGE) ? "Disable" :
++              "Not change",
++              (tmp_reg & PORTSCX_PORT_ENABLE) ? "Enable" :
++              "Not correct",
++              (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ?
++              "Attached" : "Not-Att");
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->usbmode);
++      t = scnprintf(next, size,
++                      "USB Mode Reg:" "Controller Mode is : %s\n\n", ( {
++                              char *s;
++                              switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) {
++                              case USB_MODE_CTRL_MODE_IDLE:
++                                      s = "Idle"; break;
++                              case USB_MODE_CTRL_MODE_DEVICE:
++                                      s = "Device Controller"; break;
++                              case USB_MODE_CTRL_MODE_HOST:
++                                      s = "Host Controller"; break;
++                              default:
++                                      s = "None"; break;
++                              }
++                              s;
++                      } ));
++      size -= t;
++      next += t;
++
++      tmp_reg = fsl_readl(&dr_regs->endptsetupstat);
++      t = scnprintf(next, size,
++                      "Endpoint Setup Status Reg:" "SETUP on ep 0x%x\n\n",
++                      (tmp_reg & EP_SETUP_STATUS_MASK));
++      size -= t;
++      next += t;
++
++      for (i = 0; i < udc->max_ep / 2; i++) {
++              tmp_reg = fsl_readl(&dr_regs->endptctrl[i]);
++              t = scnprintf(next, size, "EP Ctrl Reg [0x%x]: = [0x%x]\n",
++                              i, tmp_reg);
++              size -= t;
++              next += t;
++      }
++      tmp_reg = fsl_readl(&dr_regs->endpointprime);
++      t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n", tmp_reg);
++      size -= t;
++      next += t;
++
++#ifdef HAVE_SYS_REGS
++      tmp_reg = usb_sys_regs->snoop1;
++      t = scnprintf(next, size, "\nSnoop1 Reg : = [0x%x]\n\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      tmp_reg = usb_sys_regs->control;
++      t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n",
++                      tmp_reg);
++      size -= t;
++      next += t;
++#endif
++
++      /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */
++      ep = &udc->eps[0];
++      t = scnprintf(next, size, "For %s Maxpkt is 0x%x index is 0x%x\n",
++                      ep->ep.name, ep_maxpacket(ep), ep_index(ep));
++      size -= t;
++      next += t;
++
++      if (list_empty(&ep->queue)) {
++              t = scnprintf(next, size, "its req queue is empty\n\n");
++              size -= t;
++              next += t;
++      } else {
++              list_for_each_entry(req, &ep->queue, queue) {
++                      t = scnprintf(next, size,
++                              "req %p actual 0x%x length 0x%x  buf %p\n",
++                              &req->req, req->req.actual,
++                              req->req.length, req->req.buf);
++                      size -= t;
++                      next += t;
++              }
++      }
++      /* other gadget->eplist ep */
++      list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
++              if (ep->desc) {
++                      t = scnprintf(next, size,
++                                      "\nFor %s Maxpkt is 0x%x "
++                                      "index is 0x%x\n",
++                                      ep->ep.name, ep_maxpacket(ep),
++                                      ep_index(ep));
++                      size -= t;
++                      next += t;
++
++                      if (list_empty(&ep->queue)) {
++                              t = scnprintf(next, size,
++                                              "its req queue is empty\n\n");
++                              size -= t;
++                              next += t;
++                      } else {
++                              list_for_each_entry(req, &ep->queue, queue) {
++                                      t = scnprintf(next, size,
++                                              "req %p actual 0x%x length"
++                                              "0x%x  buf %p\n",
++                                              &req->req, req->req.actual,
++                                              req->req.length, req->req.buf);
++                                      size -= t;
++                                      next += t;
++                                      } /* end for each_entry of ep req */
++                              }       /* end for else */
++                      }       /* end for if(ep->queue) */
++              }               /* end (ep->desc) */
++
++      spin_unlock_irqrestore(&udc->lock, flags);
++
++      *eof = 1;
++      return count - size;
++}
++
++#define create_proc_file()    create_proc_read_entry(proc_filename, \
++                              0, NULL, fsl_proc_read, NULL)
++
++#define remove_proc_file()    remove_proc_entry(proc_filename, NULL)
++
++#else                         /* !CONFIG_USB_GADGET_DEBUG_FILES */
++
++#define create_proc_file()    do {} while (0)
++#define remove_proc_file()    do {} while (0)
++
++#endif                                /* CONFIG_USB_GADGET_DEBUG_FILES */
++
++/*-------------------------------------------------------------------------*/
++
++/* Release udc structures */
++static void fsl_udc_release(struct device *dev)
++{
++      complete(udc_controller->done);
++      dma_free_coherent(dev, udc_controller->ep_qh_size,
++                      udc_controller->ep_qh, udc_controller->ep_qh_dma);
++      kfree(udc_controller);
++}
++
++/******************************************************************
++      Internal structure setup functions
++*******************************************************************/
++/*------------------------------------------------------------------
++ * init resource for globle controller
++ * Return the udc handle on success or NULL on failure
++ ------------------------------------------------------------------*/
++static struct fsl_udc *__init struct_udc_setup(struct platform_device *pdev)
++{
++      struct fsl_udc *udc;
++      struct fsl_usb2_platform_data *pdata;
++      size_t size;
++
++      udc = kzalloc(sizeof(struct fsl_udc), GFP_KERNEL);
++      if (udc == NULL) {
++              ERR("malloc udc failed\n");
++              return NULL;
++      }
++
++      pdata = pdev->dev.platform_data;
++      udc->phy_mode = pdata->phy_mode;        /* DDD FIXME */
++
++      /* max_ep_nr is bidirectional ep number, max_ep doubles the number */
++      udc->max_ep = pdata->max_ep_nr * 2;
++
++      udc->eps = kzalloc(sizeof(struct fsl_ep) * udc->max_ep, GFP_KERNEL);
++      if (!udc->eps) {
++              ERR("malloc fsl_ep failed\n");
++              goto cleanup;
++      }
++
++      /* initialized QHs, take care of alignment */
++      size = udc->max_ep * sizeof(struct ep_queue_head);
++      if (size < QH_ALIGNMENT)
++              size = QH_ALIGNMENT;
++      else if ((size % QH_ALIGNMENT) != 0) {
++              size += QH_ALIGNMENT + 1;
++              size &= ~(QH_ALIGNMENT - 1);
++      }
++      udc->ep_qh = dma_alloc_coherent(&pdev->dev, size,
++                                      &udc->ep_qh_dma, GFP_KERNEL);
++      if (!udc->ep_qh) {
++              ERR("malloc QHs for udc failed\n");
++              kfree(udc->eps);
++              goto cleanup;
++      }
++
++      udc->ep_qh_size = size;
++
++      /* Initialize ep0 status request structure */
++      udc->status_req = container_of(fsl_alloc_request(NULL, GFP_KERNEL),
++                      struct fsl_req, req);
++      /* allocate a small amount of memory to get valid address */
++      udc->status_req->req.buf = kmalloc(8, GFP_KERNEL);
++      udc->status_req->req.dma = virt_to_phys(udc->status_req->req.buf);
++
++      udc->resume_state = USB_STATE_NOTATTACHED;
++      udc->usb_state = USB_STATE_POWERED;
++      udc->ep0_dir = 0;
++      udc->remote_wakeup = 0; /* default to 0 on reset */
++      spin_lock_init(&udc->lock);
++
++      return udc;
++
++cleanup:
++      kfree(udc);
++      return NULL;
++}
++
++/*----------------------------------------------------------------
++ * Setup the fsl_ep struct for eps
++ * Link fsl_ep->ep to gadget->ep_list
++ * ep0out is not used so do nothing here
++ * ep0in should be taken care
++ *--------------------------------------------------------------*/
++static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index,
++              char *name, int link)
++{
++      struct fsl_ep *ep = &udc->eps[index];
++
++      ep->udc = udc;
++      strcpy(ep->name, name);
++      ep->ep.name = ep->name;
++
++      ep->ep.ops = &fsl_ep_ops;
++      ep->stopped = 0;
++
++      /* for ep0: maxP defined in desc
++       * for other eps, maxP is set by epautoconfig() called by gadget layer
++       */
++      ep->ep.maxpacket = (unsigned short) ~0;
++
++      /* the queue lists any req for this ep */
++      INIT_LIST_HEAD(&ep->queue);
++
++      /* gagdet.ep_list used for ep_autoconfig so no ep0 */
++      if (link)
++              list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
++      ep->gadget = &udc->gadget;
++      ep->qh = &udc->ep_qh[index];
++
++      return 0;
++}
++
++static int board_init(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++
++      pr_debug("udc: pdev=0x%p  pdata=0x%p\n", pdev, pdata);
++
++      /*
++       * do platform specific init: check the clock, grab/config pins, etc.
++       */
++      if (pdata->platform_init && pdata->platform_init(pdev) != 0)
++              return -EINVAL;
++
++      return 0;
++}
++
++/* Driver probe functions */
++
++static int __init fsl_udc_probe(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      struct fsl_udc *udc;
++      unsigned int i;
++      struct otg_transceiver *transceiver = NULL;
++      int status = -ENODEV;
++      u32 id;
++      int irq_number;
++      u64 rsrc_start, rsrc_len;
++      int ret = -ENODEV;
++
++      pr_debug("udc: pdev=0x%p  pdata=0x%p\n", pdev, pdata);
++
++      if (board_init(pdev) != 0)
++              return -EINVAL;
++
++      /* Initialize the udc structure including QH member and other member */
++      udc = (struct fsl_udc *) struct_udc_setup(pdev);
++      udc_controller = udc;
++
++      if (!udc) {
++              ERR("udc is NULL \n");
++              return -ENOMEM;
++      }
++      dev_set_drvdata(&pdev->dev, udc);
++      pr_debug("udc_controller=0x%p", udc_controller);
++
++      udc->pdata = pdata;
++      udc->xcvr_type = pdata->xcvr_type;
++
++#ifdef CONFIG_USB_OTG
++      udc->transceiver = otg_get_transceiver();
++      pr_debug("udc: otg_get_transceiver returns 0x%p", udc->transceiver);
++#endif
++
++      if (pdev->resource[1].flags != IORESOURCE_IRQ)
++              return -ENODEV;
++
++      rsrc_start = pdev->resource[0].start;
++      rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
++
++      pr_debug("     start=0x%ux   end=0x%ux\n",
++               pdev->resource[0].start, pdev->resource[0].end);
++      pr_debug("rsrc_start=0x%llx  rsrc_len=0x%llx\n", rsrc_start, rsrc_len);
++
++      dr_regs = (struct fsl_usb_device_regs *)pdata->regs;
++
++      pr_debug("udc: pdate=0x%p dr_regs=0x%p\n", pdata, dr_regs);
++      pr_debug("udc: hci_version=0x%x\n", dr_regs->hciversion);
++      pr_debug("udc: otgsc at 0x%p\n", &dr_regs->otgsc);
++
++      id = fsl_readl(&dr_regs->id);
++      printk(KERN_INFO "FSL2 USBOTG h/w ID=0x%x  revision=0x%x\n",
++             id & 0x3f, id >> 16);
++
++      /* USB OTG module IRQ */
++      irq_number = platform_get_irq(pdev, 0);
++      if (irq_number > 128) {
++              status = request_irq(irq_number, fsl_udc_irq, IRQF_SHARED,
++                                   driver_name, udc);
++              if (status) {
++                      ERR("can't get irq %d, err=%d\n", irq_number, status);
++                      goto err2;
++              }
++      } else {
++              status = -ENODEV;
++              goto err2;
++      }
++
++      if (!udc->transceiver) {
++              /* initialize usb hw reg except for regs for EP,
++               * leave usbintr reg untouched*/
++              dr_controller_setup(udc);
++      }
++
++      /* here comes the stand operations for probe
++       * set the fsl_udc->gadget.xxx
++       */
++      udc->gadget.ops = &fsl_gadget_ops;
++
++      /* gadget.ep0 is a pointer */
++      udc->gadget.ep0 = &udc->eps[0].ep;
++      INIT_LIST_HEAD(&udc->gadget.ep_list);
++      udc->gadget.speed = USB_SPEED_UNKNOWN;
++      udc->gadget.name = driver_name;
++
++      /* Setup gadget.dev and register with kernel */
++      strcpy(udc->gadget.dev.bus_id, "gadget");
++      udc->gadget.dev.release = fsl_udc_release;
++      udc->gadget.dev.parent = &pdev->dev;
++
++      ret = device_register(&udc->gadget.dev);
++      if (ret < 0)
++              goto err3;
++
++      if (udc->transceiver)
++              udc->gadget.is_otg = 1;
++
++      /* setup QH and epctrl for ep0 */
++      ep0_setup(udc);
++
++      /* setup udc->eps[] for ep0 */
++      struct_ep_setup(udc_controller, 0, "ep0", 0);
++      /* for ep0: the desc defined here;
++       * for other eps, gadget layer called ep_enable with defined desc
++       */
++      udc->eps[0].desc = &fsl_ep0_desc;
++      udc->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD;
++
++      /* setup the udc->eps[] for non-control endpoints and link
++       * to gadget.ep_list */
++      for (i = 1; i < (int)(udc->max_ep / 2); i++) {
++              char name[14];
++
++              sprintf(name, "ep%dout", i);
++              struct_ep_setup(udc, i * 2, name, 1);
++              sprintf(name, "ep%din", i);
++              struct_ep_setup(udc, i * 2 + 1, name, 1);
++      }
++
++      /* use dma_pool for TD management */
++      udc_controller->td_pool = dma_pool_create("udc_td", &pdev->dev,
++                      sizeof(struct ep_td_struct),
++                      DTD_ALIGNMENT, UDC_DMA_BOUNDARY);
++      if (udc->td_pool == NULL) {
++              ret = -ENOMEM;
++              goto err4;
++      }
++#if 0 // DDD why this? hoarks OTG host
++      pullup_disable(udc);
++#endif
++
++      create_proc_file();
++      return 0;
++
++err4:
++      device_unregister(&udc_controller->gadget.dev);
++err3:
++      free_irq(udc_controller->irq, udc_controller);
++err2:
++      kfree(udc);
++      if (transceiver)
++              put_device(transceiver->dev);
++      release_mem_region(pdev->resource[0].start,
++                         pdev->resource[0].end - pdev->resource[0].start + 1);
++      return status;
++
++}
++
++/* Driver removal functions
++ * Free resources
++ * Finish pending transaction
++ */
++static int __exit fsl_udc_remove(struct platform_device *pdev)
++{
++      struct device *dev = &pdev->dev;
++      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
++      struct fsl_usb2_platform_data *pdata;
++      int irq_number;
++
++      DECLARE_COMPLETION(done);
++
++      pdata = pdev->dev.platform_data;
++
++      if (!udc)
++              return -ENODEV;
++
++      udc->done = &done;
++
++      /* DR has been stopped in usb_gadget_unregister_driver() */
++
++      if (udc->transceiver) {
++              put_device(udc->transceiver->dev);
++              udc->transceiver = NULL;
++      }
++
++      /* remove proc */
++      remove_proc_file();
++
++      /* free irq */
++      irq_number = udc->irq;
++      free_irq(pdev->resource[1].start, udc);
++      udc->irq = 0;
++
++      /* Free allocated memory */
++      kfree(udc->status_req->req.buf);
++      kfree(udc->status_req);
++      kfree(udc_controller->eps);
++
++      dma_pool_destroy(udc_controller->td_pool);
++      /* deinitlaize all ep: strcut */
++      /* deinitialize ep0: reg and QH */
++
++      device_unregister(&udc->gadget.dev);
++      /* free udc --wait for the release() finished */
++      wait_for_completion(&done);
++
++      /*
++       * do platform specific un-initialization:
++       * release iomux pins, etc.
++       */
++      if (pdata->platform_uninit)
++              pdata->platform_uninit(pdev);
++
++      return 0;
++}
++
++static int udc_suspend(struct fsl_udc *udc)
++{
++      udc->stopped = 1;
++      return 0;
++}
++
++/*
++ * Modify Power management attributes
++ * Used by OTG statemachine to disable gadget temporarily
++ * Here we stop the DR controller and disable the irq
++ * @param dev device controller pointer
++ * @param state current state
++ * @return The function returns 0 on success or -1 if failed
++ */
++static int fsl_udc_suspend(struct device *dev, pm_message_t state)
++{
++      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
++      pr_debug("udc: Suspend. state=%d\n", state.event);
++      return udc_suspend(udc);
++}
++
++static int udc_resume(struct fsl_udc *udc)
++{
++      /*Enable DR irq reg and set controller Run */
++      if (udc->stopped) {
++              dr_controller_setup(udc);
++              dr_controller_run(udc);
++      }
++      udc->usb_state = USB_STATE_ATTACHED;
++      udc->ep0_state = WAIT_FOR_SETUP;
++      udc->ep0_dir = 0;
++      return 0;
++}
++
++/*
++ * Invoked on USB resume. May be called in_interrupt.
++ * Here we start the DR controller and enable the irq
++ * @param dev device controller pointer
++ * @return The function returns 0 on success or -1 if failed
++ */
++static int fsl_udc_resume(struct device *dev)
++{
++      struct fsl_udc *udc = (struct fsl_udc *)dev_get_drvdata(dev);
++      pr_debug("udc: Resume dev=0x%p udc=0x%p\n", dev, udc);
++
++      return udc_resume(udc);
++}
++
++/*-------------------------------------------------------------------------
++      Register entry point for the peripheral controller driver
++--------------------------------------------------------------------------*/
++static struct platform_driver udc_driver = {
++      .probe   = fsl_udc_probe,
++      .remove  = __exit_p(fsl_udc_remove),
++      .driver  = {
++              .name = (char *)driver_name,
++              .owner = THIS_MODULE,
++      },
++};
++
++static int __init udc_init(void)
++{
++      printk(KERN_INFO "%s version %s init \n", driver_desc, DRIVER_VERSION);
++      return platform_driver_register(&udc_driver);
++}
++
++module_init(udc_init);
++
++static void __exit udc_exit(void)
++{
++      platform_driver_unregister(&udc_driver);
++      printk(KERN_INFO "%s unregistered \n", driver_desc);
++}
++
++module_exit(udc_exit);
++
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_LICENSE("GPL");
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -32,6 +32,7 @@ config USB_EHCI_HCD
+ config USB_EHCI_ROOT_HUB_TT
+       bool "Root Hub Transaction Translators (EXPERIMENTAL)"
+       depends on USB_EHCI_HCD && EXPERIMENTAL
++      default y if M54455
+       ---help---
+         Some EHCI chips have vendor-specific extensions to integrate
+         transaction translators, so that no OHCI or UHCI companion
+@@ -60,12 +61,12 @@ config USB_EHCI_TT_NEWSCHED
+ config USB_EHCI_BIG_ENDIAN_MMIO
+       bool
+-      depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX)
++      depends on USB_EHCI_HCD && (PPC_CELLEB || PPC_PS3 || 440EPX || ARCH_IXP4XX || M54455)
+       default y
+ config USB_EHCI_BIG_ENDIAN_DESC
+       bool
+-      depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX)
++      depends on USB_EHCI_HCD && (440EPX || ARCH_IXP4XX || M54455)
+       default y
+ config USB_EHCI_FSL
+@@ -260,3 +261,19 @@ config USB_R8A66597_HCD
+         To compile this driver as a module, choose M here: the
+         module will be called r8a66597-hcd.
++choice
++      prompt "Select transceiver"
++      depends on M54455
++      default USB_M5445X_ULPI 
++
++config USB_M5445X_ULPI
++      bool "External ULPI"
++      ---help---
++        Enable support for the external HS ULPI transceiver.
++
++config USB_M5445X_FSLS
++      bool "On-chip (FL/LS only)"
++      ---help---
++        Enable support for the on-chip FL/LS transceiver.
++endchoice
++
+--- /dev/null
++++ b/drivers/usb/host/ehci-arc.c
+@@ -0,0 +1,431 @@
++/*
++ * drivers/usb/host/ehci-arc.c
++ *
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/* Note: this file is #included by ehci-hcd.c */
++
++#include <linux/platform_device.h>
++#include <linux/usb/fsl_usb2.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/otg.h>
++
++#include "ehci-fsl.h"
++
++
++/* FIXME: Power Managment is un-ported so temporarily disable it */
++#undef CONFIG_PM
++
++/* PCI-based HCs are common, but plenty of non-PCI HCs are used too */
++
++/* configure so an HC device and id are always provided */
++/* always called with process context; sleeping is OK */
++
++/**
++ * usb_hcd_fsl_probe - initialize FSL-based HCDs
++ * @drvier: Driver to be used for this HCD
++ * @pdev: USB Host Controller being probed
++ * Context: !in_interrupt()
++ *
++ * Allocates basic resources for this USB host controller.
++ *
++ */
++static int usb_hcd_fsl_probe(const struct hc_driver *driver,
++                           struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      struct usb_hcd *hcd;
++      struct resource *res;
++      int irq;
++      int retval;
++
++      pr_debug("initializing FSL-SOC USB Controller\n");
++
++      /* Need platform data for setup */
++      if (!pdata) {
++              dev_err(&pdev->dev,
++                      "No platform data for %s.\n", pdev->dev.bus_id);
++              return -ENODEV;
++      }
++
++      retval = fsl_platform_verify(pdev);
++      if (retval)
++              return retval;
++
++      /*
++       * do platform specific init: check the clock, grab/config pins, etc.
++       */
++      if (pdata->platform_init && pdata->platform_init(pdev)) {
++              retval = -ENODEV;
++              goto err1;
++      }
++
++      res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
++      if (!res) {
++              dev_err(&pdev->dev,
++                      "Found HC with no IRQ. Check %s setup!\n",
++                      pdev->dev.bus_id);
++              return -ENODEV;
++      }
++      irq = res->start;
++
++      fsl_platform_set_vbus_power(pdev, 1);
++
++      hcd = usb_create_hcd(driver, &pdev->dev, pdev->dev.bus_id);
++      if (!hcd) {
++              retval = -ENOMEM;
++              goto err1;
++      }
++
++      if (pdata->regs) {
++              pr_debug("REGS: using pdata->regs (0x%p)\n", pdata->regs);
++              hcd->regs = pdata->regs;
++              hcd->rsrc_start = pdata->r_start;
++              hcd->rsrc_len = pdata->r_len;
++      } else {
++              pr_debug("REGS: NO pdata->regs\n");
++              res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++              if (!res) {
++                      dev_err(&pdev->dev, "Found HC with no register addr. "
++                              "Check %s setup!\n", pdev->dev.bus_id);
++                      retval = -ENODEV;
++                      goto err2;
++              }
++              hcd->rsrc_start = res->start;
++              hcd->rsrc_len = res->end - res->start + 1;
++
++              /*
++              printk("DDD %s(): rsrc_start=0x%llx  rsrc_len=0x%llx  "
++                      "pdata=0x%p\n", __FUNCTION__,
++                      hcd->rsrc_start, hcd->rsrc_len, pdata);
++              */
++
++              if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
++                                      driver->description)) {
++                      dev_dbg(&pdev->dev, "request_mem_region failed\n");
++                      retval = -EBUSY;
++                      goto err2;
++              }
++              hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
++
++              if (hcd->regs == NULL) {
++                      dev_dbg(&pdev->dev, "error mapping memory\n");
++                      retval = -EFAULT;
++                      goto err3;
++              }
++      }
++      hcd->power_budget = pdata->power_budget;
++
++      /* DDD
++       * the following must be done by this point, otherwise the OTG
++       * host port doesn't make it thru initializtion.
++       * ehci_halt(), called by ehci_fsl_setup() returns -ETIMEDOUT
++       */
++      fsl_platform_set_host_mode(hcd);
++
++      retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
++      if (retval != 0)
++              goto err4;
++
++#if defined(CONFIG_USB_OTG)
++      if (pdata->does_otg) {
++              struct ehci_hcd *ehci = hcd_to_ehci(hcd);
++
++              ehci->transceiver = otg_get_transceiver();
++
++              if (ehci->transceiver) {
++                      retval = otg_set_host(ehci->transceiver,
++                                            &ehci_to_hcd(ehci)->self);
++                      if (retval) {
++                              if (ehci->transceiver)
++                                      put_device(ehci->transceiver->dev);
++                              goto err3;
++                      }
++              } else {
++                      printk(KERN_ERR "can't find transceiver\n");
++                      retval = -ENODEV;
++                      goto err3;
++              }
++      }
++#endif
++
++      return retval;
++
++err4:
++      /* DDD only if we did the iomap() iounmap(hcd->regs); */
++err3:
++      /* DDD only if we did a request_
++       * release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
++       */
++err2:
++      usb_put_hcd(hcd);
++err1:
++      dev_err(&pdev->dev, "init %s fail, %d\n", pdev->dev.bus_id, retval);
++      if (pdata->platform_uninit)
++              pdata->platform_uninit(pdev);
++      return retval;
++}
++
++/* may be called without controller electrically present */
++/* may be called with controller, bus, and devices active */
++
++/**
++ * usb_hcd_fsl_remove - shutdown processing for FSL-based HCDs
++ * @dev: USB Host Controller being removed
++ * Context: !in_interrupt()
++ *
++ * Reverses the effect of usb_hcd_fsl_probe().
++ *
++ */
++static void usb_hcd_fsl_remove(struct usb_hcd *hcd,
++                             struct platform_device *pdev)
++{
++      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++
++      /* DDD shouldn't we turn off the power here? */
++      fsl_platform_set_vbus_power(pdev, 0);
++
++      usb_remove_hcd(hcd);
++
++      if (ehci->transceiver) {
++              (void)otg_set_host(ehci->transceiver, 0);
++              put_device(ehci->transceiver->dev);
++      }
++      usb_put_hcd(hcd);
++
++      /*
++       * do platform specific un-initialization:
++       * release iomux pins, etc.
++       */
++      if (pdata->platform_uninit)
++              pdata->platform_uninit(pdev);
++}
++
++/* called after powerup, by probe or system-pm "wakeup" */
++static int ehci_fsl_reinit(struct ehci_hcd *ehci)
++{
++      fsl_platform_usb_setup(ehci_to_hcd(ehci));
++      ehci_port_power(ehci, 0);
++
++      return 0;
++}
++
++/* called during probe() after chip reset completes */
++static int ehci_fsl_setup(struct usb_hcd *hcd)
++{
++      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
++      int retval;
++      struct fsl_usb2_platform_data *pdata;
++      pdata = hcd->self.controller-> platform_data;
++
++      ehci->big_endian_desc = pdata->big_endian_desc;
++      ehci->big_endian_mmio = pdata->big_endian_mmio;
++
++      /* EHCI registers start at offset 0x100 */
++      ehci->caps = hcd->regs + 0x100;
++      ehci->regs = hcd->regs + 0x100 +
++          HC_LENGTH(ehci_readl(ehci, &ehci->caps->hc_capbase));
++
++      pr_debug("%s(): ehci->caps=0x%p  ehci->regs=0x%p\n", __FUNCTION__,
++               ehci->caps, ehci->regs);
++
++      dbg_hcs_params(ehci, "reset");
++      dbg_hcc_params(ehci, "reset");
++
++      /* cache this readonly data; minimize chip reads */
++      ehci->hcs_params = ehci_readl(ehci, &ehci->caps->hcs_params);
++
++      retval = ehci_halt(ehci);
++      if (retval)
++              return retval;
++
++      /* data structure init */
++      retval = ehci_init(hcd);
++      if (retval)
++              return retval;
++
++      ehci->is_tdi_rh_tt = 1;
++
++      ehci->sbrn = 0x20;
++
++      ehci_reset(ehci);
++
++      retval = ehci_fsl_reinit(ehci);
++      return retval;
++}
++
++static const struct hc_driver ehci_fsl_hc_driver = {
++      .description = hcd_name,
++      .product_desc = "Freescale On-Chip EHCI Host Controller",
++      .hcd_priv_size = sizeof(struct ehci_hcd),
++
++      /*
++       * generic hardware linkage
++       */
++      .irq = ehci_irq,
++      .flags = FSL_PLATFORM_HC_FLAGS,
++
++      /*
++       * basic lifecycle operations
++       */
++      .reset = ehci_fsl_setup,
++      .start = ehci_run,
++      .stop = ehci_stop,
++      .shutdown = ehci_shutdown,
++
++      /*
++       * managing i/o requests and associated device resources
++       */
++      .urb_enqueue = ehci_urb_enqueue,
++      .urb_dequeue = ehci_urb_dequeue,
++      .endpoint_disable = ehci_endpoint_disable,
++
++      /*
++       * scheduling support
++       */
++      .get_frame_number = ehci_get_frame,
++
++      /*
++       * root hub support
++       */
++      .hub_status_data = ehci_hub_status_data,
++      .hub_control = ehci_hub_control,
++      .bus_suspend = ehci_bus_suspend,
++      .bus_resume = ehci_bus_resume,
++};
++
++#ifdef CONFIG_USB_OTG
++/*
++ * Holding pen for all the EHCI registers except port_status,
++ * which is a zero element array and hence takes no space.
++ * The port_status register is saved in usb_ehci_portsc.
++ */
++volatile static struct ehci_regs usb_ehci_regs;
++static u32 usb_ehci_portsc;
++
++/* suspend/resume, section 4.3 */
++
++/* These routines rely on the bus (pci, platform, etc)
++ * to handle powerdown and wakeup, and currently also on
++ * transceivers that don't need any software attention to set up
++ * the right sort of wakeup.
++ *
++ * They're also used for turning on/off the port when doing OTG.
++ */
++static int ehci_fsl_drv_suspend(struct platform_device *pdev,
++                              pm_message_t message)
++{
++      struct usb_hcd *hcd = platform_get_drvdata(pdev);
++      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
++      u32 tmp;
++
++      pr_debug("%s pdev=0x%p  ehci=0x%p  hcd=0x%p\n",
++               __FUNCTION__, pdev, ehci, hcd);
++      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p  hcd->state=%d\n",
++               __FUNCTION__, ehci->regs, hcd->regs, hcd->state);
++
++      hcd->state = HC_STATE_SUSPENDED;
++      pdev->dev.power.power_state = PMSG_SUSPEND;
++
++      if (hcd->driver->suspend)
++              return hcd->driver->suspend(hcd, message);
++
++      /* ignore non-host interrupts */
++      clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
++
++      tmp = ehci_readl(ehci, &ehci->regs->command);
++      tmp &= ~CMD_RUN;
++      ehci_writel(ehci, tmp, &ehci->regs->command);
++
++      memcpy((void *)&usb_ehci_regs, ehci->regs, sizeof(struct ehci_regs));
++      usb_ehci_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]);
++
++      /* clear the W1C bits */
++      usb_ehci_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS);
++
++      fsl_platform_set_vbus_power(pdev, 0);
++      /* clear PP to cut power to the port */
++      tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
++      tmp &= ~PORT_POWER;
++      ehci_writel(ehci, tmp, &ehci->regs->port_status[0]);
++
++      return 0;
++}
++
++static int ehci_fsl_drv_resume(struct platform_device *pdev)
++{
++      struct usb_hcd *hcd = platform_get_drvdata(pdev);
++      struct ehci_hcd *ehci = hcd_to_ehci(hcd);
++      u32 tmp;
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++
++      pr_debug("%s pdev=0x%p  pdata=0x%p  ehci=0x%p  hcd=0x%p\n",
++               __FUNCTION__, pdev, pdata, ehci, hcd);
++
++      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p",
++               __FUNCTION__, ehci->regs, hcd->regs);
++
++      memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs));
++      ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
++
++      tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
++      ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
++
++      set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
++      hcd->state = HC_STATE_RUNNING;
++      pdev->dev.power.power_state = PMSG_ON;
++
++      tmp = ehci_readl(ehci, &ehci->regs->command);
++      tmp |= CMD_RUN;
++      ehci_writel(ehci, tmp, &ehci->regs->command);
++
++      fsl_platform_set_vbus_power(pdev, 1);
++
++      usb_hcd_resume_root_hub(hcd);
++
++      return 0;
++}
++#endif                                /* CONFIG_USB_OTG */
++
++static int ehci_fsl_drv_probe(struct platform_device *pdev)
++{
++      if (usb_disabled())
++              return -ENODEV;
++
++      return usb_hcd_fsl_probe(&ehci_fsl_hc_driver, pdev);
++}
++
++static int ehci_fsl_drv_remove(struct platform_device *pdev)
++{
++      struct usb_hcd *hcd = platform_get_drvdata(pdev);
++
++      usb_hcd_fsl_remove(hcd, pdev);
++
++      return 0;
++}
++
++MODULE_ALIAS("fsl-ehci");
++
++static struct platform_driver ehci_fsl_driver = {
++      .probe = ehci_fsl_drv_probe,
++      .remove = ehci_fsl_drv_remove,
++      .shutdown = usb_hcd_platform_shutdown,
++#ifdef CONFIG_USB_OTG
++      .suspend = ehci_fsl_drv_suspend,
++      .resume  = ehci_fsl_drv_resume,
++#endif
++      .driver = {
++                 .name = "fsl-ehci",
++                 },
++};
+--- a/drivers/usb/host/ehci-fsl.h
++++ b/drivers/usb/host/ehci-fsl.h
+@@ -18,6 +18,8 @@
+ #ifndef _EHCI_FSL_H
+ #define _EHCI_FSL_H
++#include <linux/usb/fsl_xcvr.h>
++
+ /* offsets for the non-ehci registers in the FSL SOC USB controller */
+ #define FSL_SOC_USB_ULPIVP    0x170
+ #define FSL_SOC_USB_PORTSC1   0x184
+@@ -34,5 +36,29 @@
+ #define FSL_SOC_USB_PRICTRL   0x40c   /* NOTE: big-endian */
+ #define FSL_SOC_USB_SICTRL    0x410   /* NOTE: big-endian */
+ #define FSL_SOC_USB_CTRL      0x500   /* NOTE: big-endian */
+-#define SNOOP_SIZE_2GB                0x1e
++
++#ifdef CONFIG_MPC834x
++#include <sysdev/fsl_usb.h>
++#endif
++
++#ifdef CONFIG_ARCH_MX3
++#include <asm/arch/mx31_usb.h>
++#endif
++
++#ifdef CONFIG_ARCH_MX27
++#include <asm/arch/mx27_usb.h>
++#endif
++
++#ifdef CONFIG_M54455
++#include <asm-m68k/mcf5445x_usb.h>
++#endif
++
++
++static void fsl_platform_set_vbus_power(struct platform_device *pdev, int on)
++{
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++
++      if (pdata->xcvr_ops && pdata->xcvr_ops->set_vbus_power)
++              pdata->xcvr_ops->set_vbus_power(pdata, on);
++}
+ #endif                                /* _EHCI_FSL_H */
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -1043,6 +1043,11 @@ MODULE_LICENSE ("GPL");
+ #define       PLATFORM_DRIVER         ixp4xx_ehci_driver
+ #endif
++#ifdef CONFIG_M54455
++#include "ehci-arc.c"
++#define       PLATFORM_DRIVER         ehci_fsl_driver
++#endif
++
+ #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) && \
+     !defined(PS3_SYSTEM_BUS_DRIVER) && !defined(OF_PLATFORM_DRIVER)
+ #error "missing bus glue for ehci-hcd"
+--- a/drivers/usb/host/ehci-mem.c
++++ b/drivers/usb/host/ehci-mem.c
+@@ -40,7 +40,8 @@ static inline void ehci_qtd_init(struct 
+ {
+       memset (qtd, 0, sizeof *qtd);
+       qtd->qtd_dma = dma;
+-      qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
++      // DDD official code` has: qtd->hw_token = cpu_to_le32 (QTD_STS_HALT);
++      qtd->hw_token = cpu_to_hc32 (ehci, QTD_STS_HALT);
+       qtd->hw_next = EHCI_LIST_END(ehci);
+       qtd->hw_alt_next = EHCI_LIST_END(ehci);
+       INIT_LIST_HEAD (&qtd->qtd_list);
+@@ -211,9 +212,11 @@ static int ehci_mem_init (struct ehci_hc
+       }
+       /* Hardware periodic table */
+-      ehci->periodic = (__le32 *)
++      // DDD official code has: ehci->periodic = (__le32 *)
++      ehci->periodic = (__hc32 *)
+               dma_alloc_coherent (ehci_to_hcd(ehci)->self.controller,
+-                      ehci->periodic_size * sizeof(__le32),
++                      // DDD official: ehci->periodic_size * sizeof(__le32),
++                      ehci->periodic_size * sizeof(__hc32),
+                       &ehci->periodic_dma, 0);
+       if (ehci->periodic == NULL) {
+               goto fail;
+--- a/drivers/usb/host/ehci.h
++++ b/drivers/usb/host/ehci.h
+@@ -122,6 +122,12 @@ struct ehci_hcd {                 /* one per controlle
+       u8                      sbrn;           /* packed release number */
++      /*
++       * OTG controllers and transceivers need software interaction;
++       * other external transceivers should be software-transparent
++       */
++      struct otg_transceiver  *transceiver;
++
+       /* irq statistics */
+ #ifdef EHCI_STATS
+       struct ehci_stats       stats;
+@@ -753,6 +759,22 @@ ehci_port_speed(struct ehci_hcd *ehci, u
+ #define writel_be(val, addr)  __raw_writel(val, (__force unsigned *)addr)
+ #endif
++#if defined(CONFIG_COLDFIRE)
++/*
++ * Sorry, include/asm-m68k/io.h is messed up.  It will give you a
++ * BE readl or a LE readl depending on whether or not CONFIG_PCI is set.
++ * how broken is that?  Do the right thing here.
++ */
++#undef readl
++#undef writel
++
++#define readl(addr)           in_le32((__force unsigned *)(addr))
++#define writel(val,addr)      out_le32((__force unsigned *)(addr),(val))
++
++#define readl_be(addr)                in_be32((__force unsigned *)(addr))
++#define writel_be(val, addr)  out_be32((__force unsigned *)(addr), (val))
++#endif
++
+ static inline unsigned int ehci_readl(const struct ehci_hcd *ehci,
+               __u32 __iomem * regs)
+ {
+--- /dev/null
++++ b/drivers/usb/otg/Makefile
+@@ -0,0 +1,5 @@
++#
++# Makefile for USB OTG controller  driver
++#
++fsl_usb2_otg-objs             := fsl_otg.o otg_fsm.o
++obj-y                         += fsl_usb2_otg.o
+--- /dev/null
++++ b/drivers/usb/otg/fsl_otg.c
+@@ -0,0 +1,1515 @@
++/*
++ * Copyright (c) Freescale Semiconductor, Inc. 2006-2007
++ *
++ * USB OTG ULPI driver
++ *
++ * Based on code for MPC from:
++ *  Leo Li<LeoLi@freescale.com>
++ *  Jerry Huang<Chang-Ming.Huang@freescale.com>
++ *
++ * and M5329 code from
++ *  Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *  Andrey Butok
++ *
++ *  Initialization based on code from Shlomi Gridish.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the  GNU General Public License along
++ * with this program; if not, write  to the Free Software Foundation, Inc.,
++ * 675 Mass Ave, Cambridge, MA 02139, USA.
++ ***************************************************************************
++ * Changes:
++ *   v0.3     08 August 2007          Duck
++ *   v0.2     20 October 2006         Andrey Butok
++ *            Issues fixing and some changes.
++ *   v0.1     September 2006          Yaroslav Vinogradov
++ *            Initial version.
++ *
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/kernel.h>
++#include <linux/delay.h>
++#include <linux/ioport.h>
++#include <linux/sched.h>
++#include <linux/slab.h>
++#include <linux/smp_lock.h>
++#include <linux/proc_fs.h>
++#include <linux/errno.h>
++#include <linux/init.h>
++#include <linux/reboot.h>
++#include <linux/timer.h>
++#include <linux/list.h>
++#include <linux/interrupt.h>
++#include <linux/usb.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/usb/ch9.h>
++#include <linux/usb_gadget.h>
++#include <linux/workqueue.h>
++#include <linux/time.h>
++#include <linux/fsl_devices.h>
++#include <linux/usb/fsl_usb2.h>
++
++#include <linux/io.h>
++
++#if defined CONFIG_M54455
++#include <asm/mcfsim.h>
++#endif
++
++#define USE_WORK_QUEUES
++#include "fsl_otg.h"
++
++#define CONFIG_USB_OTG_DEBUG_FILES
++#define DRIVER_VERSION "Revision: 1.56"
++#define DRIVER_AUTHOR "Freescale Semiconductor Inc."
++#define DRIVER_DESC "Freescale USB OTG ULPI Driver"
++#define DRIVER_INFO DRIVER_VERSION " " DRIVER_DESC
++
++MODULE_DESCRIPTION("Freescale USB OTG Controller Driver");
++
++static const char driver_name[] = "fsl-usb2-otg";
++
++static spinlock_t usb_dr_regs_lock;
++
++/*#define HA_DATA_PULSE 1*/
++
++volatile static struct fsl_usb_device_regs *usb_dr_regs;
++static struct fsl_otg *fsl_otg_dev;
++static int srp_wait_done;
++
++/* Driver specific timers */
++struct fsl_otg_timer *b_data_pulse_tmr, *b_vbus_pulse_tmr, *b_srp_fail_tmr,
++      *b_srp_wait_tmr, *a_wait_enum_tmr;
++
++static struct list_head active_timers;
++
++static struct fsl_otg_config fsl_otg_initdata = {
++      .otg_port = 1,
++};
++
++static void dump_state(const char *string, struct otg_fsm *fsm)
++{
++      printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string,
++             state_string(fsl_otg_dev->otg.state));
++      printk(KERN_DEBUG "\tFSM protocol=%s\n", fsm->protocol ?
++             (fsm->protocol == PROTO_HOST ? "Host" : "Gadget")
++             : "None");
++
++      /* regs */
++      printk(KERN_DEBUG "\t  OTGSC 0x%08x\n",
++             fsl_readl(&usb_dr_regs->otgsc));
++      printk(KERN_DEBUG "\tPORTSC1 0x%08x\n",
++             fsl_readl(&usb_dr_regs->portsc1));
++      printk(KERN_DEBUG "\tUSBMODE 0x%08x\n",
++             fsl_readl(&usb_dr_regs->usbmode));
++      printk(KERN_DEBUG "\t USBCMD 0x%08x\n",
++             fsl_readl(&usb_dr_regs->usbcmd));
++      printk(KERN_DEBUG "\t USBSTS 0x%08x\n",
++             fsl_readl(&usb_dr_regs->usbsts));
++
++      /* ------ State Machine Variables ----- */
++      printk(KERN_DEBUG "\ta_bus_req: %d\n", fsm->a_bus_req);
++      printk(KERN_DEBUG "\tb_bus_req: %d\n", fsm->b_bus_req);
++      printk(KERN_DEBUG "\ta_bus_resume: %d\n", fsm->a_bus_resume);
++      printk(KERN_DEBUG "\ta_bus_suspend: %d\n", fsm->a_bus_suspend);
++      printk(KERN_DEBUG "\ta_conn: %d\n", fsm->a_conn);
++      printk(KERN_DEBUG "\ta_sess_vld: %d\n", fsm->a_sess_vld);
++      printk(KERN_DEBUG "\ta_srp_det: %d\n", fsm->a_srp_det);
++      printk(KERN_DEBUG "\ta_vbus_vld: %d\n", fsm->a_vbus_vld);
++      printk(KERN_DEBUG "\tb_bus_resume: %d\n", fsm->b_bus_resume);
++      printk(KERN_DEBUG "\tb_bus_suspend: %d\n", fsm->b_bus_suspend);
++      printk(KERN_DEBUG "\tb_conn: %d\n", fsm->b_conn);
++      printk(KERN_DEBUG "\tb_se0_srp: %d\n", fsm->b_se0_srp);
++      printk(KERN_DEBUG "\tb_sess_end: %d\n", fsm->b_sess_end);
++      printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld);
++      printk(KERN_DEBUG "\tid: %d\n", fsm->id);
++}
++
++
++/* Routines to access transceiver ULPI registers */
++u8 view_ulpi(u8 addr)
++{
++      u32 temp;
++
++      temp = 0x40000000 | (addr << 16);
++      fsl_writel(temp, &usb_dr_regs->ulpiview);
++
++      udelay(1000);
++
++      /* DDD timeout this loop: */
++      do {
++              temp = fsl_readl(&usb_dr_regs->ulpiview);
++      } while (temp & 0x40000000);
++
++      return (temp & 0x0000ff00) >> 8;
++}
++
++int write_ulpi(u8 addr, u8 data)
++{
++      u32 temp;
++
++      temp = 0x60000000 | (addr << 16) | data;
++      fsl_writel(temp, &usb_dr_regs->ulpiview);
++      return 0;
++}
++
++/* prototype declaration */
++void fsl_otg_add_timer(void *timer);
++void fsl_otg_del_timer(void *timer);
++
++/* -------------------------------------------------------------*/
++/* Operations that will be called from OTG Finite State Machine */
++
++/* Charge vbus for vbus pulsing in SRP */
++void fsl_otg_chrg_vbus(int on)
++{
++      u32 tmp;
++
++      VDBG(" %d\n", on);
++
++      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
++
++      if (on) {
++              tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE;
++              tmp |= OTGSC_CTRL_VBUS_CHARGE;
++      } else {
++              tmp &= ~OTGSC_CTRL_VBUS_CHARGE;
++      }
++      fsl_writel(tmp, &usb_dr_regs->otgsc);
++}
++
++/* Discharge vbus through a resistor to ground */
++void fsl_otg_dischrg_vbus(int on)
++{
++      u32 tmp;
++
++      VDBG(" %d\n", on);
++
++      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
++
++      if (on)
++              tmp |= OTGSC_CTRL_VBUS_DISCHARGE;
++      else
++              tmp &= ~OTGSC_CTRL_VBUS_DISCHARGE;
++
++      fsl_writel(tmp, &usb_dr_regs->otgsc);
++}
++
++/* A-device driver vbus, controlled through PP bit in PORTSC */
++void fsl_otg_drv_vbus(int on)
++{
++      u32 tmp;
++
++      VDBG(" %d\n", on);
++
++      tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS;
++
++      if (on)
++              tmp |= PORTSCX_PORT_POWER;
++      else
++              tmp &= ~PORTSCX_PORT_POWER;
++
++      fsl_writel(tmp, &usb_dr_regs->portsc1);
++}
++
++/* Pull-up D+, signalling connect by periperal. Also used in
++ * data-line pulsing in SRP */
++void fsl_otg_loc_conn(int on)
++{
++      u32 tmp;
++
++      VDBG(" %d\n", on);
++
++      tmp = fsl_readl(&usb_dr_regs->otgsc) & ~OTGSC_INTSTS_MASK;
++
++      if (on)
++              tmp |= OTGSC_CTRL_DATA_PULSING;
++      else
++              tmp &= ~OTGSC_CTRL_DATA_PULSING;
++
++      fsl_writel(tmp, &usb_dr_regs->otgsc);
++}
++
++/* Generate SOF by host.  This is controlled through suspend/resume the
++ * port.  In host mode, controller will automatically send SOF.
++ * Suspend will block the data on the port.
++ */
++void fsl_otg_loc_sof(int on)
++{
++      u32 tmp;
++
++      VDBG(" %d\n", on);
++
++      tmp = fsl_readl(&usb_dr_regs->portsc1) & ~PORTSCX_W1C_BITS;
++
++      if (on)
++              tmp |= PORTSCX_PORT_FORCE_RESUME;
++      else
++              tmp |= PORTSCX_PORT_SUSPEND;
++
++      fsl_writel(tmp, &usb_dr_regs->portsc1);
++}
++
++/* Start SRP pulsing by data-line pulsing, followed with v-bus pulsing. */
++void fsl_otg_start_pulse(void)
++{
++      u32 __attribute__ ((unused)) tmp;
++
++      VDBG("\n");
++      srp_wait_done = 0;
++
++#ifdef HA_DATA_PULSE
++      tmp = fsl_readl(&usb_dr_regs->otgsc) &= ~OTGSC_INTSTS_MASK;
++      tmp |= OTGSC_HA_DATA_PULSE;
++      fsl_writel(tmp, &usb_dr_regs->otgsc);
++#else
++      fsl_otg_loc_conn(1);
++#endif
++
++      fsl_otg_add_timer(b_data_pulse_tmr);
++}
++
++void fsl_otg_pulse_vbus(void);
++
++void b_data_pulse_end(unsigned long foo)
++{
++#ifdef HA_DATA_PULSE
++#else
++      fsl_otg_loc_conn(0);
++#endif
++
++      /* Do VBUS pulse after data pulse */
++      fsl_otg_pulse_vbus();
++}
++
++void fsl_otg_pulse_vbus(void)
++{
++      srp_wait_done = 0;
++      fsl_otg_chrg_vbus(1);
++      /* start the timer to end vbus charge */
++      fsl_otg_add_timer(b_vbus_pulse_tmr);
++}
++
++void b_vbus_pulse_end(unsigned long foo)
++{
++      fsl_otg_chrg_vbus(0);
++
++      /* As USB3300 using the same a_sess_vld and b_sess_vld voltage
++       * we need to discharge the bus for a while to distinguish
++       * residual voltage of vbus pulsing and A device pull up */
++      fsl_otg_dischrg_vbus(1);
++      fsl_otg_add_timer(b_srp_wait_tmr);
++}
++
++void b_srp_end(unsigned long foo)
++{
++      fsl_otg_dischrg_vbus(0);
++      srp_wait_done = 1;
++
++      if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) &&
++          fsl_otg_dev->fsm.b_sess_vld)
++              fsl_otg_dev->fsm.b_srp_done = 1;
++}
++
++/* Workaround for a_host suspending too fast.  When a_bus_req=0,
++ * a_host will start by SRP.  It needs to set b_hnp_enable before
++ * actually suspending to start HNP
++ */
++void a_wait_enum(unsigned long foo)
++{
++      VDBG("a_wait_enum timeout\n");
++      if (!fsl_otg_dev->otg.host->b_hnp_enable)
++              fsl_otg_add_timer(a_wait_enum_tmr);
++      else
++              otg_statemachine(&fsl_otg_dev->fsm);
++}
++
++/* ------------------------------------------------------*/
++
++/* The timeout callback function to set time out bit */
++void set_tmout(unsigned long indicator)
++{
++      *(int *)indicator = 1;
++}
++
++/* Initialize timers */
++void fsl_otg_init_timers(struct otg_fsm *fsm)
++{
++      /* FSM used timers */
++      fsm->a_wait_vrise_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_VRISE,
++                              (unsigned long)&fsm->a_wait_vrise_tmout);
++      fsm->a_wait_bcon_tmr = otg_timer_initializer(&set_tmout, TA_WAIT_BCON,
++                              (unsigned long)&fsm->a_wait_bcon_tmout);
++      fsm->a_aidl_bdis_tmr = otg_timer_initializer(&set_tmout, TA_AIDL_BDIS,
++                              (unsigned long)&fsm->a_aidl_bdis_tmout);
++      fsm->b_ase0_brst_tmr = otg_timer_initializer(&set_tmout, TB_ASE0_BRST,
++                              (unsigned long)&fsm->b_ase0_brst_tmout);
++      fsm->b_se0_srp_tmr = otg_timer_initializer(&set_tmout, TB_SE0_SRP,
++                              (unsigned long)&fsm->b_se0_srp);
++      fsm->b_srp_fail_tmr = otg_timer_initializer(&set_tmout, TB_SRP_FAIL,
++                              (unsigned long)&fsm->b_srp_done);
++      fsm->a_wait_enum_tmr = otg_timer_initializer(&a_wait_enum, 10,
++                              (unsigned long)&fsm);
++
++      /* device driver used timers */
++      b_srp_wait_tmr = otg_timer_initializer(&b_srp_end, TB_SRP_WAIT, 0);
++      b_data_pulse_tmr = otg_timer_initializer(&b_data_pulse_end,
++                              TB_DATA_PLS, 0);
++      b_vbus_pulse_tmr = otg_timer_initializer(&b_vbus_pulse_end,
++                              TB_VBUS_PLS, 0);
++
++}
++
++/* Add timer to timer list */
++void fsl_otg_add_timer(void *gtimer)
++{
++      struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer;
++      struct fsl_otg_timer *tmp_timer;
++
++      /* Check if the timer is already in the active list,
++       * if so update timer count
++       */
++      list_for_each_entry(tmp_timer, &active_timers, list)
++          if (tmp_timer == timer) {
++              timer->count = timer->expires;
++              return;
++      }
++      timer->count = timer->expires;
++      list_add_tail(&timer->list, &active_timers);
++}
++
++/* Remove timer from the timer list; clear timeout status */
++void fsl_otg_del_timer(void *gtimer)
++{
++      struct fsl_otg_timer *timer = (struct fsl_otg_timer *)gtimer;
++      struct fsl_otg_timer *tmp_timer, *del_tmp;
++
++      list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list)
++              if (tmp_timer == timer)
++                      list_del(&timer->list);
++}
++
++/*
++ * Reduce timer count by 1, and find timeout conditions.
++ * Called by fsl_otg 1ms timer interrupt
++ */
++int fsl_otg_tick_timer(void)
++{
++      struct fsl_otg_timer *tmp_timer, *del_tmp;
++      int expired = 0;
++
++      list_for_each_entry_safe(tmp_timer, del_tmp, &active_timers, list) {
++              tmp_timer->count--;
++              /* check if timer expires */
++              if (!tmp_timer->count) {
++                      list_del(&tmp_timer->list);
++                      tmp_timer->function(tmp_timer->data);
++                      expired = 1;
++              }
++      }
++
++      return expired;
++}
++
++/* Reset controller, not reset the bus */
++void otg_reset_controller(void)
++{
++      u32 command;
++      unsigned long flags;
++      int timeout;
++
++      VDBG("\n");
++
++      spin_lock_irqsave(&usb_dr_regs_lock, flags);
++
++      command = fsl_readl(&usb_dr_regs->usbcmd);
++      command |= USB_CMD_CTRL_RESET;
++      fsl_writel(command, &usb_dr_regs->usbcmd);
++      spin_unlock_irqrestore(&usb_dr_regs_lock, flags);
++
++      /* Wait reset completed */
++      timeout = 500;
++      while (fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET)
++              udelay(1);
++      if (timeout <= 0)
++              ERR("%s - USBCMD_RST never clear. Timeout is %d \n",
++                      __FUNCTION__, timeout);
++}
++
++/* Call suspend/resume routines in host driver */
++int fsl_otg_start_host(struct otg_fsm *fsm, int on)
++{
++      struct otg_transceiver *xceiv = fsm->transceiver;
++      struct device *dev;
++      struct fsl_otg *otg_dev = container_of(xceiv, struct fsl_otg, otg);
++      u32 retval = 0;
++
++      if (!xceiv->host)
++              return -ENODEV;
++
++      dev = xceiv->host->controller;
++
++      /*
++       * Update a_vbus_vld state as a_vbus_vld int is disabled
++       * in device mode
++       */
++      fsm->a_vbus_vld =
++              !!(fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_A_VBUS_VALID);
++      if (on) {
++              /* start fsl usb host controller */
++              if (otg_dev->host_working)
++                      goto end;
++              else {
++                      otg_reset_controller();
++                      VDBG("host on......\n");
++                      if (dev->driver->resume) {
++                              retval = dev->driver->resume(dev);
++                              if (fsm->id) {
++                                      /* default-b */
++                                      fsl_otg_drv_vbus(1);
++                                      /* Workaround: b_host can't driver
++                                       * vbus, but PP in PORTSC needs to
++                                       * be 1 for host to work.
++                                       * So we set drv_vbus bit in
++                                       * transceiver to 0 thru ULPI. */
++                                      write_ulpi(0x0c, 0x20);
++                              }
++                      }
++
++                      otg_dev->host_working = 1;
++              }
++      } else {
++              /* stop fsl usb host controller */
++              if (!otg_dev->host_working)
++                      goto end;
++              else {
++                      VDBG("host off......\n");
++                      if (dev && dev->driver) {
++                              retval = dev->driver->suspend(dev, PMSG_SUSPEND);
++                              if (fsm->id)
++                                      /* default-b */
++                                      fsl_otg_drv_vbus(0);
++                      }
++                      otg_dev->host_working = 0;
++              }
++      }
++end:
++      return retval;
++}
++
++/*
++ * Call suspend and resume function in udc driver
++ * to stop and start udc driver.
++ */
++int fsl_otg_start_gadget(struct otg_fsm *fsm, int on)
++{
++      struct otg_transceiver *xceiv = fsm->transceiver;
++      struct device *dev;
++
++      VDBG("DDD fsm=%p  xceiv=%p\n", fsm, xceiv);
++      if (!xceiv->gadget || !xceiv->gadget->dev.parent)
++              return -ENODEV;
++
++      VDBG("DDD xceiv=%p  xceiv->gadget=%p  parent=%p\n", xceiv, xceiv->gadget,
++              xceiv->gadget->dev.parent);
++
++      VDBG("gadget %s\n", on ? "on" : "off");
++      /* DDD  dump_state("starting gadget", fsm); */
++
++      dev = xceiv->gadget->dev.parent;
++
++      if (on)
++              dev->driver->resume(dev);
++      else
++              dev->driver->suspend(dev, PMSG_SUSPEND);
++
++      return 0;
++}
++
++static void fsl_otg_enable(struct otg_transceiver *otg_p)
++{
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++      struct otg_fsm *fsm = &(otg_dev)->fsm;
++      u32 otg_sc;
++
++      /* DDD VDBG(""); */
++      /* enable OTG interrupt */
++      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
++      otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK;
++      otg_sc &= ~OTGSC_IE_1ms_TIMER;
++      otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE;
++      otg_sc |= OTGSC_IE_USB_ID;      /* DDD added this */
++      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
++
++      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
++
++      if (fsm->id) {
++              otg_p->state = OTG_STATE_UNDEFINED;
++      } else {
++              otg_p->state = OTG_STATE_A_IDLE;
++      }
++
++      otg_p->default_a = (fsm->id == 0);
++      otg_p->host->is_b_host = fsm->id;
++      otg_p->gadget->is_a_peripheral = !fsm->id;
++
++      fsm->a_vbus_vld = 1;
++
++      fsm->b_sess_vld = (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0;
++      fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0;
++      fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0;
++}
++
++/*
++ * Called by initialization code of host driver.  Register host controller
++ * to the OTG.  Suspend host for OTG role detection.
++ */
++static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host)
++{
++#if 0 // DDD beta-final
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++      struct device *dev = host->controller;
++
++      if (!otg_p || otg_dev != fsl_otg_dev)
++              return -ENODEV;
++
++      otg_p->host = host;
++      otg_p->host->is_b_host = otg_dev->fsm.id;
++
++      otg_dev->fsm.a_bus_drop = 0;
++      otg_dev->fsm.a_bus_req = 1;
++
++      otg_p->host->otg_port = fsl_otg_initdata.otg_port;
++
++      if (dev && dev->driver) {
++              VDBG("suspending host\n");
++              dev->driver->suspend(dev, PMSG_SUSPEND);
++              otg_dev->host_working = 0;
++              VDBG("back\n");
++      }
++
++
++      /* dump_state("set_host running statemachine", &otg_dev->fsm); DDD */
++      otg_statemachine(&otg_dev->fsm);
++
++      return 0;
++#else
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++
++      if (!otg_p || otg_dev != fsl_otg_dev)
++              return -ENODEV;
++
++      otg_p->host = host;
++
++      otg_dev->fsm.a_bus_drop = 0;
++      otg_dev->fsm.a_bus_req = 1;
++
++      if (host) {
++              VDBG("host off......\n");
++
++              otg_p->host->otg_port = fsl_otg_initdata.otg_port;
++              otg_p->host->is_b_host = otg_dev->fsm.id;
++              /* must leave time for khubd to finish its thing
++               * before yanking the host driver out from under it,
++               * so suspend the host after a short delay.
++               */
++              otg_dev->host_working = 1;
++              schedule_delayed_work(&otg_dev->otg_event, 100);
++              return 0;
++      } else {                /* host driver going away */
++
++              if (!(le32_to_cpu(otg_dev->dr_mem_map->otgsc) &
++                    OTGSC_STS_USB_ID)) {
++                      /* Mini-A cable connected */
++                      struct otg_fsm *fsm = &otg_dev->fsm;
++
++                      otg_p->state = OTG_STATE_UNDEFINED;
++                      fsm->protocol = PROTO_UNDEF;
++              }
++      }
++
++      otg_dev->host_working = 0;
++
++      otg_statemachine(&otg_dev->fsm);
++
++      return 0;
++#endif
++}
++
++/* Called by initialization code of udc.  Register udc to OTG.*/
++static int fsl_otg_set_peripheral(struct otg_transceiver *otg_p,
++                                struct usb_gadget *gadget)
++{
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++
++      VDBG("\n");
++
++      if (!otg_p || otg_dev != fsl_otg_dev)
++              return -ENODEV;
++
++      if (!gadget) {
++              if (!otg_dev->otg.default_a)
++                      otg_p->gadget->ops->vbus_draw(otg_p->gadget, 0);
++              usb_gadget_vbus_disconnect(otg_dev->otg.gadget);
++              otg_dev->otg.gadget = 0;
++              otg_dev->fsm.b_bus_req = 0;
++              otg_statemachine(&otg_dev->fsm);
++              return 0;
++      }
++
++      otg_p->gadget = gadget;
++      otg_p->gadget->is_a_peripheral = !otg_dev->fsm.id;
++
++      otg_dev->fsm.b_bus_req = 1;
++
++#if 0 /* DDD uClinux */
++      if (otg_p->host) {
++              fsl_otg_enable(otg_p);
++              otg_statemachine(&otg_dev->fsm);
++      }
++#endif
++      /* start the gadget right away if the ID pin says Mini-B */
++      DBG("ID pin=%d\n", otg_dev->fsm.id);
++      if (otg_dev->fsm.id == 1) {
++              fsl_otg_start_host(&otg_dev->fsm, 0);
++              fsl_otg_drv_vbus(0);
++              fsl_otg_start_gadget(&otg_dev->fsm, 1);
++      }
++
++      return 0;
++}
++
++/* Set OTG port power, only for B-device */
++static int fsl_otg_set_power(struct otg_transceiver *otg_p, unsigned mA)
++{
++      if (!fsl_otg_dev)
++              return -ENODEV;
++      if (otg_p->state == OTG_STATE_B_PERIPHERAL)
++              printk(KERN_DEBUG "FSL OTG:Draw %d mA\n", mA);
++
++      return 0;
++}
++
++/* Delayed pin detect interrupt processing.
++ *
++ * When the Mini-A cable is disconnected from the board,
++ * the pin-detect interrupt happens before the disconnnect
++ * interrupts for the connected device(s).  In order to
++ * process the disconnect interrupt(s) prior to switching
++ * roles, the pin-detect interrupts are delayed, and handled
++ * by this routine.
++ */
++static void fsl_otg_event(struct work_struct *work)
++{
++      struct fsl_otg *og = container_of(work, struct fsl_otg, otg_event.work);
++      struct otg_fsm *fsm = &og->fsm;
++
++      VDBG("DDD fsm->id=%d\n", fsm->id);
++      if (fsm->id) {          /* switch to gadget */
++              fsl_otg_start_host(fsm, 0);
++              fsl_otg_drv_vbus(0);
++              fsl_otg_start_gadget(fsm, 1);
++      }
++}
++
++/* B-device start SRP */
++static int fsl_otg_start_srp(struct otg_transceiver *otg_p)
++{
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++
++      if (!otg_p || otg_dev != fsl_otg_dev
++          || otg_p->state != OTG_STATE_B_IDLE)
++              return -ENODEV;
++
++      otg_dev->fsm.b_bus_req = 1;
++      otg_statemachine(&otg_dev->fsm);
++
++      return 0;
++}
++
++/* A_host suspend will call this function to start hnp */
++static int fsl_otg_start_hnp(struct otg_transceiver *otg_p)
++{
++      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
++
++      if (!otg_p || otg_dev != fsl_otg_dev)
++              return -ENODEV;
++
++      VDBG("start_hnp.............\n");
++      /* clear a_bus_req to enter a_suspend state */
++      otg_dev->fsm.a_bus_req = 0;
++      otg_statemachine(&otg_dev->fsm);
++
++      return 0;
++}
++
++/*
++ * Interrupt handler.  OTG/host/peripheral share the same int line.
++ * OTG driver clears OTGSC interrupts and leaves USB interrupts
++ * intact.  It needs to have knowledge of some USB interrupts
++ * such as port change.
++ */
++irqreturn_t fsl_otg_isr(int irq, void *dev_id)
++{
++      struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
++      struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg;
++      u32 otg_int_src, otg_sc;
++
++      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
++      otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
++
++      /* Only clear otg interrupts */
++      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
++
++      /*FIXME: ID change not generate when init to 0 */
++      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
++      otg->default_a = (fsm->id == 0);
++
++      /* process OTG interrupts */
++      if (otg_int_src) {
++              VDBG("\nOTG irq 0x%08x\n", otg_int_src);
++
++              if (otg_int_src & OTGSC_INTSTS_USB_ID) {
++                      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
++                      otg->default_a = (fsm->id == 0);
++                      /* clear conn information */
++                      if (fsm->id)
++                              fsm->b_conn = 0;
++                      else
++                              fsm->a_conn = 0;
++
++                      if (otg->host)
++                              otg->host->is_b_host = fsm->id;
++                      if (otg->gadget)
++                              otg->gadget->is_a_peripheral = !fsm->id;
++                      VDBG("ID int (ID is %d)\n", fsm->id);
++
++                      if (fsm->id) {  /* switch to gadget */
++                              schedule_delayed_work(&((struct fsl_otg *)
++                                                      dev_id)->otg_event, 25);
++                      } else {        /* switch to host */
++                              cancel_delayed_work(&
++                                                  ((struct fsl_otg *)dev_id)->
++                                                  otg_event);
++                              fsl_otg_start_gadget(fsm, 0);
++                              fsl_otg_drv_vbus(1);
++                              fsl_otg_start_host(fsm, 1);
++                      }
++
++                      return IRQ_HANDLED;
++              }
++      }
++
++      return IRQ_NONE;
++}
++
++
++#if 0 // DDD feta-final
++irqreturn_t foo_fsl_otg_isr(int irq, void *dev_id)
++{
++      struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
++      struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg;
++      u32 otg_int_src, usb_int_src, otg_sc;
++      int trigger = 0;
++      int tmp;
++
++      usb_int_src = fsl_readl(&usb_dr_regs->usbsts);
++      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
++      otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
++
++      /* Only clear otg interrupts */
++      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
++
++      /*FIXME: ID change not generate when init to 0 */
++      /* process OTG interrupts */
++      if (otg_int_src) {
++              VDBG("\nOTG irq 0x%08x\n", otg_int_src);
++              if (otg_int_src & OTGSC_INTSTS_1MS_TIMER)
++                      trigger = fsl_otg_tick_timer();
++
++              if (otg_int_src & OTGSC_INTSTS_USB_ID) {
++                      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
++                      otg->default_a = (fsm->id == 0);
++                      if (otg->host)
++                              otg->host->is_b_host = fsm->id;
++                      if (otg->gadget)
++                              otg->gadget->is_a_peripheral = !fsm->id;
++                      VDBG("IRQ=ID now=%d\n", fsm->id);
++
++                      if (fsm->id) {  /* switch to gadget */
++                              schedule_delayed_work(&((struct fsl_otg *)
++                                                      dev_id)->otg_event, 25);
++                      } else {        /* switch to host */
++                              cancel_delayed_work(&
++                                                  ((struct fsl_otg *)dev_id)->
++                                                  otg_event);
++                              fsl_otg_start_gadget(fsm, 0);
++                              fsl_otg_drv_vbus(1);
++                              fsl_otg_start_host(fsm, 1);
++                      }
++
++                      return IRQ_HANDLED;
++              }
++              if (otg_int_src & OTGSC_INTSTS_DATA_PULSE) {
++                      fsm->a_srp_det = 1;
++                      trigger = 1;
++                      VDBG("!!!!Data pulse int\n");
++              }
++              if (otg_int_src & OTGSC_INTSTS_A_SESSION_VALID) {
++                      fsm->a_sess_vld =
++                          (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0;
++                      /* detect VBUS pulsing */
++                      if ((fsm->transceiver->state == OTG_STATE_A_IDLE)
++                          && fsm->a_sess_vld)
++                              fsm->a_srp_det = 1;
++                      trigger = 1;
++                      VDBG("!!!a_sess_vld int state=%d\n", fsm->a_sess_vld);
++              }
++              if (otg_int_src & OTGSC_INTSTS_A_VBUS_VALID) {
++                      fsm->a_vbus_vld = !!(otg_sc & OTGSC_STS_A_VBUS_VALID);
++                      trigger = 1;
++                      VDBG("!!!a_vbus_vld int state=%d\n", fsm->a_vbus_vld);
++
++#if 1
++              if ((fsm->a_vbus_vld == 0) && (fsm->id == 0)) {
++                      if (fsm->transceiver->state != OTG_STATE_A_WAIT_VFALL)
++                              /* Warning insted of transfer to Error state. */
++                              printk(KERN_WARNING "ulpi: The USB Device is "
++                                     "sinking too much current!!\n");
++                      fsm->a_vbus_vld = 1;
++              }
++#endif
++
++
++              }
++              if (otg_int_src & OTGSC_INTSTS_B_SESSION_VALID) {
++                      fsm->b_sess_vld =
++                          (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0;
++                      trigger = 1;
++                      /* SRP done */
++                      if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) &&
++                          fsm->b_sess_vld && srp_wait_done)
++                              fsm->b_srp_done = 1;
++                      VDBG("!!!!b_sess_vld int state=%d\n", fsm->b_sess_vld);
++              }
++              if (otg_int_src & OTGSC_INTSTS_B_SESSION_END) {
++                      fsm->b_sess_end =
++                          (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0;
++                      trigger = 1;
++                      VDBG("!!!!b_sess_end int state=%d\n", fsm->b_sess_end);
++              }
++      }
++
++      /* process USB interrupts */
++      if ((usb_int_src & USB_STS_PORT_CHANGE)
++          && (fsm->protocol == PROTO_HOST)) {
++              VDBG("\nUSB irq A 0x%08x\n", usb_int_src);
++              /* Device resume do not generate statemachine change */
++              if (fsl_readl(&usb_dr_regs->portsc1) &
++                  PORTSCX_PORT_FORCE_RESUME) {
++                      if (otg->default_a) {
++                              fsm->b_bus_resume = 1;
++                              trigger = 1;
++                      } else {
++                              fsm->a_bus_resume = 1;
++                              trigger = 1;
++                      }
++              }
++
++              tmp = (fsl_readl(&usb_dr_regs->portsc1) &
++                     PORTSCX_CURRENT_CONNECT_STATUS) ? 1 : 0;
++              if (otg->default_a && (fsm->b_conn != tmp)) {
++                      fsm->b_conn = tmp;
++                      trigger = 1;
++              } else if (!otg->default_a && (fsm->a_conn != tmp)) {
++                      fsm->a_conn = tmp;
++                      trigger = 1;
++              }
++      }
++      /* Workaround: sometimes CSC bit will lost.  We change to
++       * polling CCS bit for connect change */
++      if (fsm->protocol == PROTO_GADGET) {
++              if (usb_int_src & USB_STS_SUSPEND) {
++                      VDBG("\nUSB irq B 0x%08x\n", usb_int_src);
++                      VDBG("peripheral detected suspend\n");
++                      if (otg->default_a)
++                              /* A-device detects B suspend */
++                              fsm->b_bus_suspend = 1;
++                      else
++                              /* B-device detects A suspend */
++                              fsm->a_bus_suspend = 1;
++                      trigger = 1;
++              } else if (usb_int_src & USB_STS_PORT_CHANGE) {
++                      VDBG("\nUSB irq C 0x%08x\n", usb_int_src);
++                      VDBG("peripheral resumed\n");
++                      if (otg->default_a)
++                              fsm->b_bus_suspend = 0;
++                      else
++                              fsm->a_bus_suspend = 0;
++                      trigger = 1;
++              }
++      }
++
++      /* Invoke statemachine until state is stable */
++      while (trigger) {
++              trigger = otg_statemachine(fsm);
++      }
++
++      return IRQ_HANDLED;
++}
++#endif
++
++
++static struct otg_fsm_ops fsl_otg_ops = {
++      .chrg_vbus = fsl_otg_chrg_vbus,
++      .drv_vbus = fsl_otg_drv_vbus,
++      .loc_conn = fsl_otg_loc_conn,
++      .loc_sof = fsl_otg_loc_sof,
++      .start_pulse = fsl_otg_start_pulse,
++
++      .add_timer = fsl_otg_add_timer,
++      .del_timer = fsl_otg_del_timer,
++
++      .start_host = fsl_otg_start_host,
++      .start_gadget = fsl_otg_start_gadget,
++};
++
++/* Initialize the global variable fsl_otg_dev and request IRQ for OTG */
++int fsl_otg_cfg(struct platform_device *pdev)
++{
++      int status;
++      struct fsl_otg *fsl_otg_tc;
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      struct resource *res;
++
++      DBG("\n");
++
++      if (fsl_otg_dev)
++              return 0;
++
++      /* allocate space to fsl otg device */
++      fsl_otg_tc = kzalloc(sizeof(struct fsl_otg), GFP_KERNEL);
++      if (!fsl_otg_tc)
++              return -ENODEV;
++
++#if 1 // DDD
++      if (pdata->regs) {
++              fsl_otg_tc->dr_mem_map = pdata->regs;
++      } else {
++              res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++              if (!res) {
++                      dev_err(&pdev->dev, "no register addr.\n");
++                      return -ENODEV;
++              }
++
++              printk("DDD %s(): rsrc_start=0x%x  rsrc_len=0x%x\n",
++                   __FUNCTION__, res->start, res->end - res->start + 1);
++
++              if (!request_mem_region(res->start, res->end - res->start + 1,
++                                      "OTG")) {
++                      dev_dbg(&pdev->dev, "request_mem_region failed\n");
++                      return -EBUSY;
++              }
++              fsl_otg_tc->dr_mem_map = ioremap(res->start,
++                                               res->end - res->start + 1);
++      }
++      DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map);
++
++#endif 
++      INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event);
++
++      INIT_LIST_HEAD(&active_timers);
++      fsl_otg_init_timers(&fsl_otg_tc->fsm);
++
++      /* Set OTG state machine operations */
++      fsl_otg_tc->fsm.ops = &fsl_otg_ops;
++
++#if 1 /* DDD */
++      /* record initial state of ID pin */
++      fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID)
++          ? 1 : 0;
++      DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id);
++#endif
++      /* initialize the otg structure */
++      fsl_otg_tc->otg.label = DRIVER_DESC;
++      fsl_otg_tc->otg.set_host = fsl_otg_set_host;
++      fsl_otg_tc->otg.set_peripheral = fsl_otg_set_peripheral;
++      fsl_otg_tc->otg.set_power = fsl_otg_set_power;
++      fsl_otg_tc->otg.start_hnp = fsl_otg_start_hnp;
++      fsl_otg_tc->otg.start_srp = fsl_otg_start_srp;
++
++      fsl_otg_dev = fsl_otg_tc;
++
++      /* Store the otg transceiver */
++      status = otg_set_transceiver(&fsl_otg_tc->otg);
++      if (status) {
++              printk(KERN_WARNING ": unable to register OTG transceiver.\n");
++              return status;
++      }
++
++      return 0;
++}
++
++/* OTG Initialization*/
++int usb_otg_start(struct platform_device *pdev)
++{
++      struct fsl_otg *p_otg;
++      struct otg_transceiver *otg_trans = otg_get_transceiver();
++      struct otg_fsm *fsm;
++      int status;
++      u32 temp;
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      int timeout;
++
++      DBG("\n");
++
++      p_otg = container_of(otg_trans, struct fsl_otg, otg);
++      fsm = &p_otg->fsm;
++
++      /* Initialize the state machine structure with default values */
++      SET_OTG_STATE(otg_trans, OTG_STATE_UNDEFINED);
++      fsm->transceiver = &p_otg->otg;
++
++      usb_dr_regs = p_otg->dr_mem_map;
++      DBG("set usb_dr_regs to 0x%p\n", usb_dr_regs);
++
++      /* request irq */
++      p_otg->irq = platform_get_irq(pdev, 0);
++      status = request_irq(p_otg->irq, fsl_otg_isr,
++                              IRQF_SHARED, driver_name, p_otg);
++      if (status) {
++              dev_dbg(p_otg->otg.dev, "can't get IRQ %d, error %d\n",
++                      p_otg->irq, status);
++              kfree(p_otg);
++              return status;
++      }
++
++
++      /* stop the controller */
++      temp = fsl_readl(&usb_dr_regs->usbcmd) & ~USB_CMD_RUN_STOP;
++      fsl_writel(temp, &usb_dr_regs->usbcmd);
++
++      /* reset the controller */
++      temp = fsl_readl(&usb_dr_regs->usbcmd);
++      temp |= USB_CMD_CTRL_RESET;
++      fsl_writel(temp, &usb_dr_regs->usbcmd);
++
++      /* wait reset completed */
++      timeout = 500;
++      while (timeout-- &&
++              fsl_readl(&usb_dr_regs->usbcmd) & USB_CMD_CTRL_RESET)
++              udelay(1);
++      if (timeout <= 0)
++              ERR("%s - USBCMD_RST never clear. Timeout is %d \n",
++                      __FUNCTION__, timeout);
++
++      /* configure the VBUSHS as IDLE(both host and device) */
++#if 0
++      /* DDD really have to check into setting the following */
++      fsl_writel(USB_MODE_STREAM_DISABLE, &usb_dr_regs->usbmode);
++#else
++      temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0);
++      fsl_writel(temp, &usb_dr_regs->usbmode);
++#endif
++
++      /* configure PHY interface */
++      temp = fsl_readl(&usb_dr_regs->portsc1);
++      temp &= ~(PORTSCX_PHY_TYPE_SEL | PORTSCX_PTW_8BIT);
++
++      /* DDD wrong xcvr setting stuff follows */
++      temp |= PORTSCX_PTS_ULPI;
++      fsl_writel(temp, &usb_dr_regs->portsc1);
++
++
++      /* disable all interrupt and clear all OTGSC status */
++      temp = fsl_readl(&usb_dr_regs->otgsc);
++      temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
++#if 0 // DDD
++      /* DDD only want ID int
++       * temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
++       */
++      temp |= OTGSC_IE_USB_ID;        /* DDD added this */
++      temp &= ~OTGSC_IE_1ms_TIMER;    /* DDD added this */
++#else
++      temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
++#endif
++      fsl_writel(temp, &usb_dr_regs->otgsc);
++
++      fsl_otg_drv_vbus(0);
++
++#if 0 // DDD beta-final
++      temp = fsl_readl(&usb_dr_regs->otgsc);
++      temp |= OTGSC_IE_A_SESSION_VALID;
++      fsl_writel(temp, &usb_dr_regs->otgsc);
++#else
++      /*
++       * The identification (id) input is FALSE when a Mini-A plug is inserted
++       * in the devices Mini-AB receptacle. Otherwise, this input is TRUE.
++       * Also: record initial state of ID pin
++       */
++      if (fsl_readl(&usb_dr_regs->otgsc) & OTGSC_STS_USB_ID) {
++              p_otg->otg.state = OTG_STATE_UNDEFINED;
++              p_otg->fsm.id = 1;
++      } else {
++              p_otg->otg.state = OTG_STATE_A_IDLE;
++              p_otg->fsm.id = 0;
++      }
++
++      DBG("initial ID pin=%d\n", p_otg->fsm.id);
++
++      /* enable OTG ID pin interrupt */
++      temp = fsl_readl(&usb_dr_regs->otgsc);
++      temp |= OTGSC_IE_USB_ID;
++      temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER);
++      fsl_writel(temp, &usb_dr_regs->otgsc);
++#endif
++
++      return 0;
++}
++
++/* Initialize board specific registers,PIB board,clock and pin multiplexing */
++static int board_init(struct platform_device *pdev)
++{
++      struct fsl_usb2_platform_data *pdata;
++      pdata = (struct fsl_usb2_platform_data *)pdev->dev.platform_data;
++
++      /*
++       * do platform specific init: check the clock, grab/config pins, etc.
++       */
++      if (pdata->platform_init(pdev) != 0)
++              return -EINVAL;
++
++      return 0;
++}
++
++/*-------------------------------------------------------------------------
++              PROC File System Support
++-------------------------------------------------------------------------*/
++#ifdef CONFIG_USB_OTG_DEBUG_FILES
++
++#include <linux/seq_file.h>
++
++static const char proc_filename[] = "driver/fsl_usb2_otg";
++
++static int otg_proc_read(char *page, char **start, off_t off, int count,
++                       int *eof, void *_dev)
++{
++      struct otg_fsm *fsm = &fsl_otg_dev->fsm;
++      char *buf = page;
++      char *next = buf;
++      unsigned size = count;
++      unsigned long flags;
++      int t;
++      u32 tmp_reg;
++
++      if (off != 0)
++              return 0;
++
++      spin_lock_irqsave(&fsm->lock, flags);
++
++      /* ------basic driver infomation ---- */
++      t = scnprintf(next, size,
++                    DRIVER_DESC "\n" "fsl_usb2_otg version: %s\n\n",
++                    DRIVER_VERSION);
++      size -= t;
++      next += t;
++
++      /* ------ Registers ----- */
++      /* tmp_reg = le32_to_cpu(usb_dr_regs->otgsc); */
++      tmp_reg = fsl_readl(&usb_dr_regs->otgsc);
++      t = scnprintf(next, size, "OTGSC reg: 0x%08x\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      /* tmp_reg = le32_to_cpu(usb_dr_regs->portsc); */
++      tmp_reg = fsl_readl(&usb_dr_regs->portsc1);
++      t = scnprintf(next, size, "PORTSC reg: 0x%08x\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbmode); */
++      tmp_reg = fsl_readl(&usb_dr_regs->usbmode);
++      t = scnprintf(next, size, "USBMODE reg: 0x%08x\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbcmd); */
++      tmp_reg = fsl_readl(&usb_dr_regs->usbcmd);
++      t = scnprintf(next, size, "USBCMD reg: 0x%08x\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      /* tmp_reg = le32_to_cpu(usb_dr_regs->usbsts); */
++      tmp_reg = fsl_readl(&usb_dr_regs->usbsts);
++      t = scnprintf(next, size, "USBSTS reg: 0x%08x\n", tmp_reg);
++      size -= t;
++      next += t;
++
++      /* ------ State ----- */
++      t = scnprintf(next, size, "FSM protocol=%d %s\n", fsm->protocol,
++              fsm->protocol ?
++              (fsm->protocol == PROTO_HOST ? "Host" : "Gadget")
++              : "None");
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size,
++                    "OTG state: %s\n\n",
++                    state_string(fsl_otg_dev->otg.state));
++      size -= t;
++      next += t;
++
++      /* ------ State Machine Variables ----- */
++      t = scnprintf(next, size, "a_bus_req: %d\n", fsm->a_bus_req);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_bus_req: %d\n", fsm->b_bus_req);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_bus_resume: %d\n", fsm->a_bus_resume);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_bus_suspend: %d\n", fsm->a_bus_suspend);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_conn: %d\n", fsm->a_conn);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_sess_vld: %d\n", fsm->a_sess_vld);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_srp_det: %d\n", fsm->a_srp_det);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "a_vbus_vld: %d\n", fsm->a_vbus_vld);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_bus_resume: %d\n", fsm->b_bus_resume);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_bus_suspend: %d\n", fsm->b_bus_suspend);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_conn: %d\n", fsm->b_conn);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_se0_srp: %d\n", fsm->b_se0_srp);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_sess_end: %d\n", fsm->b_sess_end);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "b_sess_vld: %d\n", fsm->b_sess_vld);
++      size -= t;
++      next += t;
++
++      t = scnprintf(next, size, "id: %d\n", fsm->id);
++      size -= t;
++      next += t;
++
++      spin_unlock_irqrestore(&fsm->lock, flags);
++
++      *eof = 1;
++      return count - size;
++}
++
++#define create_proc_file()    create_proc_read_entry(proc_filename, \
++                              0, NULL, otg_proc_read, NULL)
++
++#define remove_proc_file()    remove_proc_entry(proc_filename, NULL)
++
++#else                         /* !CONFIG_USB_OTG_DEBUG_FILES */
++
++#define create_proc_file()    do {} while (0)
++#define remove_proc_file()    do {} while (0)
++
++#endif                                /*CONFIG_USB_OTG_DEBUG_FILES */
++
++/*----------------------------------------------------------*/
++/* Char driver interface to control some OTG input */
++
++/*
++ * This function handle some ioctl command,such as get otg
++ * status and set host suspend
++ */
++static int fsl_otg_ioctl(struct inode *inode, struct file *file,
++                       unsigned int cmd, unsigned long arg)
++{
++      u32 retval = 0;
++
++      switch (cmd) {
++      case GET_OTG_STATUS:
++              retval = fsl_otg_dev->host_working;
++              break;
++
++      case SET_A_SUSPEND_REQ:
++              fsl_otg_dev->fsm.a_suspend_req = arg;
++              break;
++
++      case SET_A_BUS_DROP:
++              fsl_otg_dev->fsm.a_bus_drop = arg;
++              break;
++
++      case SET_A_BUS_REQ:
++              fsl_otg_dev->fsm.a_bus_req = arg;
++              break;
++
++      case SET_B_BUS_REQ:
++              fsl_otg_dev->fsm.b_bus_req = arg;
++              break;
++
++      default:
++              break;
++      }
++
++      otg_statemachine(&fsl_otg_dev->fsm);
++
++      return retval;
++}
++
++static int fsl_otg_open(struct inode *inode, struct file *file)
++{
++
++      return 0;
++}
++
++static int fsl_otg_release(struct inode *inode, struct file *file)
++{
++
++      return 0;
++}
++
++static struct file_operations otg_fops = {
++      .owner = THIS_MODULE,
++      .llseek = NULL,
++      .read = NULL,
++      .write = NULL,
++      .ioctl = fsl_otg_ioctl,
++      .open = fsl_otg_open,
++      .release = fsl_otg_release,
++};
++
++static int __init fsl_otg_probe(struct platform_device *pdev)
++{
++      int status;
++      struct fsl_usb2_platform_data *pdata;
++
++      DBG("pdev=0x%p\n", pdev);
++
++      if (!pdev)
++              return -ENODEV;
++
++      if (!pdev->dev.platform_data)
++              return -ENOMEM;
++
++      pdata = pdev->dev.platform_data;
++#if 1 // DDD do this elsewhere
++      /* Initialize the clock, multiplexing pin and PHY interface */
++      board_init(pdev);
++#endif
++
++      /* configure the OTG */
++      status = fsl_otg_cfg(pdev);
++      if (status) {
++              printk(KERN_INFO "Couldn't init OTG module\n");
++              return -status;
++      }
++
++      /* start OTG */
++      status = usb_otg_start(pdev);
++
++      if (register_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME, &otg_fops)) {
++              printk(KERN_WARNING FSL_OTG_NAME
++                     ": unable to register FSL OTG device\n");
++              return -EIO;
++      }
++
++      create_proc_file();
++      return status;
++}
++
++static int fsl_otg_remove(struct platform_device *pdev)
++{
++      u32 ie;
++      struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
++      unsigned long flags;
++
++      DBG("pdev=0x%p  pdata=0x%p\n", pdev, pdata);
++
++      otg_set_transceiver(NULL);
++
++      /* disable and clear OTGSC interrupts */
++      spin_lock_irqsave(&usb_dr_regs_lock, flags);
++      ie = fsl_readl(&usb_dr_regs->otgsc);
++      ie &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
++      ie |= OTGSC_INTERRUPT_STATUS_BITS_MASK;
++      fsl_writel(ie, &usb_dr_regs->otgsc);
++      spin_unlock_irqrestore(&usb_dr_regs_lock, flags);
++
++      free_irq(fsl_otg_dev->irq, fsl_otg_dev);
++
++      kfree(fsl_otg_dev);
++
++      remove_proc_file();
++
++      unregister_chrdev(FSL_OTG_MAJOR, FSL_OTG_NAME);
++
++      if (pdata->platform_uninit)
++              pdata->platform_uninit(pdev);
++
++      fsl_otg_dev = NULL;
++      return 0;
++}
++
++struct platform_driver fsl_otg_driver = {
++      .probe = fsl_otg_probe,
++      .remove = fsl_otg_remove,
++      .driver = {
++              .name  = driver_name,
++              .owner = THIS_MODULE,
++      },
++};
++
++/*-------------------------------------------------------------------------*/
++
++static int __init fsl_usb_otg_init(void)
++{
++      printk(KERN_INFO DRIVER_DESC " loaded, %s\n", DRIVER_VERSION);
++      return platform_driver_register(&fsl_otg_driver);
++}
++
++static void __exit fsl_usb_otg_exit(void)
++{
++      platform_driver_unregister(&fsl_otg_driver);
++}
++
++module_init(fsl_usb_otg_init);
++module_exit(fsl_usb_otg_exit);
++
++MODULE_DESCRIPTION(DRIVER_INFO);
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/drivers/usb/otg/fsl_otg.h
+@@ -0,0 +1,139 @@
++/*
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++#ifndef FSL_OTG_H
++#define FSL_OTG_H
++#include <linux/usb/otg.h>
++#include "otg_fsm.h"
++#include <linux/ioctl.h>
++
++#define ERR(format, arg...) \
++printk(KERN_ERR "%s:%s: " format "\n" , __FILE__,  __FUNCTION__ , ## arg)
++
++/*
++ *  A-DEVICE timing  constants
++ */
++
++/* Wait for VBUS Rise  */
++#define TA_WAIT_VRISE (100)   /* a_wait_vrise 100 ms, section: 6.6.5.1 */
++
++/* Wait for B-Connect */
++#define TA_WAIT_BCON  (10000) /* a_wait_bcon > 1 sec, section: 6.6.5.2
++                               * This is only used to get out of
++                               * OTG_STATE_A_WAIT_BCON state if there was
++                               * no connection for these many milliseconds
++                               */
++
++/* A-Idle to B-Disconnect */
++/* It is necessary for this timer to be more than 750 ms because of a bug in OPT
++ * test 5.4 in which B OPT disconnects after 750 ms instead of 75ms as stated
++ * in the test description
++ */
++#define TA_AIDL_BDIS  (5000)  /* a_suspend minimum 200 ms, section: 6.6.5.3 */
++
++/* B-Idle to A-Disconnect */
++#define TA_BIDL_ADIS  (12)    /* 3 to 200 ms */
++
++/* B-device timing constants */
++
++/* Data-Line Pulse Time*/
++#define TB_DATA_PLS   (10)    /* b_srp_init,continue 5~10ms, section:5.3.3 */
++#define TB_DATA_PLS_MIN       (5)     /* minimum 5 ms */
++#define TB_DATA_PLS_MAX       (10)    /* maximum 10 ms */
++
++/* SRP Initiate Time  */
++#define TB_SRP_INIT   (100)   /* b_srp_init,maximum 100 ms, section:5.3.8 */
++
++/* SRP Fail Time  */
++#define TB_SRP_FAIL   (7000)  /* b_srp_init,Fail time 5~30s, section:6.8.2.2 */
++
++/* SRP result wait time */
++#define TB_SRP_WAIT   (60)
++
++/* VBus time */
++#define TB_VBUS_PLS   (30)    /* time to keep vbus pulsing asserted */
++
++/* Discharge time */
++/* This time should be less than 10ms. It varies from system to system. */
++#define TB_VBUS_DSCHRG        (8)
++
++/* A-SE0 to B-Reset  */
++#define TB_ASE0_BRST  (20)    /* b_wait_acon, mini 3.125 ms,section:6.8.2.4 */
++
++/* A bus suspend timer before we can switch to b_wait_aconn */
++#define TB_A_SUSPEND  (7)
++#define TB_BUS_RESUME (12)
++
++/* SE0 Time Before SRP */
++#define TB_SE0_SRP    (2)     /* b_idle,minimum 2 ms, section:5.3.2 */
++
++#define SET_OTG_STATE(otg_ptr, newstate)      ((otg_ptr)->state = newstate)
++
++
++struct fsl_otg_timer {
++      unsigned long expires;  /* Number of count increase to timeout */
++      unsigned long count;    /* Tick counter */
++      void (*function) (unsigned long);       /* Timeout function */
++      unsigned long data;     /* Data passed to function */
++      struct list_head list;
++};
++
++struct fsl_otg_timer inline *otg_timer_initializer
++    (void (*function) (unsigned long), unsigned long expires,
++     unsigned long data) {
++      struct fsl_otg_timer *timer;
++      timer = kmalloc(sizeof(struct fsl_otg_timer), GFP_KERNEL);
++      if (timer == NULL)
++              return NULL;
++      timer->function = function;
++      timer->expires = expires;
++      timer->data = data;
++      return timer;
++}
++
++struct fsl_otg {
++      struct otg_transceiver otg;
++      struct otg_fsm fsm;
++      struct fsl_usb_device_regs *dr_mem_map;
++      struct delayed_work otg_event;
++
++      /*used for usb host */
++      u8 host_working;
++      u8 on_off;
++
++      int irq;
++};
++
++struct fsl_otg_config {
++      u8 otg_port;
++};
++
++/*For SRP and HNP handle*/
++#define FSL_OTG_MAJOR 66
++#define FSL_OTG_NAME  "fsl-otg"
++/*Command to OTG driver(ioctl)*/
++#define OTG_IOCTL_MAGIC               FSL_OTG_MAJOR
++/*if otg work as host,it should return 1,otherwise it return 0*/
++#define GET_OTG_STATUS                _IOR(OTG_IOCTL_MAGIC, 1, int)
++#define SET_A_SUSPEND_REQ     _IOW(OTG_IOCTL_MAGIC, 2, int)
++#define SET_A_BUS_DROP                _IOW(OTG_IOCTL_MAGIC, 3, int)
++#define SET_A_BUS_REQ         _IOW(OTG_IOCTL_MAGIC, 4, int)
++#define SET_B_BUS_REQ         _IOW(OTG_IOCTL_MAGIC, 5, int)
++#define GET_A_SUSPEND_REQ     _IOR(OTG_IOCTL_MAGIC, 6, int)
++#define GET_A_BUS_DROP                _IOR(OTG_IOCTL_MAGIC, 7, int)
++#define GET_A_BUS_REQ         _IOR(OTG_IOCTL_MAGIC, 8, int)
++#define GET_B_BUS_REQ         _IOR(OTG_IOCTL_MAGIC, 9, int)
++
++
++/********************************************************************/
++#endif
+--- /dev/null
++++ b/drivers/usb/otg/otg_fsm.c
+@@ -0,0 +1,381 @@
++/* OTG Finite State Machine from OTG spec
++ *
++ * Copyright (C) 2007 Freescale Semiconductor, Inc.
++ *
++ * Author:    Li Yang <LeoLi@freescale.com>
++ *            Jerry Huang <Chang-Ming.Huang@freescale.com>
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the  GNU General Public License along
++ * with this program; if not, write  to the Free Software Foundation, Inc.,
++ * 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/usb/otg.h>
++#include <linux/spinlock.h>
++#include <linux/delay.h>
++#include <linux/usb.h>
++#include <linux/usb_gadget.h>
++
++#include "otg_fsm.h"
++
++
++/* Defined by device specific driver, for different timer implementation */
++extern void *a_wait_vrise_tmr, *a_wait_bcon_tmr, *a_aidl_bdis_tmr,
++      *b_ase0_brst_tmr, *b_se0_srp_tmr, *b_srp_fail_tmr, *a_wait_enum_tmr;
++
++const char *state_string(enum usb_otg_state state)
++{
++      switch (state) {
++      case OTG_STATE_A_IDLE:          return "a_idle";
++      case OTG_STATE_A_WAIT_VRISE:    return "a_wait_vrise";
++      case OTG_STATE_A_WAIT_BCON:     return "a_wait_bcon";
++      case OTG_STATE_A_HOST:          return "a_host";
++      case OTG_STATE_A_SUSPEND:       return "a_suspend";
++      case OTG_STATE_A_PERIPHERAL:    return "a_peripheral";
++      case OTG_STATE_A_WAIT_VFALL:    return "a_wait_vfall";
++      case OTG_STATE_A_VBUS_ERR:      return "a_vbus_err";
++      case OTG_STATE_B_IDLE:          return "b_idle";
++      case OTG_STATE_B_SRP_INIT:      return "b_srp_init";
++      case OTG_STATE_B_PERIPHERAL:    return "b_peripheral";
++      case OTG_STATE_B_WAIT_ACON:     return "b_wait_acon";
++      case OTG_STATE_B_HOST:          return "b_host";
++      default:                        return "UNDEFINED";
++      }
++}
++EXPORT_SYMBOL(state_string);
++
++/* Change USB protocol when there is a protocol change */
++static int otg_set_protocol(struct otg_fsm *fsm, int protocol)
++{
++      int ret = 0;
++
++      VDBG("DDD old fsm->protocol= %d; new protocol= %d\n",
++                   fsm->protocol, protocol);
++      if (fsm->protocol != protocol) {
++              VDBG("Changing role fsm->protocol= %d; new protocol= %d\n",
++                              fsm->protocol, protocol);
++              /* stop old protocol */
++              if (fsm->protocol == PROTO_HOST)
++                      ret = fsm->ops->start_host(fsm, 0);
++              else if (fsm->protocol == PROTO_GADGET)
++                      ret = fsm->ops->start_gadget(fsm, 0);
++              if (ret)
++                      return ret;
++
++              /* start new protocol */
++              if (protocol == PROTO_HOST)
++                      ret = fsm->ops->start_host(fsm, 1);
++              else if (protocol == PROTO_GADGET)
++                      ret = fsm->ops->start_gadget(fsm, 1);
++              if (ret)
++                      return ret;
++
++              fsm->protocol = protocol;
++              return 0;
++      }
++
++      return 0;
++}
++
++static int state_changed;
++
++/* Called when leaving a state.  Do state clean up jobs here */
++static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state)
++{
++      switch (old_state) {
++      case OTG_STATE_B_IDLE:
++              otg_del_timer(fsm, fsm->b_se0_srp_tmr);
++              fsm->b_se0_srp = 0;
++              break;
++      case OTG_STATE_B_SRP_INIT:
++              fsm->b_srp_done = 0;
++              break;
++      case OTG_STATE_B_PERIPHERAL:
++              break;
++      case OTG_STATE_B_WAIT_ACON:
++              otg_del_timer(fsm, fsm->b_ase0_brst_tmr);
++              fsm->b_ase0_brst_tmout = 0;
++              break;
++      case OTG_STATE_B_HOST:
++              break;
++      case OTG_STATE_A_IDLE:
++              break;
++      case OTG_STATE_A_WAIT_VRISE:
++              otg_del_timer(fsm, fsm->a_wait_vrise_tmr);
++              fsm->a_wait_vrise_tmout = 0;
++              break;
++      case OTG_STATE_A_WAIT_BCON:
++              otg_del_timer(fsm, fsm->a_wait_bcon_tmr);
++              fsm->a_wait_bcon_tmout = 0;
++              break;
++      case OTG_STATE_A_HOST:
++              otg_del_timer(fsm, fsm->a_wait_enum_tmr);
++              break;
++      case OTG_STATE_A_SUSPEND:
++              otg_del_timer(fsm, fsm->a_aidl_bdis_tmr);
++              fsm->a_aidl_bdis_tmout = 0;
++              fsm->a_suspend_req = 0;
++              fsm->a_bus_req = 1;     /* FIXME */
++              break;
++      case OTG_STATE_A_PERIPHERAL:
++              break;
++      case OTG_STATE_A_WAIT_VFALL:
++              otg_del_timer(fsm, fsm->a_wait_vrise_tmr);
++              break;
++      case OTG_STATE_A_VBUS_ERR:
++              break;
++      default:
++              break;
++      }
++}
++
++/* Called when entering a state */
++static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state)
++{
++      state_changed = 1;
++      VDBG("State: old=%s new=%s \n",
++              state_string(fsm->transceiver->state), state_string(new_state));
++
++      if (fsm->transceiver->state == new_state)
++              return 0;
++
++      otg_leave_state(fsm, fsm->transceiver->state);
++      switch (new_state) {
++      case OTG_STATE_B_IDLE:
++              otg_drv_vbus(fsm, 0);
++              otg_chrg_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_UNDEF);
++              otg_add_timer(fsm, fsm->b_se0_srp_tmr);
++              break;
++      case OTG_STATE_B_SRP_INIT:
++              otg_start_pulse(fsm);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_UNDEF);
++              otg_add_timer(fsm, fsm->b_srp_fail_tmr);
++              break;
++      case OTG_STATE_B_PERIPHERAL:
++              otg_chrg_vbus(fsm, 0);
++              otg_loc_conn(fsm, 1);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_GADGET);
++              break;
++      case OTG_STATE_B_WAIT_ACON:
++              otg_chrg_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              otg_add_timer(fsm, fsm->b_ase0_brst_tmr);
++              fsm->a_bus_suspend = 0;
++              break;
++      case OTG_STATE_B_HOST:
++              otg_chrg_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 1);
++              otg_set_protocol(fsm, PROTO_HOST);
++              usb_bus_start_enum(fsm->transceiver->host,
++                                 fsm->transceiver->host->otg_port);
++              break;
++      case OTG_STATE_A_IDLE:
++              otg_drv_vbus(fsm, 0);
++              otg_chrg_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              break;
++      case OTG_STATE_A_WAIT_VRISE:
++              otg_drv_vbus(fsm, 1);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              otg_add_timer(fsm, fsm->a_wait_vrise_tmr);
++              break;
++      case OTG_STATE_A_WAIT_BCON:
++              otg_drv_vbus(fsm, 1);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              otg_add_timer(fsm, fsm->a_wait_bcon_tmr);
++              break;
++      case OTG_STATE_A_HOST:
++              otg_drv_vbus(fsm, 1);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 1);
++              otg_set_protocol(fsm, PROTO_HOST);
++              /*
++               * When HNP is triggered while a_bus_req = 0, a_host will
++               * suspend too fast to complete a_set_b_hnp_en
++               */
++              if (!fsm->a_bus_req || fsm->a_suspend_req)
++                      otg_add_timer(fsm, fsm->a_wait_enum_tmr);
++              break;
++      case OTG_STATE_A_SUSPEND:
++              otg_drv_vbus(fsm, 1);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              otg_add_timer(fsm, fsm->a_aidl_bdis_tmr);
++
++              break;
++      case OTG_STATE_A_PERIPHERAL:
++              otg_loc_conn(fsm, 1);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_GADGET);
++              otg_drv_vbus(fsm, 1);
++              break;
++      case OTG_STATE_A_WAIT_VFALL:
++              otg_drv_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_HOST);
++              break;
++      case OTG_STATE_A_VBUS_ERR:
++              otg_drv_vbus(fsm, 0);
++              otg_loc_conn(fsm, 0);
++              otg_loc_sof(fsm, 0);
++              otg_set_protocol(fsm, PROTO_UNDEF);
++              break;
++      default:
++              break;
++      }
++
++      fsm->transceiver->state = new_state;
++      return 0;
++}
++
++/* State change judgement */
++int otg_statemachine(struct otg_fsm *fsm)
++{
++      enum usb_otg_state state;
++      unsigned long flags;
++
++      spin_lock_irqsave(&fsm->lock, flags);
++
++      state = fsm->transceiver->state;
++      state_changed = 0;
++      /* State machine state change judgement */
++
++      VDBG(" State: %s \n", state_string(state));
++
++      switch (state) {
++      case OTG_STATE_UNDEFINED:
++              if (fsm->id)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              else
++                      otg_set_state(fsm, OTG_STATE_A_IDLE);
++              break;
++      case OTG_STATE_B_IDLE:
++              if (!fsm->id)
++                      otg_set_state(fsm, OTG_STATE_A_IDLE);
++              else if (fsm->b_sess_vld && fsm->transceiver->gadget)
++                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
++              else if (fsm->b_bus_req && fsm->b_sess_end && fsm->b_se0_srp)
++                      otg_set_state(fsm, OTG_STATE_B_SRP_INIT);
++              break;
++      case OTG_STATE_B_SRP_INIT:
++              if (!fsm->id || fsm->b_srp_done)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              break;
++      case OTG_STATE_B_PERIPHERAL:
++              if (!fsm->id || !fsm->b_sess_vld)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              else if (fsm->b_bus_req &&
++                       fsm->transceiver->
++                       gadget->b_hnp_enable && fsm->a_bus_suspend)
++                      otg_set_state(fsm, OTG_STATE_B_WAIT_ACON);
++              break;
++      case OTG_STATE_B_WAIT_ACON:
++              if (fsm->a_conn)
++                      otg_set_state(fsm, OTG_STATE_B_HOST);
++              else if (!fsm->id || !fsm->b_sess_vld)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              else if (fsm->a_bus_resume || fsm->b_ase0_brst_tmout) {
++                      fsm->b_ase0_brst_tmout = 0;
++                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
++              }
++              break;
++      case OTG_STATE_B_HOST:
++              if (!fsm->id || !fsm->b_sess_vld)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              else if (!fsm->b_bus_req || !fsm->a_conn)
++                      otg_set_state(fsm, OTG_STATE_B_PERIPHERAL);
++              break;
++      case OTG_STATE_A_IDLE:
++              if (fsm->id)
++                      otg_set_state(fsm, OTG_STATE_B_IDLE);
++              else if (!fsm->a_bus_drop && (fsm->a_bus_req || fsm->a_srp_det))
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_VRISE);
++              break;
++      case OTG_STATE_A_WAIT_VRISE:
++              if (fsm->id || fsm->a_bus_drop || fsm->a_vbus_vld ||
++                  fsm->a_wait_vrise_tmout) {
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
++              }
++              break;
++      case OTG_STATE_A_WAIT_BCON:
++              if (!fsm->a_vbus_vld)
++                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
++              else if (fsm->id | fsm->a_bus_drop | fsm->a_wait_bcon_tmout)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
++              else if (fsm->b_conn)
++                      otg_set_state(fsm, OTG_STATE_A_HOST);
++              break;
++      case OTG_STATE_A_HOST:
++              if ((!fsm->a_bus_req || fsm->a_suspend_req) &&
++                  fsm->transceiver->host->b_hnp_enable)
++                      otg_set_state(fsm, OTG_STATE_A_SUSPEND);
++              else if (fsm->id || !fsm->b_conn || fsm->a_bus_drop)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
++              else if (!fsm->a_vbus_vld)
++                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
++              break;
++      case OTG_STATE_A_SUSPEND:
++              if (!fsm->b_conn && fsm->transceiver->host->b_hnp_enable)
++                      otg_set_state(fsm, OTG_STATE_A_PERIPHERAL);
++              else if (!fsm->b_conn && !fsm->transceiver->host->b_hnp_enable)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
++              else if (fsm->a_bus_req || fsm->b_bus_resume)
++                      otg_set_state(fsm, OTG_STATE_A_HOST);
++              else if (fsm->id || fsm->a_bus_drop || fsm->a_aidl_bdis_tmout)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
++              else if (!fsm->a_vbus_vld)
++                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
++              break;
++      case OTG_STATE_A_PERIPHERAL:
++              if (fsm->id || fsm->a_bus_drop)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
++              else if (fsm->b_bus_suspend)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_BCON);
++              else if (!fsm->a_vbus_vld)
++                      otg_set_state(fsm, OTG_STATE_A_VBUS_ERR);
++              break;
++      case OTG_STATE_A_WAIT_VFALL:
++              if (fsm->id || fsm->a_bus_req || (!fsm->a_sess_vld &&
++                                                !fsm->b_conn))
++                      otg_set_state(fsm, OTG_STATE_A_IDLE);
++              break;
++      case OTG_STATE_A_VBUS_ERR:
++              if (fsm->id || fsm->a_bus_drop || fsm->a_clr_err)
++                      otg_set_state(fsm, OTG_STATE_A_WAIT_VFALL);
++              break;
++      default:
++              break;
++      }
++      spin_unlock_irqrestore(&fsm->lock, flags);
++
++      return state_changed;
++}
++EXPORT_SYMBOL(otg_statemachine);
+--- /dev/null
++++ b/drivers/usb/otg/otg_fsm.h
+@@ -0,0 +1,170 @@
++/* Copyright (C) 2006-2007 Freescale Semiconductor, Inc.
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * General Public License for more details.
++ *
++ * You should have received a copy of the  GNU General Public License along
++ * with this program; if not, write  to the Free Software Foundation, Inc.,
++ * 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++
++#ifndef OTG_FSM_H
++#define OTG_FSM_H
++
++#if 1
++#define DEBUG         1
++#define VERBOSE       1
++#endif
++
++#ifdef DEBUG
++#define DBG(fmt, args...)     printk(KERN_DEBUG "[%s]  " fmt , \
++                              __FUNCTION__, ## args)
++#else
++#define DBG(fmt, args...)     do {} while (0)
++#endif
++
++#ifdef VERBOSE
++#define VDBG          DBG
++#else
++#define VDBG(stuff...)        do {} while (0)
++#endif
++
++#ifdef VERBOSE
++#define MPC_LOC printk("Current Location [%s]:[%d]\n", __FILE__, __LINE__)
++#else
++#define MPC_LOC do {} while (0)
++#endif
++
++#define PROTO_UNDEF   0
++#define PROTO_HOST    1
++#define PROTO_GADGET  2
++
++
++
++
++
++/* OTG state machine according to the OTG spec */
++struct otg_fsm {
++      /* Input */
++      int a_bus_resume;
++      int a_bus_suspend;
++      int a_conn;
++      int a_sess_vld;
++      int a_srp_det;
++      int a_vbus_vld;
++      int b_bus_resume;
++      int b_bus_suspend;
++      int b_conn;
++      int b_se0_srp;
++      int b_sess_end;
++      int b_sess_vld;
++      int id;
++
++      /* Internal variables */
++      int a_set_b_hnp_en;
++      int b_srp_done;
++      int b_hnp_enable;
++
++      /* Timeout indicator for timers */
++      int a_wait_vrise_tmout;
++      int a_wait_bcon_tmout;
++      int a_aidl_bdis_tmout;
++      int b_ase0_brst_tmout;
++
++      /* Informative variables */
++      int a_bus_drop;
++      int a_bus_req;
++      int a_clr_err;
++      int a_suspend_req;
++      int b_bus_req;
++
++      /* Output */
++      int drv_vbus;
++      int loc_conn;
++      int loc_sof;
++
++      struct otg_fsm_ops *ops;
++      struct otg_transceiver *transceiver;
++
++      void *a_wait_vrise_tmr;
++      void *a_wait_bcon_tmr;
++      void *a_aidl_bdis_tmr;
++      void *b_ase0_brst_tmr;
++      void *b_se0_srp_tmr;
++      void *b_srp_fail_tmr;
++      void *a_wait_enum_tmr;
++
++      /* Current usb protocol used: 0:undefine; 1:host; 2:client */
++      int protocol;
++      spinlock_t lock;                /* fsm lock */
++};
++
++struct otg_fsm_ops {
++      void    (*chrg_vbus)(int on);
++      void    (*drv_vbus)(int on);
++      void    (*loc_conn)(int on);
++      void    (*loc_sof)(int on);
++      void    (*start_pulse)(void);
++      void    (*add_timer)(void *timer);
++      void    (*del_timer)(void *timer);
++      int     (*start_host)(struct otg_fsm *fsm, int on);
++      int     (*start_gadget)(struct otg_fsm *fsm, int on);
++};
++
++
++static inline void otg_chrg_vbus(struct otg_fsm *fsm, int on)
++{
++      fsm->ops->chrg_vbus(on);
++}
++
++static inline void otg_drv_vbus(struct otg_fsm *fsm, int on)
++{
++      if (fsm->drv_vbus != on) {
++              fsm->drv_vbus = on;
++              fsm->ops->drv_vbus(on);
++      }
++}
++
++static inline void otg_loc_conn(struct otg_fsm *fsm, int on)
++{
++      if (fsm->loc_conn != on) {
++              fsm->loc_conn = on;
++              fsm->ops->loc_conn(on);
++      }
++}
++
++static inline void otg_loc_sof(struct otg_fsm *fsm, int on)
++{
++      if (fsm->loc_sof != on) {
++              fsm->loc_sof = on;
++              fsm->ops->loc_sof(on);
++      }
++}
++
++static inline void otg_start_pulse(struct otg_fsm *fsm)
++{
++      fsm->ops->start_pulse();
++}
++
++static inline void otg_add_timer(struct otg_fsm *fsm, void *timer)
++{
++      fsm->ops->add_timer(timer);
++}
++
++static inline void otg_del_timer(struct otg_fsm *fsm, void *timer)
++{
++      fsm->ops->del_timer(timer);
++}
++
++extern int otg_statemachine(struct otg_fsm *fsm);
++
++extern const char *state_string(enum usb_otg_state state);
++
++#endif
+--- a/include/asm-m68k/mcf5445x_usb.h
++++ b/include/asm-m68k/mcf5445x_usb.h
+@@ -41,7 +41,8 @@ static inline void fsl_platform_set_host
+       /* set host mode and select "big endian" */
+       temp = fsl_readl(&regs->usbmode);
+-      fsl_writel(temp | USBMODE_CM_HOST | USBMODE_ES, &regs->usbmode);
++      temp |= USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
++      fsl_writel(temp, &regs->usbmode);
+       pr_debug("%s: set usbmode to 0x%x\n\n", __FUNCTION__,
+               fsl_readl(&regs->usbmode));
+--- a/include/linux/fsl_devices.h
++++ b/include/linux/fsl_devices.h
+@@ -91,6 +91,19 @@ enum fsl_usb2_operating_modes {
+       FSL_USB2_DR_OTG,
+ };
++/* DDD
++ * replace _operating_modes with _controller
++ *
++ * the operating_mode tests in fsl_platform_verify() aren't needed,
++ * since the ehci driver isn't going to be probe()d unless it's
++ * "fsl-ehci" device anyway, and what we really need to know is
++ * which controller (MPH/DR) we're dealing with
++ */
++enum fsl_usb2_controller {
++      FSL_USB2_MPH,
++      FSL_USB2_DR,
++};
++
+ enum fsl_usb2_phy_modes {
+       FSL_USB2_PHY_NONE,
+       FSL_USB2_PHY_ULPI,
+@@ -101,9 +114,36 @@ enum fsl_usb2_phy_modes {
+ struct fsl_usb2_platform_data {
+       /* board specific information */
+-      enum fsl_usb2_operating_modes   operating_mode;
++      /*
++       * DDD see note above
++       * enum fsl_usb2_operating_modes        operating_mode;
++       */
++      enum fsl_usb2_controller        controller;
+       enum fsl_usb2_phy_modes         phy_mode;
+       unsigned int                    port_enables;
++      /*
++       * DDD this could arguably be moved to a separate
++       * fsl usb2 device header file
++       */
++      char *name;                     /* pretty print */
++      int (*platform_init) (struct platform_device *);
++      void (*platform_uninit) (struct platform_device *);
++      int (*platform_verify) (struct platform_device *);
++      u32                             xcvr_type;      /* PORTSCX_PTS_* */
++      u32                             view;           /* ULPI viewport register */
++      u32                             r_start;        /* start of MEM resource */
++      u32                             r_len;          /* length of MEM resource */
++      void __iomem                    *regs;          /* ioremap'd register base */
++      unsigned                        big_endian_mmio : 1;
++      unsigned                        big_endian_desc : 1;
++      unsigned                        es : 1;         /* need USBMODE:ES */
++      unsigned                        have_sysif_regs : 1;
++      unsigned                        le_setup_buf : 1;
++      unsigned                        does_otg : 1;   /* set IFF it's an OTG port */
++
++      unsigned                        power_budget;   /* for hcd->power_budget */
++      struct fsl_xcvr_ops             *xcvr_ops;
++      int                             max_ep_nr;      /* max # of endpoints */
+ };
+ /* Flags in fsl_usb2_mph_platform_data */
+--- /dev/null
++++ b/include/linux/usb/fsl_usb2.h
+@@ -0,0 +1,464 @@
++/*
++ * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++/*
++ * Freescale USB device/endpoint management registers
++ */
++#ifndef __FSL_USB2_H
++#define __FSL_USB2_H
++
++
++ /* USB DR device mode registers (Little Endian) */
++struct fsl_usb_device_regs {
++      /* Capability register */
++      u32 id;
++      u32 res1[63];
++      u16 caplength;          /* Capability Register Length */
++      u16 hciversion;         /* Host Controller Interface Version */
++      u32 hcsparams;          /* Host Controller Structual Parameters */
++      u32 hccparams;          /* Host Controller Capability Parameters */
++      u32 res2[5];
++      u32 dciversion;         /* Device Controller Interface Version */
++      u32 dccparams;          /* Device Controller Capability Parameters */
++      u32 res3[6];
++      /* Operation register */
++      u32 usbcmd;             /* USB Command Register */
++      u32 usbsts;             /* USB Status Register */
++      u32 usbintr;            /* USB Interrupt Enable Register */
++      u32 frindex;            /* Frame Index Register */
++      u32 res4;
++      u32 deviceaddr;         /* Device Address */
++      u32 endpointlistaddr;   /* Endpoint List Address Register */
++      u32 res5;
++      u32 burstsize;          /* Master Interface Data Burst Size Register */
++      u32 txttfilltuning;     /* Transmit FIFO Tuning Controls Register */
++      u32 res6[2];
++      u32 ulpiview;
++      u32 res7[3];
++      u32 configflag;         /* Configure Flag Register */
++      u32 portsc1;            /* Port 1 Status and Control Register */
++      u32 res8[7];
++      u32 otgsc;              /* On-The-Go Status and Control */
++      u32 usbmode;            /* USB Mode Register */
++      u32 endptsetupstat;     /* Endpoint Setup Status Register */
++      u32 endpointprime;      /* Endpoint Initialization Register */
++      u32 endptflush;         /* Endpoint Flush Register */
++      u32 endptstatus;        /* Endpoint Status Register */
++      u32 endptcomplete;      /* Endpoint Complete Register */
++#if 0
++      u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */
++#else
++      // DDD see DCCPARAMS:DEN for the real number of device endpoints
++      // DDD 16 is the max
++      u32 endptctrl[16];      /* Endpoint Control Registers */
++#endif
++};
++
++ /* USB DR host mode registers (Little Endian) */
++struct fsl_usb_host_regs {
++      /* Capability register */
++      u32 id;
++      u32 res1[63];
++      u16 caplength;          /* Capability Register Length */
++      u16 hciversion;         /* Host Controller Interface Version */
++      u32 hcsparams;          /* Host Controller Structual Parameters */
++      u32 hccparams;          /* Host Controller Capability Parameters */
++      u32 res2[5];
++      u32 dciversion;         /* Device Controller Interface Version */
++      u32 dccparams;          /* Device Controller Capability Parameters */
++      u32 res3[6];
++      /* Operation register */
++      u32 usbcmd;             /* USB Command Register */
++      u32 usbsts;             /* USB Status Register */
++      u32 usbintr;            /* USB Interrupt Enable Register */
++      u32 frindex;            /* Frame Index Register */
++      u32 res4;
++      u32 periodiclistbase;   /* Periodic Frame List Base Address Register */
++      u32 asynclistaddr;      /* Current Asynchronous List Address Register */
++      u32 res5;
++      u32 burstsize;          /* Master Interface Data Burst Size Register */
++      u32 txttfilltuning;     /* Transmit FIFO Tuning Controls Register */
++      u32 res6[2];
++      u32 ulpiview;
++      u32 res7[3];
++      u32 configflag;         /* Configure Flag Register */
++      u32 portsc1;            /* Port 1 Status and Control Register */
++      u32 res8[7];
++      u32 otgsc;              /* On-The-Go Status and Control */
++      u32 usbmode;            /* USB Mode Register */
++      u32 endptsetupstat;     /* Endpoint Setup Status Register */
++      u32 endpointprime;      /* Endpoint Initialization Register */
++      u32 endptflush;         /* Endpoint Flush Register */
++      u32 endptstatus;        /* Endpoint Status Register */
++      u32 endptcomplete;      /* Endpoint Complete Register */
++#if 0
++      u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */
++#else
++      // DDD: do these exits in the host register set??
++      // DDD see DCCPARAMS:DEN for the real number of device endpoints
++      // DDD 16 is the max
++      u32 endptctrl[16];      /* Endpoint Control Registers */
++#endif
++};
++
++ /* non-EHCI USB system interface registers (Big Endian) */
++struct usb_sys_interface {
++      u32 snoop1;
++      u32 snoop2;
++      u32 age_cnt_thresh;     /* Age Count Threshold Register */
++      u32 pri_ctrl;           /* Priority Control Register */
++      u32 si_ctrl;            /* System Interface Control Register */
++      u32 res[59];
++      u32 control;            /* General Purpose Control Register */
++};
++
++/* ep0 transfer state */
++#define WAIT_FOR_SETUP                0
++#define DATA_STATE_XMIT               1
++#define DATA_STATE_NEED_ZLP   2
++#define WAIT_FOR_OUT_STATUS   3
++#define DATA_STATE_RECV               4
++
++/* Frame Index Register Bit Masks */
++#define       USB_FRINDEX_MASKS                       0x3fff
++
++
++
++/* USBCMD Register Bit Masks */
++#define USB_CMD_RUN_STOP                      0x00000001
++#define USB_CMD_CTRL_RESET                    0x00000002
++#define USB_CMD_PERIODIC_SCHEDULE_EN          0x00000010
++#define USB_CMD_ASYNC_SCHEDULE_EN             0x00000020
++#define USB_CMD_INT_AA_DOORBELL                       0x00000040
++#define USB_CMD_ASP                           0x00000300
++#define USB_CMD_ASYNC_SCH_PARK_EN             0x00000800
++#define USB_CMD_SUTW                          0x00002000
++#define USB_CMD_ATDTW                         0x00004000
++#define USB_CMD_ITC                           0x00FF0000
++
++/* bit 15,3,2 are frame list size */
++#define USB_CMD_FRAME_SIZE_1024                       0x00000000
++#define USB_CMD_FRAME_SIZE_512                        0x00000004
++#define USB_CMD_FRAME_SIZE_256                        0x00000008
++#define USB_CMD_FRAME_SIZE_128                        0x0000000C
++#define USB_CMD_FRAME_SIZE_64                 0x00008000
++#define USB_CMD_FRAME_SIZE_32                 0x00008004
++#define USB_CMD_FRAME_SIZE_16                 0x00008008
++#define USB_CMD_FRAME_SIZE_8                  0x0000800C
++
++/* bit 9-8 are async schedule park mode count */
++#define USB_CMD_ASP_00                                0x00000000
++#define USB_CMD_ASP_01                                0x00000100
++#define USB_CMD_ASP_10                                0x00000200
++#define USB_CMD_ASP_11                                0x00000300
++#define USB_CMD_ASP_BIT_POS                   8
++
++/* bit 23-16 are interrupt threshold control */
++#define USB_CMD_ITC_NO_THRESHOLD              0x00000000
++#define USB_CMD_ITC_1_MICRO_FRM                       0x00010000
++#define USB_CMD_ITC_2_MICRO_FRM                       0x00020000
++#define USB_CMD_ITC_4_MICRO_FRM                       0x00040000
++#define USB_CMD_ITC_8_MICRO_FRM                       0x00080000
++#define USB_CMD_ITC_16_MICRO_FRM              0x00100000
++#define USB_CMD_ITC_32_MICRO_FRM              0x00200000
++#define USB_CMD_ITC_64_MICRO_FRM              0x00400000
++#define USB_CMD_ITC_BIT_POS                   16
++
++
++
++
++/* USB STS Register Bit Masks */
++#define USB_STS_INT                           0x00000001
++#define USB_STS_ERR                           0x00000002
++#define USB_STS_PORT_CHANGE                   0x00000004
++#define USB_STS_FRM_LST_ROLL                  0x00000008
++#define USB_STS_SYS_ERR                               0x00000010
++#define USB_STS_IAA                           0x00000020
++#define USB_STS_RESET                         0x00000040
++#define USB_STS_SOF                           0x00000080
++#define USB_STS_SUSPEND                               0x00000100
++#define USB_STS_HC_HALTED                     0x00001000
++#define USB_STS_RCL                           0x00002000
++#define USB_STS_PERIODIC_SCHEDULE             0x00004000
++#define USB_STS_ASYNC_SCHEDULE                        0x00008000
++
++/* USB INTR Register Bit Masks */
++#define USB_INTR_INT_EN                               0x00000001
++#define USB_INTR_ERR_INT_EN                   0x00000002
++#define USB_INTR_PTC_DETECT_EN                        0x00000004
++#define USB_INTR_FRM_LST_ROLL_EN              0x00000008
++#define USB_INTR_SYS_ERR_EN                   0x00000010
++#define USB_INTR_ASYN_ADV_EN                  0x00000020
++#define USB_INTR_RESET_EN                     0x00000040
++#define USB_INTR_SOF_EN                               0x00000080
++#define USB_INTR_DEVICE_SUSPEND                       0x00000100
++
++/* Device Address bit masks */
++#define USB_DEVICE_ADDRESS_MASK                       0xFE000000
++#define USB_DEVICE_ADDRESS_BIT_POS            25
++
++/* endpoint list address bit masks */
++#define USB_EP_LIST_ADDRESS_MASK              0xfffff800
++
++
++/* x_PORTSCx */
++/* bit 31-30 are port transceiver select */
++#define PORTSCX_PTS_MASK              (3 << 30)       /* parallel xcvr select mask */
++#define PORTSCX_PHY_TYPE_SEL          PORTSCX_PTS_MASK
++#define PORTSCX_PTS_UTMI              (0 << 30)       /* UTMI/UTMI+ */
++#define PORTSCX_PTS_PHILIPS           (1 << 30)       /* Philips classic */
++#define PORTSCX_PTS_ULPI              (2 << 30)       /* ULPI */
++#define PORTSCX_PTS_SERIAL            (3 << 30)       /* serial */
++#define PORTSCX_PTS_FSLS              PORTSCX_PTS_SERIAL
++#define PORTSCX_PTS_ONCHIP            PORTSCX_PTS_FSLS
++
++#define PORTSCX_STS                   (1 << 29)       /* serial xcvr select */
++
++/* bit 28 is parallel transceiver width for UTMI interface */
++#define PORTSCX_PTW_8BIT              (0 << 28)       /* 8 bit parallel xcvr */
++#define PORTSCX_PTW_16BIT             (1 << 28)       /* 16 bi parallel xcvr */
++
++/* bit 27-26 are port speed */
++#define PORTSCX_PORT_SPEED_FULL               (0 << 26)
++#define PORTSCX_PORT_SPEED_LOW                (1 << 26)
++#define PORTSCX_PORT_SPEED_HIGH               (2 << 26)
++#define PORTSCX_PORT_SPEED_UNDEF      (3 << 26)
++#define PORTSCX_PORT_SPEED_MASK               (3 << 26)
++
++#define PORTSCX_PHY_LOW_POWER_SPD     (1 << 23)       /* phy low pwr suspend/clk disable */
++
++/* bit 19-16 are port test control */
++#define PORTSCX_PTC_DISABLE           (0 << 16)
++#define PORTSCX_PTC_JSTATE            (1 << 16)
++#define PORTSCX_PTC_KSTATE            (2 << 16)
++#define PORTSCX_PTC_SEQNAK            (3 << 16)       /* SE0 (host) / NAK (device) */
++#define PORTSCX_PTC_PACKET            (4 << 16)
++#define PORTSCX_PTC_FORCE_EN_HS               (5 << 16)
++#define PORTSCX_PTC_FORCE_EN_FS               (6 << 16)
++#define PORTSCX_PTC_FORCE_EN_LS               (7 << 16)
++
++
++/* bit 15-14 are port indicator control */
++#define PORTSCX_PIC_OFF                       (0 << 14)
++#define PORTSCX_PIC_AMBER             (1 << 14)
++#define PORTSCX_PIC_GREEN             (2 << 14)
++#define PORTSCX_PIC_UNDEF             (3 << 14)
++
++#define PORTSCX_PORT_POWER            (1 << 12)       /* port power */
++
++/* bit 11-10 are line status */
++#define PORTSCX_LS_MASK                       (3 << 10)       /* Line State mask */
++#define PORTSCX_LS_SE0                        (0 << 10)       /* SE0     */
++#define PORTSCX_LS_K_STATE            (1 << 10)       /* K-state */
++#define PORTSCX_LS_J_STATE            (2 << 10)       /* J-state */
++
++#define PORTSCX_PORT_RESET            (1 <<  8)       /* Port reset */
++#define PORTSCX_PORT_SUSPEND          (1 <<  7)       /* Suspend */
++#define PORTSCX_PORT_FORCE_RESUME     (1 <<  6)       /* Force port resume */
++#define PORTSCX_OVER_CURRENT_CHG      (1 <<  5)       /* over current change */
++#define PORTSCX_OVER_CURRENT_ACT      (1 <<  4)       /* over currrent active */
++#define PORTSCX_PORT_EN_DIS_CHANGE    (1 <<  3)       /* port {en,dis}able change */
++#define PORTSCX_PORT_ENABLE           (1 <<  2)       /* port enabled */
++#define PORTSCX_CONNECT_STATUS_CHANGE (1 <<  1)       /* connect status change */
++#define PORTSCX_CURRENT_CONNECT_STATUS        (1 <<  0)       /* current connect status */
++
++#define PORTSCX_W1C_BITS                     \
++       ( PORTSCX_CONNECT_STATUS_CHANGE |     \
++         PORTSCX_PORT_EN_DIS_CHANGE    |     \
++         PORTSCX_OVER_CURRENT_CHG )
++
++
++
++/* UOG_OTGSC Register Bits */
++/* control bits: */
++#define  OTGSC_CTRL_VBUS_DISCHARGE    (1 <<  0)
++#define  OTGSC_CTRL_VBUS_CHARGE               (1 <<  1)
++#define  OTGSC_CTRL_OTG_TERM          (1 <<  3)       /* controls DM pulldown */
++#define  OTGSC_CTRL_DATA_PULSING      (1 <<  4)
++#define  OTGSC_CTRL_USB_ID_PU         (1 <<  5)       /* enable ID pullup */
++/* current status: (R/O) */
++#define  OTGSC_STS_USB_ID             (1 <<  8)       /* 0=A-device  1=B-device */
++#define  OTGSC_STS_A_VBUS_VALID               (1 <<  9)
++#define  OTGSC_STS_A_SESSION_VALID    (1 << 10)
++#define  OTGSC_STS_B_SESSION_VALID    (1 << 11)
++#define  OTGSC_STS_B_SESSION_END      (1 << 12)
++#define  OTGSC_STS_1ms_TIMER          (1 << 13)
++#define  OTGSC_STS_DATA_PULSE         (1 << 14)
++/* interrupt status: (write to clear) */
++#define  OTGSC_INTSTS_MASK            (0x7f << 16)
++#define  OTGSC_INTSTS_USB_ID          (1 << 16)
++#define  OTGSC_INTSTS_A_VBUS_VALID    (1 << 17)
++#define  OTGSC_INTSTS_A_SESSION_VALID (1 << 18)
++#define  OTGSC_INTSTS_B_SESSION_VALID (1 << 19)
++#define  OTGSC_INTSTS_B_SESSION_END   (1 << 20)
++#define  OTGSC_INTSTS_1MS_TIMER               (1 << 21)
++#define  OTGSC_INTSTS_DATA_PULSE      (1 << 22)
++/* interrupt enables: */
++#define  OTGSC_IE_MASK                        (0x7f << 24)
++#define  OTGSC_IE_USB_ID              (1 << 24)
++#define  OTGSC_IE_A_VBUS_VALID                (1 << 25)
++#define  OTGSC_IE_A_SESSION_VALID     (1 << 26)
++#define  OTGSC_IE_B_SESSION_VALID     (1 << 27)
++#define  OTGSC_IE_B_SESSION_END               (1 << 28)
++#define  OTGSC_IE_1ms_TIMER           (1 << 29)
++#define  OTGSC_IE_DATA_PULSE          (1 << 30)
++
++#if 1 /* DDD FIXME these here for compatibility between my names and Leo's */
++/* OTG interrupt enable bit masks */
++#define  OTGSC_INTERRUPT_ENABLE_BITS_MASK     OTGSC_IE_MASK
++
++/* OTG interrupt status bit masks */
++#define  OTGSC_INTERRUPT_STATUS_BITS_MASK     OTGSC_INTSTS_MASK
++#endif // 1
++
++
++
++/* x_USBMODE */
++#undef USBMODE_SDIS   /* defined as bit 3 in drivers/usb/host/ehci.h */
++#define USBMODE_SDIS          (1 << 4)        /* stream disable mode */
++#define USBMODE_SLOM          (1 << 3)        /* setup lockout mode */
++#define USBMODE_ES            (1 << 2)        /* (big) endian select */
++#define USBMODE_CM_MASK               (3 << 0)        /* controller mode mask */
++#define USBMODE_CM_HOST               (3 << 0)        /* host */
++#define USBMODE_CM_DEVICE     (2 << 0)        /* device */
++// DDD #define USBMODE_CM_IDLE                (0 << 0)        /* idle */
++
++/* DDD for compatibility for now */
++#define USB_MODE_CTRL_MODE_IDLE               USBMODE_CM_IDLE
++#define USB_MODE_CTRL_MODE_DEVICE     USBMODE_CM_DEVICE
++#define USB_MODE_CTRL_MODE_HOST               USBMODE_CM_HOST
++#define USB_MODE_SETUP_LOCK_OFF               USBMODE_SLOM
++#define USB_MODE_STREAM_DISABLE               USBMODE_SDIS
++
++
++/* ULPIVIEW register bits */
++#define ULPIVW_WU             (1 << 31)       /* Wakeup */
++#define ULPIVW_RUN            (1 << 30)       /* read/write run */
++#define ULPIVW_WRITE          (1 << 29)       /* 0=read  1=write */
++#define ULPIVW_SS             (1 << 27)       /* SyncState */
++#define ULPIVW_PORT_MASK      0x07            /* Port field */
++#define ULPIVW_PORT_SHIFT     24
++#define ULPIVW_ADDR_MASK      0xFF            /* data address field */
++#define ULPIVW_ADDR_SHIFT     16
++#define ULPIVW_RDATA_MASK     0xFF            /* read data field */
++#define ULPIVW_RDATA_SHIFT    8
++#define ULPIVW_WDATA_MASK     0xFF            /* write data field */
++#define ULPIVW_WDATA_SHIFT    0
++
++
++/* Endpoint Flush Register */
++#define EPFLUSH_TX_OFFSET                     0x00010000
++#define EPFLUSH_RX_OFFSET                     0x00000000
++
++/* Endpoint Setup Status bit masks */
++#define EP_SETUP_STATUS_MASK                  0x0000003F
++#define EP_SETUP_STATUS_EP0                   0x00000001
++
++/* ENDPOINTCTRLx  Register Bit Masks */
++#define EPCTRL_TX_ENABLE                      0x00800000
++#define EPCTRL_TX_DATA_TOGGLE_RST             0x00400000      /* Not EP0 */
++#define EPCTRL_TX_DATA_TOGGLE_INH             0x00200000      /* Not EP0 */
++#define EPCTRL_TX_TYPE                                0x000C0000
++#define EPCTRL_TX_DATA_SOURCE                 0x00020000      /* Not EP0 */
++#define EPCTRL_TX_EP_STALL                    0x00010000
++#define EPCTRL_RX_ENABLE                      0x00000080
++#define EPCTRL_RX_DATA_TOGGLE_RST             0x00000040      /* Not EP0 */
++#define EPCTRL_RX_DATA_TOGGLE_INH             0x00000020      /* Not EP0 */
++#define EPCTRL_RX_TYPE                                0x0000000C
++#define EPCTRL_RX_DATA_SINK                   0x00000002      /* Not EP0 */
++#define EPCTRL_RX_EP_STALL                    0x00000001
++
++/* bit 19-18 and 3-2 are endpoint type */
++#define EPCTRL_EP_TYPE_CONTROL                        0
++#define EPCTRL_EP_TYPE_ISO                    1
++#define EPCTRL_EP_TYPE_BULK                   2
++#define EPCTRL_EP_TYPE_INTERRUPT              3
++#define EPCTRL_TX_EP_TYPE_SHIFT                       18
++#define EPCTRL_RX_EP_TYPE_SHIFT                       2
++
++/* SNOOPn Register Bit Masks */
++#define SNOOP_ADDRESS_MASK                    0xFFFFF000
++#define SNOOP_SIZE_ZERO                               0x00    /* snooping disable */
++#define SNOOP_SIZE_4KB                                0x0B    /* 4KB snoop size */
++#define SNOOP_SIZE_8KB                                0x0C
++#define SNOOP_SIZE_16KB                               0x0D
++#define SNOOP_SIZE_32KB                               0x0E
++#define SNOOP_SIZE_64KB                               0x0F
++#define SNOOP_SIZE_128KB                      0x10
++#define SNOOP_SIZE_256KB                      0x11
++#define SNOOP_SIZE_512KB                      0x12
++#define SNOOP_SIZE_1MB                                0x13
++#define SNOOP_SIZE_2MB                                0x14
++#define SNOOP_SIZE_4MB                                0x15
++#define SNOOP_SIZE_8MB                                0x16
++#define SNOOP_SIZE_16MB                               0x17
++#define SNOOP_SIZE_32MB                               0x18
++#define SNOOP_SIZE_64MB                               0x19
++#define SNOOP_SIZE_128MB                      0x1A
++#define SNOOP_SIZE_256MB                      0x1B
++#define SNOOP_SIZE_512MB                      0x1C
++#define SNOOP_SIZE_1GB                                0x1D
++#define SNOOP_SIZE_2GB                                0x1E    /* 2GB snoop size */
++
++/* pri_ctrl Register Bit Masks */
++#define PRI_CTRL_PRI_LVL1                     0x0000000C
++#define PRI_CTRL_PRI_LVL0                     0x00000003
++
++/* si_ctrl Register Bit Masks */
++#define SI_CTRL_ERR_DISABLE                   0x00000010
++#define SI_CTRL_IDRC_DISABLE                  0x00000008
++#define SI_CTRL_RD_SAFE_EN                    0x00000004
++#define SI_CTRL_RD_PREFETCH_DISABLE           0x00000002
++#define SI_CTRL_RD_PREFEFETCH_VAL             0x00000001
++
++
++/* control Register Bit Masks */
++#define USB_CTRL_IOENB                                0x00000004
++#define USB_CTRL_ULPI_INT0EN                  0x00000001
++
++
++/* Endpoint Transfer Descriptor bit Masks */
++#define DTD_NEXT_TERMINATE                    0x00000001
++#define DTD_IOC                                       0x00008000
++#define DTD_STATUS_ACTIVE                     0x00000080
++#define DTD_STATUS_HALTED                     0x00000040
++#define DTD_STATUS_DATA_BUFF_ERR              0x00000020
++#define DTD_STATUS_TRANSACTION_ERR            0x00000008
++#define DTD_RESERVED_FIELDS                   0x80007300
++#define DTD_ADDR_MASK                         0xFFFFFFE0
++#define DTD_PACKET_SIZE                               0x7FFF0000
++#define DTD_LENGTH_BIT_POS                    16
++#define DTD_ERROR_MASK (DTD_STATUS_HALTED | \
++                      DTD_STATUS_DATA_BUFF_ERR | \
++                      DTD_STATUS_TRANSACTION_ERR)
++/* Alignment requirements; must be a power of two */
++#define DTD_ALIGNMENT                         0x20
++#define QH_ALIGNMENT                          2048
++
++/* Controller dma boundary */
++#define UDC_DMA_BOUNDARY                      0x1000
++
++#if defined CONFIG_PPC32
++#define fsl_readl(addr)               in_le32((addr))
++#define fsl_writel(addr, val32)       out_le32((addr), (val32))
++#elif defined CONFIG_COLDFIRE
++#define fsl_readl(addr)               in_be32((__force unsigned *)(addr))
++#define fsl_writel(val32, addr)       out_be32((__force unsigned *)(addr), (val32))
++
++#define fsl_readw(addr)               in_be16((__force unsigned *)(addr))
++#define fsl_writew(val16, addr)       out_be16((__force unsigned *)(addr), (val16))
++#else
++#error fsl_{readl, writel} must be defined
++#endif
++
++#endif        /* __FSL_USB2_H */
+--- /dev/null
++++ b/include/linux/usb/fsl_xcvr.h
+@@ -0,0 +1,42 @@
++/*
++ * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
++ */
++
++/*
++ * The code contained herein is licensed under the GNU General Public
++ * License. You may obtain a copy of the GNU General Public License
++ * Version 2 or later at the following locations:
++ *
++ * http://www.opensource.org/licenses/gpl-license.html
++ * http://www.gnu.org/copyleft/gpl.html
++ */
++
++enum fsl_usb_ctrlr {
++      USB_CTRLR_H1 = 0,
++      USB_CTRLR_H2 = 1,
++      USB_CTRLR_OTG = 2,
++};
++
++
++/**
++ * struct fsl_xcvr_ops - USB transceiver operations
++ *
++ * @xcvr_type: one of PORTSCX_PTS_{UTMI,SERIAL,ULPI}
++ * @init: transceiver- and board-specific initialization function
++ * @uninit: transceiver- and board-specific uninitialization function
++ * @set_host:
++ * @set_device:
++ *
++ */
++struct fsl_xcvr_ops {
++      enum fsl_usb_ctrlr ctrlr;       /* H1, H2, OTG */
++      u32 xcvr_type;
++
++      void (*init)(struct platform_device *pdev);
++      void (*uninit)(struct platform_device *pdev);
++      void (*set_host)(void); /* DDD combine set_host and _device ? */
++      void (*set_device)(void);
++      void (*set_vbus_power)(struct fsl_usb2_platform_data *pdata, int on);
++};
++
++
diff --git a/target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch b/target/linux/coldfire/patches/017-mcfv4e_elf_entry_stext.patch
new file mode 100644 (file)
index 0000000..ffb3c8a
--- /dev/null
@@ -0,0 +1,25 @@
+From 2beb3e5edd46ea1d87ac87dbb977dce423a1f124 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 21 Nov 2007 14:56:19 -0700
+Subject: [PATCH] Change elf entry point from _start to _stext.
+
+Changing the symbol was required by CodeWarrior so it could
+locate the entry point.
+
+LTIBName: mcfv4e-elf-entry-stext
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/vmlinux-cf.lds |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/arch/m68k/coldfire/vmlinux-cf.lds
++++ b/arch/m68k/coldfire/vmlinux-cf.lds
+@@ -4,7 +4,7 @@
+ OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
+ OUTPUT_ARCH(m68k)
+-ENTRY(_start)
++ENTRY(_stext)
+ jiffies = jiffies_64 + 4;
+ SECTIONS
+ {
diff --git a/target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch b/target/linux/coldfire/patches/018-mcfv4e_linker_script_update.patch
new file mode 100644 (file)
index 0000000..3c7da56
--- /dev/null
@@ -0,0 +1,187 @@
+From 3aa2c28ff4271e9232b6c98ba000804de3ed3f33 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 26 Nov 2007 23:41:23 -0700
+Subject: [PATCH] Rewrite coldfire linker script.
+
+LTIBName: mcfv4e-linker-script-update
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/vmlinux-cf.lds |  107 ++++++++++++++++++++++++-------------
+ arch/m68k/kernel/vmlinux.lds.S    |    3 +-
+ 2 files changed, 72 insertions(+), 38 deletions(-)
+
+--- a/arch/m68k/coldfire/vmlinux-cf.lds
++++ b/arch/m68k/coldfire/vmlinux-cf.lds
+@@ -1,76 +1,115 @@
+-/* ld script to make m68k Coldfire Linux kernel */
++/* ld script to make m68k Coldfire Linux kernel
++ *
++ * Derived from arch/m68k/kernel/vmlinux-std.lds
++ *
++ * Updated 11/26/2007 for new CodeSourcery toolset
++ *     by Kurt Mahan <kmahan@freescale.com>
++ */
++
++#define       LOAD_OFFSET     0x00000000
+ #include <asm-generic/vmlinux.lds.h>
++#include <asm/page_offset.h>
++
++#define       START_OFFSET    0x00020000
++#define       IMAGE_START     PAGE_OFFSET_RAW + START_OFFSET
+ OUTPUT_FORMAT("elf32-m68k", "elf32-m68k", "elf32-m68k")
+ OUTPUT_ARCH(m68k)
+ ENTRY(_stext)
+ jiffies = jiffies_64 + 4;
++
+ SECTIONS
+ {
+-  . = 0xC0020000;
+-  _text = .;                  /* Text and read-only data */
+-  .text : {
++  . = IMAGE_START;
++  .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {
++      _text = .;                      /* Text and read-only data */
+       *(.text.head)
++  } :text = 0x4e75
++
++  .text : AT(ADDR(.text) - LOAD_OFFSET) {
+       TEXT_TEXT
+       SCHED_TEXT
+       LOCK_TEXT
+       *(.fixup)
+       *(.gnu.warning)
+-      } :text = 0x4e75
+-
++  } :text = 0x4e75
+   _etext = .;                 /* End of text section */
+   . = ALIGN(16);
+-  __start___ex_table = .;
+-  __ex_table : { *(__ex_table) }
+-  __stop___ex_table = .;
++  __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
++      __start___ex_table = .;
++      *(__ex_table)
++      __stop___ex_table = .;
++  }
+   RODATA
+-  .data : {                   /* Data */
++  . = ALIGN(8192);
++  .data : AT(ADDR(.data) - LOAD_OFFSET) {     /* Data */
+       DATA_DATA
+       CONSTRUCTORS
+-      }
++  } :data
+-  .bss : { *(.bss) }          /* BSS */
++  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {               /* BSS */
++      *(.bss)
++  }
+   . = ALIGN(16);
+-  .data.cacheline_aligned : { *(.data.cacheline_aligned) } :data
++  .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) {
++      *(.data.cacheline_aligned)
++  } :data
+   _edata = .;                 /* End of data section */
+   . = ALIGN(8192);            /* Initrd */
+-  __init_begin = .;
+-  .init.text : {
++  .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
++      __init_begin = .;
+       _sinittext = .;
+       *(.init.text)
+       _einittext = .;
+   }
+-  .init.data : { *(.init.data) }
++
++  .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
++      *(.init.data)
++  }
++
+   . = ALIGN(16);
+-  __setup_start = .;
+-  .init.setup : { *(.init.setup) }
+-  __setup_end = .;
+-  __initcall_start = .;
+-  .initcall.init : {
++  .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) {
++      __setup_start = .;
++      *(.init.setup)
++      __setup_end = .;
++  }
++
++  .initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
++      __initcall_start = .;
+       INITCALLS
++      __initcall_end = .;
+   }
+-  __initcall_end = .;
+-  __con_initcall_start = .;
+-  .con_initcall.init : { *(.con_initcall.init) }
+-  __con_initcall_end = .;
++
++  .con_initcall.init : AT(ADDR(.con_initcall.init) - LOAD_OFFSET) {
++      __con_initcall_start = .;
++      *(.con_initcall.init)
++      __con_initcall_end = .;
++  }
++
+   SECURITY_INIT
++
+ #ifdef CONFIG_BLK_DEV_INITRD
+   . = ALIGN(8192);
+-  __initramfs_start = .;
+-  .init.ramfs : { *(.init.ramfs) }
+-  __initramfs_end = .;
++  .init.ramfs : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
++      __initramfs_start = .;
++      *(.init.ramfs)
++      __initramfs_end = .;
++  }
+ #endif
++
+   . = ALIGN(8192);
+   __init_end = .;
+-  .data.init_task : { *(.data.init_task) }    /* The initial task and kernel stack */
++  .data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
++      *(.data.init_task)      /* The initial task and kernel stack */
++  }
+   _end = . ;
+@@ -79,14 +118,8 @@ SECTIONS
+       *(.exit.text)
+       *(.exit.data)
+       *(.exitcall.exit)
+-      }
++  }
+   /* Stabs debugging sections.  */
+-  .stab 0 : { *(.stab) }
+-  .stabstr 0 : { *(.stabstr) }
+-  .stab.excl 0 : { *(.stab.excl) }
+-  .stab.exclstr 0 : { *(.stab.exclstr) }
+-  .stab.index 0 : { *(.stab.index) }
+-  .stab.indexstr 0 : { *(.stab.indexstr) }
+-  .comment 0 : { *(.comment) }
++  STABS_DEBUG
+ }
+--- a/arch/m68k/kernel/vmlinux.lds.S
++++ b/arch/m68k/kernel/vmlinux.lds.S
+@@ -1,6 +1,7 @@
+ PHDRS
+ {
+-  text PT_LOAD FILEHDR PHDRS FLAGS (7);
++  headers PT_PHDR PHDRS ;
++  text PT_LOAD FILEHDR PHDRS FLAGS (5);
+   data PT_LOAD FLAGS (7);
+ }
+ #ifdef CONFIG_SUN3
diff --git a/target/linux/coldfire/patches/019-m5445x_spi.patch b/target/linux/coldfire/patches/019-m5445x_spi.patch
new file mode 100644 (file)
index 0000000..49b83e0
--- /dev/null
@@ -0,0 +1,3345 @@
+From bc755a3b8859e7307a8b10f39ca4cb6401c51987 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 27 Nov 2007 14:39:37 -0700
+Subject: [PATCH] Add M5445x SPI support.
+
+LTIBName: m5445x-spi
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/configs/m54455evb_defconfig |   24 +-
+ drivers/spi/Kconfig                   |   36 +
+ drivers/spi/Makefile                  |    4 +
+ drivers/spi/coldfire_edma.c           |  358 ++++++++
+ drivers/spi/spi-m5445x.c              |  156 ++++
+ drivers/spi/spi_coldfire.c            | 1552 +++++++++++++++++++++++++++++++++
+ drivers/spi/ssi_audio.c               |  906 +++++++++++++++++++
+ include/asm-m68k/coldfire_edma.h      |  101 ++-
+ include/linux/spi/mcfqspi.h           |   80 ++
+ 9 files changed, 3196 insertions(+), 21 deletions(-)
+ create mode 100644 drivers/spi/coldfire_edma.c
+ create mode 100644 drivers/spi/spi-m5445x.c
+ create mode 100644 drivers/spi/spi_coldfire.c
+ create mode 100644 drivers/spi/ssi_audio.c
+ create mode 100644 include/linux/spi/mcfqspi.h
+
+--- a/arch/m68k/configs/m54455evb_defconfig
++++ b/arch/m68k/configs/m54455evb_defconfig
+@@ -321,6 +321,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=1
+ #
+ # Self-contained MTD device drivers
+ #
++# CONFIG_MTD_DATAFLASH is not set
++# CONFIG_MTD_M25P80 is not set
+ # CONFIG_MTD_SLRAM is not set
+ # CONFIG_MTD_PHRAM is not set
+ # CONFIG_MTD_MTDRAM is not set
+@@ -497,8 +499,26 @@ CONFIG_UNIX98_PTYS=y
+ #
+ # SPI support
+ #
+-# CONFIG_SPI is not set
+-# CONFIG_SPI_MASTER is not set
++CONFIG_SPI=y
++# CONFIG_SPI_DEBUG is not set
++CONFIG_COLDFIRE_EDMA=y
++CONFIG_SPI_MASTER=y
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_BITBANG is not set
++CONFIG_SPI_COLDFIRE=y
++CONFIG_SPI_COLDFIRE_DSPI_EDMA=y
++
++#
++# SPI Protocol Masters
++#
++# CONFIG_SPI_AT25 is not set
++# CONFIG_SPI_SPIDEV is not set
++# CONFIG_SPI_TLE62X0 is not set
++CONFIG_SPI_COLDFIRE_SSI_AUDIO=y
++# CONFIG_SSIAUDIO_USE_EDMA is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
+--- a/drivers/spi/Kconfig
++++ b/drivers/spi/Kconfig
+@@ -35,6 +35,15 @@ config SPI_DEBUG
+         Say "yes" to enable debug messaging (like dev_dbg and pr_debug),
+         sysfs, and debugfs support in SPI controller and protocol drivers.
++config COLDFIRE_EDMA
++      tristate "Coldfire eDMA"
++      depends on COLDFIRE && EXPERIMENTAL
++      help
++          Support for Coldfire eDMA controller. Required for example
++          by SSI audio device driver.
++
++
++
+ #
+ # MASTER side ... talking to discrete SPI slave chips including microcontrollers
+ #
+@@ -113,6 +122,21 @@ config SPI_GPIO
+         If unsure, say N.
++config SPI_COLDFIRE
++      tristate "Coldfire QSPI/DSPI SPI Master"
++      depends on SPI_MASTER && COLDFIRE && EXPERIMENTAL
++      help
++        SPI driver for Freescale Coldfire QSPI module in master mode.
++        Tested with the 5282 processor, but should also work with other
++        Coldfire variants.
++
++config SPI_COLDFIRE_DSPI_EDMA   
++      boolean "Coldfire DSPI master driver uses eDMA"
++      depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA
++      default n
++      help
++        Say "yes" if you want DSPI master driver to use eDMA for transfers.
++
+ config SPI_IMX
+       tristate "Freescale iMX SPI controller"
+       depends on SPI_MASTER && ARCH_IMX && EXPERIMENTAL
+@@ -255,6 +279,18 @@ config SPI_TLE62X0
+ #
+ # Add new SPI protocol masters in alphabetical order above this line
+ #
++config SPI_COLDFIRE_SSI_AUDIO
++      tristate "Coldfire SSI AUDIO"
++      depends on SPI_MASTER && SPI_COLDFIRE && EXPERIMENTAL
++      help
++        SSI audio device driver
++
++config SSIAUDIO_USE_EDMA
++      boolean "Coldfire DSPI master driver uses eDMA"
++      default y
++      depends on EXPERIMENTAL && COLDFIRE_EDMA && SPI_COLDFIRE_SSI_AUDIO
++      help
++        Say "yes" if you want SSI audio driver to use eDMA for SSI transfers.
+ # (slave support would go here)
+--- a/drivers/spi/Makefile
++++ b/drivers/spi/Makefile
+@@ -6,6 +6,8 @@ ifeq ($(CONFIG_SPI_DEBUG),y)
+ EXTRA_CFLAGS += -DDEBUG
+ endif
++obj-$(CONFIG_COLDFIRE_EDMA)           += coldfire_edma.o
++
+ # small core, mostly translating board-specific
+ # config declarations into driver model code
+ obj-$(CONFIG_SPI_MASTER)              += spi.o
+@@ -16,6 +18,7 @@ obj-$(CONFIG_SPI_BFIN)                       += spi_bfin5xx.
+ obj-$(CONFIG_SPI_BITBANG)             += spi_bitbang.o
+ obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
+ obj-$(CONFIG_SPI_BUTTERFLY)           += spi_butterfly.o
++obj-$(CONFIG_SPI_COLDFIRE)            += spi_coldfire.o spi-m5445x.o
+ obj-$(CONFIG_SPI_GPIO)                        += spi_gpio.o
+ obj-$(CONFIG_SPI_IMX)                 += spi_imx.o
+ obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
+@@ -35,6 +38,7 @@ obj-$(CONFIG_SPI_SH_SCI)             += spi_sh_sci.
+ obj-$(CONFIG_SPI_AT25)                += at25.o
+ obj-$(CONFIG_SPI_SPIDEV)      += spidev.o
+ obj-$(CONFIG_SPI_TLE62X0)     += tle62x0.o
++obj-$(CONFIG_SPI_COLDFIRE_SSI_AUDIO)  += ssi_audio.o
+ #     ... add above this line ...
+ # SPI slave controller drivers (upstream link)
+--- /dev/null
++++ b/drivers/spi/coldfire_edma.c
+@@ -0,0 +1,358 @@
++/*
++ *
++ * coldfire_edma.c - eDMA driver for Coldfire MCF5445x
++ *
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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/init.h>
++#include <linux/module.h>
++#include <asm/virtconvert.h>
++#include <asm/coldfire.h>
++#include <linux/fs.h>
++#include <linux/cdev.h>
++#include <linux/seq_file.h>
++#include <linux/proc_fs.h>
++#include <asm/mcf5445x_edma.h>
++#include <asm/mcf5445x_intc.h>
++#include <asm/coldfire_edma.h>
++
++
++/* callback handler data for each TCD */
++struct edma_isr_record {
++      edma_irq_handler irq_handler;       /* interrupt handler */
++      edma_error_handler error_handler;       /* error interrupt handler */
++      void* dev;                                                      /* device used for the channel */
++      int  allocated;                                         /* busy flag */
++      spinlock_t *lock;                                       /* spin lock (if needs to be locked in interrupt) */
++      const char* device_id;                          /* device id string, used in proc file system */
++};
++
++/* device structure */
++struct coldfire_edma_dev {
++      struct cdev cdev;                       /* character device */
++      struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; /* channel handlers */
++};
++
++/* allocated major device number */
++static int coldfire_dma_major;
++/* device driver structure */
++static struct coldfire_edma_dev* devp = NULL;
++
++/* device driver file operations */
++struct file_operations coldfire_edma_fops = {
++      .owner = THIS_MODULE,
++};
++
++/* eDMA channel interrupt handler */
++static int dmaisr(int irq, void *dev_id)
++{
++      int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE;
++      int result = IRQ_HANDLED;
++
++      if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) {
++              spin_lock(devp->dma_interrupt_handlers[channel].lock);
++      }
++
++      if (devp!=NULL && devp->dma_interrupt_handlers[channel].irq_handler) {
++              result = devp->dma_interrupt_handlers[channel].irq_handler(channel,
++                                                      devp->dma_interrupt_handlers[channel].dev);
++      } else {
++              confirm_edma_interrupt_handled(channel);
++              printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", channel);
++      }
++
++      if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) {
++              spin_unlock(devp->dma_interrupt_handlers[channel].lock);
++      }
++
++      return result;
++}
++
++/* eDMA error interrupt handler */
++static int dma_error_isr(int irq, void* dev_id)
++{
++      u16 err;
++      int i;
++
++      err = MCF_EDMA_ERR;
++      for (i=0;i<EDMA_CHANNELS;i++) {
++              if (err & (1<<i)) {
++                      if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) {
++                              devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].dev);
++                      } else {
++                              printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i);
++                      }
++              }
++      }
++
++      MCF_EDMA_CERR = MCF_EDMA_CERR_CAER;
++      return IRQ_HANDLED;
++}
++
++/* sets channel parameters */
++void set_edma_params(int channel, u32 source, u32 dest,
++                                       u32 attr, u32 soff, u32 nbytes, u32 slast,
++                                       u32 citer, u32 biter, u32 doff, u32 dlast_sga,
++                                       int major_int, int disable_req)
++{
++
++      if (channel<0 || channel>EDMA_CHANNELS)
++              return;
++
++      MCF_EDMA_TCD_SADDR(channel) = source;
++      MCF_EDMA_TCD_DADDR(channel) = dest;
++      MCF_EDMA_TCD_ATTR(channel) = attr;
++      MCF_EDMA_TCD_SOFF(channel) = MCF_EDMA_TCD_SOFF_SOFF(soff);
++      MCF_EDMA_TCD_NBYTES(channel) = MCF_EDMA_TCD_NBYTES_NBYTES(nbytes);
++      MCF_EDMA_TCD_SLAST(channel) = MCF_EDMA_TCD_SLAST_SLAST(slast);
++      MCF_EDMA_TCD_CITER(channel) = MCF_EDMA_TCD_CITER_CITER(citer);
++      MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter);
++      MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff);
++      MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga);
++      /* interrupt at the end of major loop */
++      if (major_int) {
++              MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR;
++      } else {
++              MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR;
++      }
++      /* disable request at the end of major loop of transfer or not*/
++      if (disable_req) {
++              MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ;
++      } else {
++              MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ;
++      }
++
++}
++EXPORT_SYMBOL(set_edma_params);
++
++/* init eDMA controller */
++void init_edma(void)
++{
++      MCF_EDMA_CR = 0;
++}
++EXPORT_SYMBOL(init_edma);
++
++/* request eDMA channel */
++int request_edma_channel(int channel,
++                                              edma_irq_handler handler,
++                                              edma_error_handler error_handler,
++                                              void* dev,
++                                              spinlock_t *lock,
++                                              const char* device_id )
++{
++      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
++              if (devp->dma_interrupt_handlers[channel].allocated) {
++                      return -EBUSY;
++              }
++              devp->dma_interrupt_handlers[channel].allocated = 1;
++              devp->dma_interrupt_handlers[channel].irq_handler = handler;
++              devp->dma_interrupt_handlers[channel].error_handler = error_handler;
++              devp->dma_interrupt_handlers[channel].dev = dev;
++              devp->dma_interrupt_handlers[channel].lock = lock;
++              devp->dma_interrupt_handlers[channel].device_id = device_id;
++              return 0;
++      }
++      return -EINVAL;
++}
++EXPORT_SYMBOL(request_edma_channel);
++
++/* free eDMA channel */
++int free_edma_channel(int channel, void* dev)
++{
++      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
++              if (devp->dma_interrupt_handlers[channel].allocated) {
++                      if (devp->dma_interrupt_handlers[channel].dev != dev) {
++                              return -EBUSY;
++                      }
++                      devp->dma_interrupt_handlers[channel].allocated = 0;
++                      devp->dma_interrupt_handlers[channel].dev = NULL;
++                      devp->dma_interrupt_handlers[channel].irq_handler = NULL;
++                      devp->dma_interrupt_handlers[channel].error_handler = NULL;
++                      devp->dma_interrupt_handlers[channel].lock = NULL;
++              }
++              return 0;
++      }
++      return -EINVAL;
++}
++EXPORT_SYMBOL(free_edma_channel);
++
++/* clean-up device driver allocated resources */
++static void coldfire_edma_cleanup(void)
++{
++      dev_t devno;
++      int i;
++
++      /* free interrupts/memory */
++      if (devp) {
++              for (i=0;i<EDMA_CHANNELS;i++)
++              {
++                      MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+i;
++                      free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i,      devp);
++              }
++              MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS;
++              free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS, devp);
++              cdev_del(&devp->cdev);
++              kfree(devp);
++      }
++
++      /* unregister character device */
++      devno = MKDEV(coldfire_dma_major, 0);
++      unregister_chrdev_region(devno, 1);
++}
++
++#ifdef CONFIG_PROC_FS
++/* proc file system support */
++
++#define FREE_CHANNEL "free"
++#define DEVICE_UNKNOWN "device unknown"
++
++static int proc_edma_show(struct seq_file *m, void *v)
++{
++      int i;
++
++      if (devp==NULL) return 0;
++
++      for (i = 0 ; i < EDMA_CHANNELS ; i++) {
++              if (devp->dma_interrupt_handlers[i].allocated) {
++                      if (devp->dma_interrupt_handlers[i].device_id)
++                      seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id);
++                      else
++                              seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN);
++              } else {
++                      seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL);
++              }
++      }
++      return 0;
++}
++
++static int proc_edma_open(struct inode *inode, struct file *file)
++{
++      return single_open(file, proc_edma_show, NULL);
++}
++
++static const struct file_operations proc_edma_operations = {
++      .open           = proc_edma_open,
++      .read           = seq_read,
++      .llseek         = seq_lseek,
++      .release        = single_release,
++};
++
++static int __init proc_edma_init(void)
++{
++      struct proc_dir_entry *e;
++
++      e = create_proc_entry("edma", 0, NULL);
++      if (e)
++              e->proc_fops = &proc_edma_operations;
++
++      return 0;
++}
++
++#endif
++
++/* initializes device driver */
++static int __init coldfire_edma_init(void)
++{
++      dev_t dev;
++      int result;
++      int i;
++
++      /* allocate free major number */
++      result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME);
++      if (result<0) {
++              printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", result);
++              return result;
++      }
++      coldfire_dma_major = MAJOR(dev);
++
++      /* allocate device driver structure */
++      devp = kmalloc(sizeof(struct coldfire_edma_dev), GFP_KERNEL);
++      if (!devp) {
++              result = -ENOMEM;
++              goto fail;
++      }
++
++      /* init handlers (no handlers for beggining) */
++      for (i=0;i<EDMA_CHANNELS;i++) {
++              devp->dma_interrupt_handlers[i].irq_handler = NULL;
++              devp->dma_interrupt_handlers[i].error_handler = NULL;
++              devp->dma_interrupt_handlers[i].dev = NULL;
++              devp->dma_interrupt_handlers[i].allocated = 0;
++              devp->dma_interrupt_handlers[i].lock = NULL;
++              devp->dma_interrupt_handlers[i].device_id = NULL;
++      }
++
++    /* register char device */
++      cdev_init(&devp->cdev, &coldfire_edma_fops);
++      devp->cdev.owner = THIS_MODULE;
++      devp->cdev.ops = &coldfire_edma_fops;
++      result = cdev_add(&devp->cdev, dev, 1);
++      if (result) {
++              printk(KERN_NOTICE EDMA_DRIVER_NAME": Error %d adding coldfire-dma device\n", result);
++              result = -ENODEV;
++              goto fail;
++      }
++
++      /* request/enable irq for each eDMA channel */
++      for (i=0;i<EDMA_CHANNELS;i++)
++      {
++              result = request_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i,
++                      dmaisr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp);
++              if (result) {
++                      printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n",
++                              EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i);
++                      result = -EBUSY;
++                      goto fail;
++              }
++
++              MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+i) = EDMA_IRQ_LEVEL;
++              MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+i;
++
++      }
++
++    /* request error interrupt */
++      result = request_irq(EDMA_INT_CHANNEL_BASE + EDMA_INT_CONTROLLER_BASE + EDMA_CHANNELS,
++                              dma_error_isr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp);
++      if (result) {
++              printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n",
++                              EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS);
++              result = -EBUSY;
++              goto fail;
++      }
++
++      /* enable error interrupt in interrupt controller */
++      MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS) = EDMA_IRQ_LEVEL;
++      MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS;
++
++#ifdef CONFIG_PROC_FS
++      proc_edma_init();
++#endif
++
++      printk(EDMA_DRIVER_NAME ": initialized successfully\n");
++
++      return 0;
++fail:
++      coldfire_edma_cleanup();
++      return result;
++
++}
++
++static void __exit coldfire_edma_exit(void)
++{
++      coldfire_edma_cleanup();
++}
++
++module_init(coldfire_edma_init);
++module_exit(coldfire_edma_exit);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Yaroslav Vinogradov, Freescale Inc.");
++MODULE_DESCRIPTION("eDMA library for Coldfire 5445x");
+--- /dev/null
++++ b/drivers/spi/spi-m5445x.c
+@@ -0,0 +1,156 @@
++/***************************************************************************/
++/*
++ *    linux/arch/m68k/coldfire/spi-m5445x.c
++ *
++ *    Sub-architcture dependant initialization code for the Freescale
++ *    5445x SPI module
++ *
++ *    Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *    Copyright Freescale Semiconductor, Inc 2007
++ *
++ *    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/kernel.h>
++#include <linux/sched.h>
++#include <linux/param.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <linux/device.h>
++#include <linux/platform_device.h>
++#include <linux/spi/spi.h>
++
++#include <asm/dma.h>
++#include <asm/traps.h>
++#include <asm/machdep.h>
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++#include <asm/mcfqspi.h>
++#include <asm/mcf5445x_gpio.h>
++
++#define SPI_NUM_CHIPSELECTS   0x10
++#define SPI_PAR_VAL  (0 | MCF_GPIO_PAR_DSPI_PCS5_PCS5 | MCF_GPIO_PAR_DSPI_PCS2_PCS2 \
++              | MCF_GPIO_PAR_DSPI_PCS1_PCS1 | MCF_GPIO_PAR_DSPI_PCS0_PCS0 | MCF_GPIO_PAR_DSPI_SIN_SIN \
++              | MCF_GPIO_PAR_DSPI_SOUT_SOUT | MCF_GPIO_PAR_DSPI_SCK_SCK)
++
++#define MCF5445x_DSPI_IRQ_SOURCE      (31)
++#define MCF5445x_DSPI_IRQ_VECTOR      (64 + MCF5445x_DSPI_IRQ_SOURCE)
++
++#define MCF5445x_DSPI_PAR     (0xFC0A4063)
++#define MCF5445x_DSPI_MCR     (0xFC05C000)
++#define MCF5445x_INTC0_ICR    (0xFC048040)
++#define MCF5445x_INTC0_IMRL   (0xFC04800C)
++
++
++#define M5445x_AUDIO_IRQ_SOURCE 49
++#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE)
++#define M5445x_AUDIO_IRQ_LEVEL        4
++
++void coldfire_qspi_cs_control(u8 cs, u8 command)
++{
++}
++
++#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO)
++static struct coldfire_spi_chip ssi_audio_chip_info = {
++      .mode = SPI_MODE_0,
++      .bits_per_word = 16,
++      .del_cs_to_clk = 16,
++      .del_after_trans = 16,
++      .void_write_data = 0
++};
++
++#endif
++
++static struct spi_board_info spi_board_info[] = {
++
++#if defined(CONFIG_SPI_COLDFIRE_SSI_AUDIO)
++      {
++              .modalias = "ssi_audio",
++              .max_speed_hz = 300000,
++              .bus_num = 1,
++              .chip_select = 5,
++              .irq = M5445x_AUDIO_IRQ_VECTOR,
++              .platform_data = NULL,
++              .controller_data = &ssi_audio_chip_info
++      }
++#endif
++
++};
++
++static struct coldfire_spi_master coldfire_master_info = {
++      .bus_num = 1,
++      .num_chipselect = SPI_NUM_CHIPSELECTS,
++      .irq_source = MCF5445x_DSPI_IRQ_SOURCE,
++      .irq_vector = MCF5445x_DSPI_IRQ_VECTOR,
++      .irq_mask = (0x01 << MCF5445x_DSPI_IRQ_SOURCE),
++      .irq_lp = 0x2,  /* Level */
++      .par_val = SPI_PAR_VAL,
++//    .par_val16 = SPI_PAR_VAL,
++      .cs_control = coldfire_qspi_cs_control,
++};
++
++static struct resource coldfire_spi_resources[] = {
++      [0] = {
++              .name = "qspi-par",
++              .start = MCF5445x_DSPI_PAR,
++              .end = MCF5445x_DSPI_PAR,
++              .flags = IORESOURCE_MEM
++      },
++
++      [1] = {
++              .name = "qspi-module",
++              .start = MCF5445x_DSPI_MCR,
++              .end = MCF5445x_DSPI_MCR + 0xB8,
++              .flags = IORESOURCE_MEM
++      },
++
++      [2] = {
++              .name = "qspi-int-level",
++              .start = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE,
++              .end = MCF5445x_INTC0_ICR + MCF5445x_DSPI_IRQ_SOURCE,
++              .flags = IORESOURCE_MEM
++      },
++
++      [3] = {
++              .name = "qspi-int-mask",
++              .start = MCF5445x_INTC0_IMRL,
++              .end = MCF5445x_INTC0_IMRL,
++              .flags = IORESOURCE_MEM
++      }
++};
++
++static struct platform_device coldfire_spi = {
++      .name = "spi_coldfire", //"coldfire-qspi",
++      .id = -1,
++      .resource = coldfire_spi_resources,
++      .num_resources = ARRAY_SIZE(coldfire_spi_resources),
++      .dev = {
++              .platform_data = &coldfire_master_info,
++      }
++};
++
++static int __init spi_dev_init(void)
++{
++      int retval = 0;
++      
++      retval = platform_device_register(&coldfire_spi);
++
++      if (retval < 0) {
++              printk(KERN_ERR "SPI-m5445x: platform_device_register failed with code=%d\n", retval);
++              goto out;
++      }
++
++      if (ARRAY_SIZE(spi_board_info))
++              retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
++
++
++out:
++      return retval;
++}
++
++arch_initcall(spi_dev_init);
+--- /dev/null
++++ b/drivers/spi/spi_coldfire.c
+@@ -0,0 +1,1552 @@
++/****************************************************************************/
++
++/*
++ *    spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
++ *
++ *    (C) Copyright 2005, Intec Automation,
++ *                        Mike Lavender (mike@steroidmicros)
++ *
++ *    (C) Copyright 2007, Freescale Inc,
++ *                        Yaroslav Vinogradov (yaroslav.vinogradov@freescale.com)
++ *
++
++     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.
++
++     This program is distributed in the hope that it will be useful,
++     but WITHOUT ANY WARRANTY; without even the implied warranty of
++     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++     GNU General Public License for more details.
++
++     You should have received a copy of the GNU General Public License
++     along with this program; if not, write to the Free Software
++     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
++/* ------------------------------------------------------------------------- */
++
++
++/****************************************************************************/
++
++/*
++ * Includes
++ */
++
++#include <linux/autoconf.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/spi/spi.h>
++#include <linux/workqueue.h>
++#include <linux/delay.h>
++
++#include <asm/delay.h>
++#include <asm/mcfsim.h>
++#include <asm/mcfqspi.h>
++#include <asm/coldfire.h>
++#include <asm/virtconvert.h>
++
++#if defined(CONFIG_M54455)
++      #define SPI_DSPI
++      #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
++              #define SPI_DSPI_EDMA
++              #ifdef CONFIG_MMU
++                      #define SPI_USE_MMU
++              #endif
++      #endif
++#endif
++
++#ifdef SPI_DSPI
++#include <asm/mcf5445x_dspi.h>
++
++
++#endif
++
++#if defined(SPI_DSPI_EDMA)
++
++/* edma buffer size in transfer units (32bits) */
++#define EDMA_BUFFER_SIZE      (PAGE_SIZE/4)
++#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4)
++
++#define DSPI_DMA_RX_TCD       12
++#define DSPI_DMA_TX_TCD 13
++
++
++#include <asm/coldfire_edma.h>
++#include <asm/mcf5445x_edma.h>
++#endif
++
++
++MODULE_AUTHOR("Mike Lavender");
++MODULE_DESCRIPTION("ColdFire QSPI Contoller");
++MODULE_LICENSE("GPL");
++
++#define DRIVER_NAME "Coldfire QSPI/DSPI"
++
++/****************************************************************************/
++
++/*
++ * Local constants and macros
++ */
++
++#define QSPI_RAM_SIZE         0x10    /* 16 word table */
++
++#define QSPI_TRANSMIT_RAM     0x00
++#define QSPI_RECEIVE_RAM      0x10
++#define QSPI_COMMAND_RAM      0x20
++
++#define QSPI_COMMAND          0x7000  /* 15:   X = Continuous CS
++                                       * 14:   1 = Get BITSE from QMR[BITS]
++                                       * 13:   1 = Get DT    from QDLYR[DTL]
++                                       * 12:   1 = Get DSK   from QDLYR[QCD]
++                                       * 8-11: XXXX = next 4 bytes for CS
++                                       * 0-7:  0000 0000 Reserved
++                                       */
++
++#define QIR_WCEF                0x0008  /* write collison */
++#define QIR_ABRT                0x0004  /* abort */
++#define QIR_SPIF                0x0001  /* finished */
++
++#define QIR_WCEFE                     0x0800
++#define QIR_ABRTE                     0x0400
++#define QIR_SPIFE                     0x0100
++
++#define QIR_WCEFB                     0x8000
++#define QIR_ABRTB                     0x4000
++#define QIR_ABRTL                     0x1000
++
++#define QMR_BITS              0x3C00
++#define QMR_BITS_8              0x2000
++
++#define QCR_CONT                      0x8000
++
++#define QDLYR_SPE             0x8000
++
++#define QWR_ENDQP_MASK                0x0F00
++#define QWR_CSIV              0x1000  /* 1 = active low chip selects */
++
++
++#define START_STATE ((void*)0)
++#define RUNNING_STATE ((void*)1)
++#define DONE_STATE ((void*)2)
++#define ERROR_STATE ((void*)-1)
++
++#define QUEUE_RUNNING 0
++#define QUEUE_STOPPED 1
++
++/****************************************************************************/
++
++/*
++ * Local Data Structures
++ */
++
++struct transfer_state {
++      u32 index;
++      u32 len;
++      void *tx;
++      void *tx_end;
++      void *rx;
++      void *rx_end;
++      char flags;
++#define TRAN_STATE_RX_VOID       0x01
++#define TRAN_STATE_TX_VOID       0x02
++#define TRAN_STATE_WORD_ODD_NUM          0x04
++      u8 cs;
++      u16 void_write_data;
++      unsigned cs_change:1;
++};
++
++typedef struct {
++      unsigned master:1;
++      unsigned dohie:1;
++      unsigned bits:4;
++      unsigned cpol:1;
++      unsigned cpha:1;
++      unsigned baud:8;
++} QMR;
++
++typedef struct {
++      unsigned spe:1;
++      unsigned qcd:7;
++      unsigned dtl:8;
++} QDLYR;
++
++typedef struct {
++      unsigned halt:1;
++      unsigned wren:1;
++      unsigned wrto:1;
++      unsigned csiv:1;
++      unsigned endqp:4;
++      unsigned cptqp:4;
++      unsigned newqp:4;
++} QWR;
++
++
++typedef struct {
++      unsigned master:1;
++      unsigned cont_scke:1;
++      unsigned dconf:2;
++      unsigned frz:1;
++      unsigned mtfe:1;
++      unsigned pcsse:1;
++      unsigned rooe:1;
++      unsigned pcsis:8;
++      unsigned reserved15:1;
++      unsigned mdis:1;
++      unsigned dis_tx:1;
++      unsigned dis_rxf:1;
++      unsigned clr_tx:1;
++      unsigned clr_rxf:1;
++      unsigned smpl_pt:2;
++      unsigned reserved71:7;
++      unsigned halt:1;
++} DSPI_MCR;
++
++typedef struct {
++      unsigned dbr:1;
++      unsigned fmsz:4;
++      unsigned cpol:1;
++      unsigned cpha:1;
++      unsigned lsbfe:1;
++      unsigned pcssck:2;
++      unsigned pasc:2;
++      unsigned pdt:2;
++      unsigned pbr:2;
++      unsigned cssck:4;
++      unsigned asc:4;
++      unsigned dt:4;
++      unsigned br:4;
++} DSPI_CTAR;
++
++struct chip_data {
++#if defined(SPI_DSPI)
++      /* dspi data */
++      union {
++              u32 mcr_val;
++              DSPI_MCR mcr;
++      };
++      union {
++              u32 ctar_val;
++              DSPI_CTAR ctar;
++      };
++#else
++      union {
++              u16 qmr_val;
++              QMR qmr;
++      };
++      union {
++              u16 qdlyr_val;
++              QDLYR qdlyr;
++      };
++      union {
++              u16 qwr_val;
++              QWR qwr;
++      };
++#endif
++
++      u16 void_write_data;
++};
++
++
++struct driver_data {
++      /* Driver model hookup */
++      struct platform_device *pdev;
++
++      /* SPI framework hookup */
++      struct spi_master *master;
++
++      /* Driver message queue */
++      struct workqueue_struct *workqueue;
++      struct work_struct pump_messages;
++      spinlock_t lock;
++      struct list_head queue;
++      int busy;
++      int run;
++
++      /* Message Transfer pump */
++      struct tasklet_struct pump_transfers;
++
++      /* Current message transfer state info */
++      struct spi_message* cur_msg;
++      struct spi_transfer* cur_transfer;
++      struct chip_data *cur_chip;
++      size_t len;
++      void *tx;
++      void *tx_end;
++      void *rx;
++      void *rx_end;
++      char flags;
++#define TRAN_STATE_RX_VOID       0x01
++#define TRAN_STATE_TX_VOID       0x02
++#define TRAN_STATE_WORD_ODD_NUM          0x04
++      u8 cs;
++      u16 void_write_data;
++      unsigned cs_change:1;
++
++      u32 trans_cnt;
++      u32 wce_cnt;
++      u32 abrt_cnt;
++#if defined(SPI_DSPI)
++      u32 *mcr;                       /* DSPI MCR register */
++      u32 *ctar;                      /* DSPI CTAR register */
++      u32 *dspi_dtfr;         /* DSPI DTFR register */
++      u32 *dspi_drfr;         /* DSPI DRFR register */
++      u32 *dspi_rser;         /* DSPI RSER register */
++      u32 *dspi_sr;           /* DSPI status register */
++      u8      dspi_ctas;              /* DSPI CTAS value*/
++      
++#if defined(SPI_DSPI_EDMA)
++      void*   edma_tx_buf;
++      void*   edma_rx_buf;
++#endif
++      
++              
++#else
++      u16 *qmr;          /* QSPI mode register      */
++      u16 *qdlyr;        /* QSPI delay register     */
++      u16 *qwr;          /* QSPI wrap register      */
++      u16 *qir;          /* QSPI interrupt register */
++      u16 *qar;          /* QSPI address register   */
++      u16 *qdr;          /* QSPI data register      */
++      u16 *qcr;          /* QSPI command register   */
++#endif
++      u8  *par;          /* Pin assignment register */
++      u8  *int_icr;      /* Interrupt level and priority register */
++      u32 *int_mr;       /* Interrupt mask register */
++      void (*cs_control)(u8 cs, u8 command);
++};
++
++#define DSPI_CS(cs) ((1<<(cs))<<16)
++
++
++/****************************************************************************/
++
++/*
++ * SPI local functions
++ */
++
++//#define SPI_COLDFIRE_DEBUG
++
++static void *next_transfer(struct driver_data *drv_data)
++{
++      struct spi_message *msg = drv_data->cur_msg;
++      struct spi_transfer *trans = drv_data->cur_transfer;
++
++      /* Move to next transfer */
++      if (trans->transfer_list.next != &msg->transfers) {
++              drv_data->cur_transfer =
++                      list_entry(trans->transfer_list.next,
++                                      struct spi_transfer,
++                                      transfer_list);
++              return RUNNING_STATE;
++      } else
++              return DONE_STATE;
++}
++
++
++#define DSPI_BITS MCF_DSPI_DCTAR_FMSZ(15)
++#define DSPI_BITS_16 MCF_DSPI_DCTAR_FMSZ(15)
++#define DSPI_BITS_8 MCF_DSPI_DCTAR_FMSZ(7)
++#define DSPI_FIFO_SIZE 16
++
++static inline int is_word_transfer(struct driver_data *drv_data)
++{
++#if defined(SPI_DSPI)
++      return ((*drv_data->ctar & DSPI_BITS_16) == DSPI_BITS_8) ? 0 : 1;
++#else
++      return ((*drv_data->qmr & QMR_BITS) == QMR_BITS_8) ? 0 : 1;
++#endif
++}
++
++static void inline set_8bit_transfer_mode(struct driver_data *drv_data)
++{
++#if defined(SPI_DSPI)
++      *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_8;
++#else
++      *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS) | QMR_BITS_8;
++#endif
++}
++
++static void inline set_16bit_transfer_mode(struct driver_data *drv_data)
++{
++#if defined(SPI_DSPI)
++      *drv_data->ctar |= (*drv_data->ctar & ~DSPI_BITS) | DSPI_BITS_16;
++#else
++      *drv_data->qmr |= (*drv_data->qmr & ~QMR_BITS);
++#endif
++}
++
++static int write(struct driver_data *drv_data)
++{
++      int tx_count = 0;
++#ifndef SPI_DSPI
++      int cmd_count = 0;
++#endif
++      int tx_word;
++
++#if defined(SPI_DSPI)
++
++#if defined(SPI_DSPI_EDMA)
++      u32* edma_wr;
++#endif
++
++      u16 d16;
++      u8  d8;
++      u32 dspi_pushr;
++      int first = 1;
++#endif
++
++      tx_word = is_word_transfer(drv_data);
++
++      // If we are in word mode, but only have a single byte to transfer
++      // then switch to byte mode temporarily.  Will switch back at the
++      // end of the transfer.
++      if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
++              drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
++              set_8bit_transfer_mode(drv_data);
++              tx_word = 0;
++      }
++
++
++#if defined(SPI_DSPI)
++
++#if defined(SPI_DSPI_EDMA)
++      edma_wr = (u32*)(drv_data->edma_tx_buf);
++#endif
++
++
++#if defined(SPI_DSPI_EDMA)
++      while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) {
++#else
++      while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) {
++#endif
++              if (tx_word) {
++                      if ((drv_data->tx_end - drv_data->tx) == 1)
++                              break;
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID)) {
++                              d16 = *(u16 *)drv_data->tx;
++                      } else {
++                              d16 = drv_data->void_write_data;
++                      }
++
++                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16)
++                                                | DSPI_CS(drv_data->cs)
++                                               | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
++                                               //| MCF_DSPI_DTFR_CONT
++                                               ;
++
++                      drv_data->tx += 2;
++
++#if defined(SPI_DSPI_EDMA)
++                      if (drv_data->tx == drv_data->tx_end  || tx_count==EDMA_BUFFER_SIZE-1) {
++#else                 
++                      if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
++#endif                                
++                              // last transfer in queue
++                              dspi_pushr |= MCF_DSPI_DTFR_EOQ;
++                              if (drv_data->cs_change) {
++                                      dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
++                              }
++                      }
++
++                      if (first) {
++                              first = 0;
++                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
++                      }
++#if defined(SPI_DSPI_EDMA)
++                      *edma_wr = dspi_pushr;
++                      edma_wr++;                      
++#else
++                      *drv_data->dspi_dtfr = dspi_pushr;
++                      //MCF_DSPI_DTFR = dspi_pushr;
++#endif
++
++
++              } else {
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID)) {
++                              d8 = *(u8 *)drv_data->tx;
++                      } else {
++                              d8 = *(u8 *)&drv_data->void_write_data;
++                      }
++
++                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8)
++                                               | DSPI_CS(drv_data->cs)
++                                               /* | MCF_DSPI_DTFR_PCS5 | */
++                                               | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
++                                               | MCF_DSPI_DTFR_CONT;
++
++                      drv_data->tx++;
++
++                      if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
++                              // last transfer in queue
++                              dspi_pushr |= MCF_DSPI_DTFR_EOQ;
++                              if (drv_data->cs_change) {
++                                      dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
++                              }
++                      }
++
++                      if (first) {
++                              first = 0;
++                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
++                      }
++
++#if defined(SPI_DSPI_EDMA)
++                      *edma_wr = dspi_pushr;
++                      edma_wr++;                      
++#else                 
++                      *drv_data->dspi_dtfr = dspi_pushr;
++                      //MCF_DSPI_DTFR = dspi_pushr;
++#endif                        
++
++              }
++              tx_count++;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++
++      if (tx_count>0) {
++
++              // TODO: initiate eDMA transfer
++              set_edma_params(DSPI_DMA_TX_TCD,
++#ifdef SPI_USE_MMU
++                                      virt_to_phys(drv_data->edma_tx_buf),
++#else
++                                      drv_data->edma_tx_buf,
++#endif
++                                      (u32)drv_data->dspi_dtfr,
++                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                                      4,  // soff
++                                      4,  // nbytes
++                                      0,  // slast
++                                      tx_count, // citer
++                                      tx_count, // biter
++                                      0, // doff
++                                      0, // dlastsga
++                                      0, // major_int
++                                      1  // disable_req
++                                      );
++
++              set_edma_params(DSPI_DMA_RX_TCD,
++                                      (u32)drv_data->dspi_drfr,
++#ifdef SPI_USE_MMU
++                                      virt_to_phys(drv_data->edma_rx_buf),
++#else
++                                      drv_data->edma_rx_buf,
++#endif
++                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                                      0,  // soff
++                                      4,  // nbytes
++                                      0,  // slast
++                                      tx_count, // citer
++                                      tx_count, // biter
++                                      4, // doff
++                                      0,  // dlastsga
++                    0,   // major_int
++                                      1       // disable_req
++                                      );
++
++
++              start_edma_transfer(DSPI_DMA_TX_TCD); // transmit SPI data
++              start_edma_transfer(DSPI_DMA_RX_TCD); // receive SPI data
++      }
++#endif
++
++#else
++
++      *drv_data->qar = QSPI_TRANSMIT_RAM;
++      while ((drv_data->tx < drv_data->tx_end) && (tx_count < QSPI_RAM_SIZE)) {
++              if (tx_word) {
++                      if ((drv_data->tx_end - drv_data->tx) == 1)
++                              break;
++
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
++                              *drv_data->qdr = *(u16 *)drv_data->tx;
++                      else
++                              *drv_data->qdr = drv_data->void_write_data;
++                      drv_data->tx += 2;
++              } else {
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
++                              *drv_data->qdr = *(u8 *)drv_data->tx;
++                      else
++                              *drv_data->qdr = *(u8 *)&drv_data->void_write_data;
++                      drv_data->tx++;
++              }
++              tx_count++;
++      }
++
++
++      *drv_data->qar = QSPI_COMMAND_RAM;
++      while (cmd_count < tx_count) {
++              u16 qcr =   QSPI_COMMAND
++                        | QCR_CONT
++                        | (~((0x01 << drv_data->cs) << 8) & 0x0F00);
++
++              if (       (cmd_count == tx_count - 1)
++                      && (drv_data->tx == drv_data->tx_end)
++                      && (drv_data->cs_change) ) {
++                      qcr &= ~QCR_CONT;
++              }
++              *drv_data->qcr = qcr;
++              cmd_count++;
++      }
++
++      *drv_data->qwr = (*drv_data->qwr & ~QWR_ENDQP_MASK) | ((cmd_count - 1) << 8);
++
++      /* Fire it up! */
++      *drv_data->qdlyr |= QDLYR_SPE;
++#endif
++
++      return tx_count;
++}
++
++
++static int read(struct driver_data *drv_data)
++{
++      int rx_count = 0;
++      int rx_word;
++#if defined(SPI_DSPI_EDMA)
++      u32* rx_edma;
++#endif
++      u16 d;
++      rx_word = is_word_transfer(drv_data);
++
++#if defined(SPI_DSPI)
++
++#if defined(SPI_DSPI_EDMA)
++      rx_edma = (u32*) drv_data->edma_tx_buf;
++      while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) {
++#else
++      while ((drv_data->rx < drv_data->rx_end) && (rx_count < DSPI_FIFO_SIZE)) {
++#endif
++              if (rx_word) {
++                      if ((drv_data->rx_end - drv_data->rx) == 1)
++                              break;
++#if defined(SPI_DSPI_EDMA)
++                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
++                      rx_edma++;
++#else
++                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
++#endif
++
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u16 *)drv_data->rx = d;
++                      drv_data->rx += 2;
++              } else {
++#if defined(SPI_DSPI_EDMA)
++                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
++                      rx_edma++;
++#else
++                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
++#endif
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u8 *)drv_data->rx = d;
++                      drv_data->rx++;
++              }
++              rx_count++;
++      }
++
++
++#else
++
++      *drv_data->qar = QSPI_RECEIVE_RAM;
++      while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) {
++              if (rx_word) {
++                      if ((drv_data->rx_end - drv_data->rx) == 1)
++                              break;
++
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u16 *)drv_data->rx = *drv_data->qdr;
++                      drv_data->rx += 2;
++              } else {
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u8 *)drv_data->rx = *drv_data->qdr;
++                      drv_data->rx++;
++              }
++              rx_count++;
++      }
++#endif
++
++      return rx_count;
++}
++
++
++static inline void qspi_setup_chip(struct driver_data *drv_data)
++{
++      struct chip_data *chip = drv_data->cur_chip;
++
++#if defined(SPI_DSPI)
++
++      *drv_data->mcr = chip->mcr_val;
++
++      // TODO: remove later
++      chip->ctar_val = 0x78560118;
++
++      *drv_data->ctar = chip->ctar_val;
++      *drv_data->dspi_rser =  0
++                                                      | MCF_DSPI_DRSER_EOQFE
++#if defined(SPI_DSPI_EDMA)
++                                                      | MCF_DSPI_DRSER_TFFFE
++                                                      | MCF_DSPI_DRSER_TFFFS
++#endif
++                                                      ;
++
++
++#else
++      *drv_data->qmr = chip->qmr_val;
++      *drv_data->qdlyr = chip->qdlyr_val;
++      *drv_data->qwr = chip->qwr_val;
++
++      /*
++       * Enable all the interrupts and clear all the flags
++       */
++      *drv_data->qir =  (QIR_SPIFE | QIR_ABRTE | QIR_WCEFE)
++                      | (QIR_WCEFB | QIR_ABRTB | QIR_ABRTL)
++                      | (QIR_SPIF  | QIR_ABRT  | QIR_WCEF);
++#endif
++}
++
++#if defined(SPI_DSPI_EDMA)
++static int edma_tx_handler(int channel, void* dev)
++{
++      if (channel == DSPI_DMA_TX_TCD) {
++              stop_edma_transfer(DSPI_DMA_TX_TCD);
++      }
++      return IRQ_HANDLED;
++}
++
++static int edma_rx_handler(int channel, void* dev)
++{
++      if (channel == DSPI_DMA_RX_TCD) {
++              stop_edma_transfer(DSPI_DMA_RX_TCD);
++      }
++
++      return IRQ_HANDLED;
++}
++#endif
++
++static irqreturn_t qspi_interrupt(int irq, void *dev_id)
++{
++      struct driver_data *drv_data = (struct driver_data *)dev_id;
++      struct spi_message *msg = drv_data->cur_msg;
++#if defined(SPI_DSPI)
++#if !defined(SPI_DSPI_EDMA)
++      u32 irq_status = *drv_data->dspi_sr;
++#endif
++#else
++      u16 irq_status = *drv_data->qir;
++#endif
++
++      /* Clear all flags immediately */
++#if defined(SPI_DSPI)
++      *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF;
++#else
++      *drv_data->qir |= (QIR_SPIF | QIR_ABRT | QIR_WCEF);
++#endif
++
++      if (!drv_data->cur_msg || !drv_data->cur_msg->state) {
++#if !defined(SPI_DSPI_EDMA)
++              /* if eDMA is used it happens some time (at least once)*/
++              printk(KERN_ERR "coldfire-qspi: bad message or transfer "
++              "state in interrupt handler. IRQ status=%x\n", irq_status);
++#endif
++              return IRQ_NONE;
++      }
++
++#if !defined(SPI_DSPI)
++      if (irq_status & QIR_SPIF) {
++#endif
++              /*
++               * Read the data into the buffer and reload and start
++               * queue with new data if not finished.  If finished
++               * then setup the next transfer
++               */
++               read(drv_data);
++
++               if (drv_data->rx == drv_data->rx_end) {
++                      /*
++                       * Finished now - fall through and schedule next
++                       * transfer tasklet
++                       */
++                      if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) {
++                              //*drv_data->qmr &= ~QMR_BITS;
++                              set_16bit_transfer_mode(drv_data);
++                      }
++
++                      msg->state = next_transfer(drv_data);
++                      msg->actual_length += drv_data->len;
++               } else {
++                      /* not finished yet - keep going */
++                      write(drv_data);
++                      return IRQ_HANDLED;
++               }
++#if !defined(SPI_DSPI)
++      } else {
++              if (irq_status & QIR_WCEF)
++                      drv_data->wce_cnt++;
++
++              if (irq_status & QIR_ABRT)
++                      drv_data->abrt_cnt++;
++
++              msg->state = ERROR_STATE;
++      }
++#endif
++
++      tasklet_schedule(&drv_data->pump_transfers);
++
++      return IRQ_HANDLED;
++}
++
++/* caller already set message->status; dma and pio irqs are blocked */
++static void giveback(struct driver_data *drv_data)
++{
++      struct spi_transfer* last_transfer;
++      unsigned long flags;
++      struct spi_message *msg;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++      msg = drv_data->cur_msg;
++      drv_data->cur_msg = NULL;
++      drv_data->cur_transfer = NULL;
++      drv_data->cur_chip = NULL;
++      queue_work(drv_data->workqueue, &drv_data->pump_messages);
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      last_transfer = list_entry(msg->transfers.prev,
++                                      struct spi_transfer,
++                                      transfer_list);
++
++      if (!last_transfer->cs_change)
++              drv_data->cs_control(drv_data->cs, QSPI_CS_DROP);
++
++      msg->state = NULL;
++      if (msg->complete)
++              msg->complete(msg->context);
++}
++
++
++static void pump_transfers(unsigned long data)
++{
++      struct driver_data *drv_data = (struct driver_data *)data;
++      struct spi_message *message = NULL;
++      struct spi_transfer *transfer = NULL;
++      struct spi_transfer *previous = NULL;
++      struct chip_data *chip = NULL;
++      unsigned long flags;
++
++      /* Get current state information */
++      message = drv_data->cur_msg;
++      transfer = drv_data->cur_transfer;
++      chip = drv_data->cur_chip;
++
++      /* Handle for abort */
++      if (message->state == ERROR_STATE) {
++              message->status = -EIO;
++              giveback(drv_data);
++              return;
++      }
++
++      /* Handle end of message */
++      if (message->state == DONE_STATE) {
++              message->status = 0;
++              giveback(drv_data);
++              return;
++      }
++
++      if (message->state == START_STATE) {
++              qspi_setup_chip(drv_data);
++
++              if (drv_data->cs_control) {
++                      //printk( "m s\n" );
++                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
++              }
++      }
++
++      /* Delay if requested at end of transfer*/
++      if (message->state == RUNNING_STATE) {
++              previous = list_entry(transfer->transfer_list.prev,
++                                      struct spi_transfer,
++                                      transfer_list);
++
++              if (drv_data->cs_control && transfer->cs_change)
++                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_DROP);
++
++              if (previous->delay_usecs)
++                      udelay(previous->delay_usecs);
++
++              if (drv_data->cs_control && transfer->cs_change)
++                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
++      }
++
++      drv_data->flags = 0;
++      drv_data->tx = (void *)transfer->tx_buf;
++      drv_data->tx_end = drv_data->tx + transfer->len;
++      drv_data->rx = transfer->rx_buf;
++      drv_data->rx_end = drv_data->rx + transfer->len;
++      drv_data->len = transfer->len;
++      if (!drv_data->rx)
++              drv_data->flags |= TRAN_STATE_RX_VOID;
++      if (!drv_data->tx)
++              drv_data->flags |= TRAN_STATE_TX_VOID;
++      drv_data->cs = message->spi->chip_select;
++      drv_data->cs_change = transfer->cs_change;
++      drv_data->void_write_data = chip->void_write_data;
++
++      message->state = RUNNING_STATE;
++
++      /* Go baby, go */
++      local_irq_save(flags);
++      write(drv_data);
++      local_irq_restore(flags);
++}
++
++
++static void pump_messages(struct work_struct * work)
++{
++      struct driver_data *drv_data;
++      unsigned long flags;
++
++      drv_data = container_of(work,  struct driver_data, pump_messages);
++
++      /* Lock queue and check for queue work */
++      spin_lock_irqsave(&drv_data->lock, flags);
++      if (list_empty(&drv_data->queue) || drv_data->run == QUEUE_STOPPED) {
++              drv_data->busy = 0;
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return;
++      }
++
++      /* Make sure we are not already running a message */
++      if (drv_data->cur_msg) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return;
++      }
++
++      /* Extract head of queue */
++      drv_data->cur_msg = list_entry(drv_data->queue.next,
++                                      struct spi_message, queue);
++      list_del_init(&drv_data->cur_msg->queue);
++
++      /* Initial message state*/
++      drv_data->cur_msg->state = START_STATE;
++      drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
++                                              struct spi_transfer,
++                                              transfer_list);
++
++      /* Setup the SPI Registers using the per chip configuration */
++      drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
++
++      /* Mark as busy and launch transfers */
++      tasklet_schedule(&drv_data->pump_transfers);
++
++      drv_data->busy = 1;
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++}
++
++/****************************************************************************/
++
++/*
++ * SPI master implementation
++ */
++
++static int transfer(struct spi_device *spi, struct spi_message *msg)
++{
++      struct driver_data *drv_data = spi_master_get_devdata(spi->master);
++      unsigned long flags;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      if (drv_data->run == QUEUE_STOPPED) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return -ESHUTDOWN;
++      }
++
++      msg->actual_length = 0;
++      msg->status = -EINPROGRESS;
++      msg->state = START_STATE;
++
++      list_add_tail(&msg->queue, &drv_data->queue);
++
++      if (drv_data->run == QUEUE_RUNNING && !drv_data->busy)
++              queue_work(drv_data->workqueue, &drv_data->pump_messages);
++
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      return 0;
++}
++
++
++static int setup(struct spi_device *spi)
++{
++      struct coldfire_spi_chip *chip_info;
++      struct chip_data *chip;
++#ifndef SPI_DSPI
++      u32 baud_divisor = 255;
++#endif
++
++      chip_info = (struct coldfire_spi_chip *)spi->controller_data;
++
++      /* Only alloc on first setup */
++      chip = spi_get_ctldata(spi);
++      if (chip == NULL) {
++              chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL);
++              if (!chip)
++                      return -ENOMEM;
++              spi->mode = chip_info->mode;
++              spi->bits_per_word = chip_info->bits_per_word;
++      }
++
++#if defined(SPI_DSPI)
++      chip->mcr.master = 1;
++      chip->mcr.cont_scke = 0;
++      chip->mcr.dconf = 0;
++      chip->mcr.frz = 0;
++      chip->mcr.mtfe = 1;
++      chip->mcr.pcsse = 0;
++      chip->mcr.rooe = 0;
++      chip->mcr.pcsis = 0xFF;
++      chip->mcr.reserved15 = 0;
++      chip->mcr.mdis = 0;
++      chip->mcr.dis_tx = 0;
++      chip->mcr.dis_rxf = 0;
++      chip->mcr.clr_tx = 1;
++      chip->mcr.clr_rxf = 1;
++      chip->mcr.smpl_pt = 0;
++      chip->mcr.reserved71 = 0;
++      chip->mcr.halt = 0;
++
++      if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
++              chip->ctar.fmsz = spi->bits_per_word-1;
++      } else {
++              printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
++              kfree(chip);
++              return -ENODEV;
++      }
++
++      if (spi->mode & SPI_CPHA)
++              chip->ctar.cpha = 1;
++      else
++              chip->ctar.cpha = 0;
++
++      if (spi->mode & SPI_CPOL)
++              chip->ctar.cpol = 1;
++      else
++              chip->ctar.cpol = 0;
++
++      if (spi->mode & SPI_LSB_FIRST)
++              chip->ctar.lsbfe = 1;
++      else
++              chip->ctar.lsbfe = 0;
++
++      /* This values are default for audio device */
++      chip->ctar.dbr = 0;
++      chip->ctar.pbr = 2;
++      chip->ctar.br = 8;
++
++      /* This values are default for audio device */
++      chip->ctar.pcssck = 1;
++      chip->ctar.pasc = 1;
++      chip->ctar.pdt = 1;
++      chip->ctar.cssck = 0;
++      chip->ctar.asc = 1;
++      chip->ctar.dt = 1;
++
++      chip->void_write_data = chip_info->void_write_data;
++
++#else
++
++      chip->qwr.csiv = 1;    // Chip selects are active low
++      chip->qmr.master = 1;  // Must set to master mode
++      chip->qmr.dohie = 1;   // Data output high impediance enabled
++      chip->void_write_data = chip_info->void_write_data;
++
++      chip->qdlyr.qcd = chip_info->del_cs_to_clk;
++      chip->qdlyr.dtl = chip_info->del_after_trans;
++
++      if (spi->max_speed_hz != 0)
++              baud_divisor = (MCF_CLK/(2*spi->max_speed_hz));
++
++      if (baud_divisor < 2)
++              baud_divisor = 2;
++
++      if (baud_divisor > 255)
++              baud_divisor = 255;
++
++      chip->qmr.baud = baud_divisor;
++
++      //printk( "QSPI: spi->max_speed_hz %d\n", spi->max_speed_hz );
++      //printk( "QSPI: Baud set to %d\n", chip->qmr.baud );
++
++      if (spi->mode & SPI_CPHA)
++              chip->qmr.cpha = 1;
++
++      if (spi->mode & SPI_CPOL)
++              chip->qmr.cpol = 1;
++
++      if (spi->bits_per_word == 16) {
++              chip->qmr.bits = 0;
++      } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) {
++              chip->qmr.bits = spi->bits_per_word;
++      } else {
++              printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
++              kfree(chip);
++              return -ENODEV;
++      }
++
++#endif
++
++      spi_set_ctldata(spi, chip);
++
++      return 0;
++}
++
++static int init_queue(struct driver_data *drv_data)
++{
++      INIT_LIST_HEAD(&drv_data->queue);
++      spin_lock_init(&drv_data->lock);
++
++      drv_data->run = QUEUE_STOPPED;
++      drv_data->busy = 0;
++
++      tasklet_init(&drv_data->pump_transfers,
++                      pump_transfers, (unsigned long)drv_data);
++
++      INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/);
++
++      drv_data->workqueue = create_singlethread_workqueue(
++                                      drv_data->master->cdev.dev->bus_id);
++      if (drv_data->workqueue == NULL)
++              return -EBUSY;
++
++      return 0;
++}
++
++static int start_queue(struct driver_data *drv_data)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      if (drv_data->run == QUEUE_RUNNING || drv_data->busy) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return -EBUSY;
++      }
++
++      drv_data->run = QUEUE_RUNNING;
++      drv_data->cur_msg = NULL;
++      drv_data->cur_transfer = NULL;
++      drv_data->cur_chip = NULL;
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      queue_work(drv_data->workqueue, &drv_data->pump_messages);
++
++      return 0;
++}
++
++static int stop_queue(struct driver_data *drv_data)
++{
++      unsigned long flags;
++      unsigned limit = 500;
++      int status = 0;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      /* This is a bit lame, but is optimized for the common execution path.
++       * A wait_queue on the drv_data->busy could be used, but then the common
++       * execution path (pump_messages) would be required to call wake_up or
++       * friends on every SPI message. Do this instead */
++      drv_data->run = QUEUE_STOPPED;
++      while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              msleep(10);
++              spin_lock_irqsave(&drv_data->lock, flags);
++      }
++
++      if (!list_empty(&drv_data->queue) || drv_data->busy)
++              status = -EBUSY;
++
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      return status;
++}
++
++static int destroy_queue(struct driver_data *drv_data)
++{
++      int status;
++
++      status = stop_queue(drv_data);
++      if (status != 0)
++              return status;
++
++      destroy_workqueue(drv_data->workqueue);
++
++      return 0;
++}
++
++
++static void cleanup(const struct spi_device *spi)
++{
++      struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
++
++      dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n",
++              spi->master->bus_num, spi->chip_select);
++
++      kfree(chip);
++}
++
++
++/****************************************************************************/
++
++/*
++ * Generic Device driver routines and interface implementation
++ */
++
++static int coldfire_spi_probe(struct platform_device *pdev)
++{
++      struct device *dev = &pdev->dev;
++      struct coldfire_spi_master *platform_info;
++      struct spi_master *master;
++      struct driver_data *drv_data = 0;
++      struct resource *memory_resource;
++      int irq;
++      int status = 0;
++      int i;
++
++#if defined(SPI_DSPI_EDMA)
++      init_edma();
++#endif
++
++      platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
++
++      master = spi_alloc_master(dev, sizeof(struct driver_data));
++      if (!master)
++              return -ENOMEM;
++
++      drv_data = class_get_devdata(&master->cdev);
++      drv_data->master = master;
++
++      INIT_LIST_HEAD(&drv_data->queue);
++      spin_lock_init(&drv_data->lock);
++
++      master->bus_num = platform_info->bus_num;
++      master->num_chipselect = platform_info->num_chipselect;
++      master->cleanup = cleanup;
++      master->setup = setup;
++      master->transfer = transfer;
++
++      drv_data->cs_control = platform_info->cs_control;
++      if (drv_data->cs_control)
++              for(i = 0; i < master->num_chipselect; i++)
++                      drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
++
++      /* Setup register addresses */
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-module");
++      if (!memory_resource) {
++              dev_dbg(dev, "can not find platform module memory\n");
++              goto out_error_master_alloc;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++      drv_data->edma_tx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA);
++      if (!drv_data->edma_tx_buf) {
++              dev_dbg(dev, "cannot allocate eDMA TX memory\n");
++              goto out_error_master_alloc;
++      }
++      drv_data->edma_rx_buf = kmalloc(EDMA_BUFSIZE_KMALLOC, GFP_DMA);
++      if (!drv_data->edma_rx_buf) {
++              kfree(drv_data->edma_tx_buf);
++              dev_dbg(dev, "cannot allocate eDMA RX memory\n");
++              goto out_error_master_alloc;
++      }
++#endif        
++      
++#if defined(SPI_DSPI)
++
++      drv_data->mcr           = (void *)(memory_resource->start + 0x00000000);
++      drv_data->ctar          = (void *)(memory_resource->start + 0x0000000C);
++      drv_data->dspi_sr       = (void *)(memory_resource->start + 0x0000002C);
++      drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030);
++      drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034);
++      drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038);
++
++#else
++
++      drv_data->qmr   = (void *)(memory_resource->start + 0x00000000);
++      drv_data->qdlyr = (void *)(memory_resource->start + 0x00000004);
++      drv_data->qwr   = (void *)(memory_resource->start + 0x00000008);
++      drv_data->qir   = (void *)(memory_resource->start + 0x0000000c);
++      drv_data->qar   = (void *)(memory_resource->start + 0x00000010);
++      drv_data->qdr   = (void *)(memory_resource->start + 0x00000014);
++      drv_data->qcr   = (void *)(memory_resource->start + 0x00000014);
++
++#endif
++
++      /* Setup register addresses */
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-par");
++      if (!memory_resource) {
++              dev_dbg(dev, "can not find platform par memory\n");
++              goto out_error_master_alloc;
++      }
++
++      drv_data->par = (void *)memory_resource->start;
++
++      /* Setup register addresses */
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-level");
++      if (!memory_resource) {
++              dev_dbg(dev, "can not find platform par memory\n");
++              goto out_error_master_alloc;
++      }
++
++      drv_data->int_icr = (void *)memory_resource->start;
++
++      /* Setup register addresses */
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-mask");
++      if (!memory_resource) {
++              dev_dbg(dev, "can not find platform par memory\n");
++              goto out_error_master_alloc;
++      }
++
++      drv_data->int_mr = (void *)memory_resource->start;
++
++      irq = platform_info->irq_vector;
++
++      status = request_irq(platform_info->irq_vector, qspi_interrupt, SA_INTERRUPT, dev->bus_id, drv_data);
++      if (status < 0) {
++              dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
++              goto out_error_master_alloc;
++      }
++
++      /* Now that we have all the addresses etc.  Let's set it up */
++      // TODO:
++      //*drv_data->par = platform_info->par_val;
++
++      MCF_GPIO_PAR_DSPI = 0
++              | MCF_GPIO_PAR_DSPI_PCS5_PCS5
++              | MCF_GPIO_PAR_DSPI_PCS2_PCS2
++              | MCF_GPIO_PAR_DSPI_PCS1_PCS1
++              | MCF_GPIO_PAR_DSPI_PCS0_PCS0
++              | MCF_GPIO_PAR_DSPI_SIN_SIN
++              | MCF_GPIO_PAR_DSPI_SOUT_SOUT
++              | MCF_GPIO_PAR_DSPI_SCK_SCK;
++
++      *drv_data->int_icr = platform_info->irq_lp;
++      *drv_data->int_mr &= ~platform_info->irq_mask;
++
++#ifdef SPI_DSPI
++      drv_data->dspi_ctas = 0; // TODO: change later
++#endif
++
++      /* Initial and start queue */
++      status = init_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "problem initializing queue\n");
++              goto out_error_irq_alloc;
++      }
++      status = start_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "problem starting queue\n");
++              goto out_error_irq_alloc;
++      }
++
++      /* Register with the SPI framework */
++      platform_set_drvdata(pdev, drv_data);
++      status = spi_register_master(master);
++      if (status != 0) {
++              dev_err(&pdev->dev, "problem registering spi master\n");
++              status = -EINVAL;
++                goto out_error_queue_alloc;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++      if (request_edma_channel(DSPI_DMA_TX_TCD,
++                                                      edma_tx_handler,
++                                                      NULL,
++                                                      pdev,
++                                                      NULL, /* spinlock */
++                                                      DRIVER_NAME
++                                                      )!=0)
++      {
++              dev_err(&pdev->dev, "problem requesting edma transmit channel\n");
++              status = -EINVAL;
++        goto out_error_queue_alloc;
++      }
++
++      if (request_edma_channel(DSPI_DMA_RX_TCD,
++                                                      edma_rx_handler,
++                                                      NULL,
++                                                      pdev,
++                                                      NULL, /* spinlock */
++                                                      DRIVER_NAME
++                                                      )!=0)
++      {
++              dev_err(&pdev->dev, "problem requesting edma receive channel\n");
++              status = -EINVAL;
++        goto out_edma_transmit;
++      }
++#endif
++
++      printk( "SPI: Coldfire master initialized\n" );
++      //dev_info(&pdev->dev, "driver initialized\n");
++      return status;
++
++#if defined(SPI_DSPI_EDMA)
++out_edma_transmit:
++      free_edma_channel(DSPI_DMA_TX_TCD, pdev);
++#endif
++
++out_error_queue_alloc:
++      destroy_queue(drv_data);
++
++out_error_irq_alloc:
++      free_irq(irq, drv_data);
++
++out_error_master_alloc:
++      spi_master_put(master);
++      return status;
++
++}
++
++static int coldfire_spi_remove(struct platform_device *pdev)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int irq;
++      int status = 0;
++
++      if (!drv_data)
++              return 0;
++
++#if defined(SPI_DSPI_EDMA)
++      free_edma_channel(DSPI_DMA_TX_TCD, pdev);
++      free_edma_channel(DSPI_DMA_RX_TCD, pdev);
++#endif        
++
++      /* Remove the queue */
++      status = destroy_queue(drv_data);
++      if (status != 0)
++              return status;
++
++      /* Disable the SSP at the peripheral and SOC level */
++      /*write_SSCR0(0, drv_data->ioaddr);
++      pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
++
++      /* Release DMA */
++      /*if (drv_data->master_info->enable_dma) {
++              if (drv_data->ioaddr == SSP1_VIRT) {
++                      DRCMRRXSSDR = 0;
++                      DRCMRTXSSDR = 0;
++              } else if (drv_data->ioaddr == SSP2_VIRT) {
++                      DRCMRRXSS2DR = 0;
++                      DRCMRTXSS2DR = 0;
++              } else if (drv_data->ioaddr == SSP3_VIRT) {
++                      DRCMRRXSS3DR = 0;
++                      DRCMRTXSS3DR = 0;
++              }
++              pxa_free_dma(drv_data->tx_channel);
++              pxa_free_dma(drv_data->rx_channel);
++      }*/
++
++      /* Release IRQ */
++      irq = platform_get_irq(pdev, 0);
++      if (irq >= 0)
++              free_irq(irq, drv_data);
++
++      /* Disconnect from the SPI framework */
++      spi_unregister_master(drv_data->master);
++
++      /* Prevent double remove */
++      platform_set_drvdata(pdev, NULL);
++
++      return 0;
++}
++
++static void coldfire_spi_shutdown(struct platform_device *pdev)
++{
++      int status = 0;
++
++      if ((status = coldfire_spi_remove(pdev)) != 0)
++              dev_err(&pdev->dev, "shutdown failed with %d\n", status);
++}
++
++
++#ifdef CONFIG_PM
++static int suspend_devices(struct device *dev, void *pm_message)
++{
++      pm_message_t *state = pm_message;
++
++      if (dev->power.power_state.event != state->event) {
++              dev_warn(dev, "pm state does not match request\n");
++              return -1;
++      }
++
++      return 0;
++}
++
++static int coldfire_spi_suspend(struct platform_device *pdev, pm_message_t state)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int status = 0;
++
++      /* Check all childern for current power state */
++      if (device_for_each_child(&pdev->dev, &state, suspend_devices) != 0) {
++              dev_warn(&pdev->dev, "suspend aborted\n");
++              return -1;
++      }
++
++      status = stop_queue(drv_data);
++      if (status != 0)
++              return status;
++      /*write_SSCR0(0, drv_data->ioaddr);
++      pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
++
++      return 0;
++}
++
++static int coldfire_spi_resume(struct platform_device *pdev)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int status = 0;
++
++      /* Enable the SSP clock */
++      /*pxa_set_cken(drv_data->master_info->clock_enable, 1);*/
++
++      /* Start the queue running */
++      status = start_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
++              return status;
++      }
++
++      return 0;
++}
++#else
++#define coldfire_spi_suspend NULL
++#define coldfire_spi_resume NULL
++#endif /* CONFIG_PM */
++
++static struct platform_driver driver = {
++      .driver = {
++              .name = "spi_coldfire",
++              .bus = &platform_bus_type,
++              .owner = THIS_MODULE,
++      },
++      .probe = coldfire_spi_probe,
++      .remove = __devexit_p(coldfire_spi_remove),
++      .shutdown = coldfire_spi_shutdown,
++      .suspend = coldfire_spi_suspend,
++      .resume = coldfire_spi_resume,
++};
++
++static int __init coldfire_spi_init(void)
++{
++      platform_driver_register(&driver);
++
++      return 0;
++}
++module_init(coldfire_spi_init);
++
++static void __exit coldfire_spi_exit(void)
++{
++      platform_driver_unregister(&driver);
++}
++module_exit(coldfire_spi_exit);
+--- /dev/null
++++ b/drivers/spi/ssi_audio.c
+@@ -0,0 +1,906 @@
++/*
++ * MCF5445x audio driver.
++ *
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ * Copyright Freescale Semiconductor, Inc. 2006
++ *
++ * 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/device.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/spi/spi.h>
++#include <linux/fs.h>
++#include <linux/kernel.h>
++#include <linux/major.h>
++#include <asm/mcfsim.h>
++#include <linux/interrupt.h>
++#include <linux/soundcard.h>
++#include <asm/uaccess.h>
++#include <asm/virtconvert.h>
++
++#include <asm/coldfire.h>
++#include <asm/coldfire_edma.h>
++#include <asm/mcf5445x_ssi.h>
++#include <asm/mcf5445x_ccm.h>
++#include <asm/mcf5445x_gpio.h>
++
++#define SOUND_DEVICE_NAME "sound"
++#define DRIVER_NAME "ssi_audio"
++
++
++/* #define AUDIO_DEBUG */
++
++#ifdef CONFIG_MMU
++#define USE_MMU
++#endif
++
++#define MAX_SPEED_HZ 12000000
++
++#define M5445x_AUDIO_IRQ_SOURCE 49
++#define M5445x_AUDIO_IRQ_VECTOR (128+M5445x_AUDIO_IRQ_SOURCE)
++#define M5445x_AUDIO_IRQ_LEVEL        5
++
++/* TLV320DAC23 audio chip registers */
++
++#define CODEC_LEFT_IN_REG                     (0x00)
++#define CODEC_RIGHT_IN_REG                    (0x01)
++#define CODEC_LEFT_HP_VOL_REG         (0x02)
++#define CODEC_RIGHT_HP_VOL_REG                (0x03)
++#define CODEC_ANALOG_APATH_REG                (0x04)
++#define CODEC_DIGITAL_APATH_REG               (0x05)
++#define CODEC_POWER_DOWN_REG          (0x06)
++#define CODEC_DIGITAL_IF_FMT_REG      (0x07)
++#define CODEC_SAMPLE_RATE_REG         (0x08)
++#define CODEC_DIGITAL_IF_ACT_REG      (0x09)
++#define CODEC_RESET_REG                               (0x0f)
++
++#define CODEC_SAMPLE_8KHZ             (0x0C)
++#define CODEC_SAMPLE_16KHZ            (0x58)
++#define CODEC_SAMPLE_22KHZ            (0x62)
++#define CODEC_SAMPLE_32KHZ            (0x18)
++#define CODEC_SAMPLE_44KHZ            (0x22)
++#define CODEC_SAMPLE_48KHZ            (0x00)
++
++/* Audio buffer data size */
++#define       BUFSIZE         (64*1024)
++/* DMA transfer size */
++#define DMASIZE               (16*1024)
++
++/* transmit eDMA channel for SSI channel 0 */
++#define DMA_TCD       10
++/* transmit eDMA channel for SSI channel 1 */
++#define DMA_TCD2      11
++
++struct ssi_audio {
++      struct spi_device       *spi;
++      u32 speed;
++      u32 stereo;
++      u32 bits;
++      u32 format;
++      u8  isopen;
++      u8  dmaing;
++      u8  ssi_enabled;
++      u8  channel;
++      spinlock_t lock;
++      u8* audio_buf;
++};
++
++static struct ssi_audio* audio_device = NULL;
++volatile u32 audio_start;
++volatile u32 audio_count;
++volatile u32 audio_append;
++volatile u32 audio_appstart;
++volatile u32 audio_txbusy;
++
++struct ssi_audio_format {
++      unsigned int    format;
++      unsigned int    bits;
++} ssi_audio_formattable[] = {
++      { AFMT_MU_LAW,          8 },
++      { AFMT_A_LAW,           8 },
++      { AFMT_IMA_ADPCM,       8 },
++      { AFMT_U8,              8 },
++      { AFMT_S16_LE,          16 },
++      { AFMT_S16_BE,          16 },
++      { AFMT_S8,              8 },
++      { AFMT_U16_LE,          16 },
++      { AFMT_U16_BE,          16 },
++};
++
++#define       FORMATSIZE      (sizeof(ssi_audio_formattable) / sizeof(struct ssi_audio_format))
++
++static void ssi_audio_setsamplesize(int val)
++{
++      int     i;
++
++      if (audio_device == NULL) return;
++
++      for (i = 0; (i < FORMATSIZE); i++) {
++              if (ssi_audio_formattable[i].format == val) {
++                      audio_device->format = ssi_audio_formattable[i].format;
++                      audio_device->bits = ssi_audio_formattable[i].bits;
++                      break;
++              }
++      }
++
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", audio_device->format, audio_device->bits);
++#endif
++}
++
++static void ssi_audio_txdrain(void)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_txdrain()\n");
++#endif
++
++      if (audio_device == NULL) return;
++
++      while (!signal_pending(current)) {
++              if (audio_txbusy == 0)
++                      break;
++              current->state = TASK_INTERRUPTIBLE;
++              schedule_timeout(1);
++      }
++}
++
++#ifdef CONFIG_SSIAUDIO_USE_EDMA
++/*
++ *    Configure and start DMA engine.
++ */
++void __inline__ ssi_audio_dmarun(void)
++{
++      set_edma_params(DMA_TCD,
++#ifdef USE_MMU
++                                      virt_to_phys(&(audio_device->audio_buf[audio_start])),
++#else
++                                      (u32)&(audio_device->audio_buf[audio_start]),
++#endif
++                                      (u32)&MCF_SSI_TX0,
++                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                                      8,
++                                      4,
++                                      0,
++                                      audio_count/8,
++                                      audio_count/8,
++                                      0,
++                                      0,
++                                      0, // major_int
++                                      0  // disable_req
++                                      );
++
++      set_edma_params(DMA_TCD2,
++#ifdef USE_MMU
++                                      virt_to_phys(&(audio_device->audio_buf[audio_start+4])),
++#else
++                                      (u32)&(audio_device->audio_buf[audio_start+4]),
++#endif
++                                      (u32)&MCF_SSI_TX1,
++                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                                      8,
++                                      4,
++                                      0,
++                                      audio_count/8,
++                                      audio_count/8,
++                                      0,
++                                      0,
++                                      1, // major_int
++                    0  // disable_req
++                                      );
++
++      audio_device->dmaing = 1;
++      audio_txbusy = 1;
++
++      start_edma_transfer(DMA_TCD);
++      start_edma_transfer(DMA_TCD2);
++#if 0
++      MCF_EDMA_ERQ |= (1<<DMA_TCD) | (1<<DMA_TCD2);
++      MCF_EDMA_SSRT = DMA_TCD;
++      MCF_EDMA_SSRT = DMA_TCD2;
++#endif
++
++}
++
++/*
++ *    Start DMA'ing a new buffer of data if any available.
++ */
++static void ssi_audio_dmabuf(void)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", audio_append, audio_appstart);
++#endif
++
++      /* If already running then nothing to do... */
++      if (audio_device->dmaing)
++              return;
++
++      /* Set DMA buffer size */
++      audio_count = (audio_append >= audio_appstart) ?
++              (audio_append - audio_appstart) :
++              (BUFSIZE - audio_appstart);
++      if (audio_count > DMASIZE)
++              audio_count = DMASIZE;
++
++      /* Adjust pointers and counters accordingly */
++      audio_appstart += audio_count;
++      if (audio_appstart >= BUFSIZE)
++              audio_appstart = 0;
++
++      if (audio_count > 0)
++              ssi_audio_dmarun();
++      else {
++              audio_txbusy = 0;
++#ifdef AUDIO_DEBUG
++              printk(DRIVER_NAME ":DMA buffer is empty!\n");
++#endif
++      }
++}
++
++void __inline__ stop_dma(void) {
++      stop_edma_transfer(DMA_TCD);
++      stop_edma_transfer(DMA_TCD2);
++}
++
++static int ssi_audio_dma_handler_empty(int channel, void *dev_id)
++{
++      return IRQ_HANDLED;
++}
++
++static int ssi_audio_dma_handler(int channel, void *dev_id)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_dma_handler(channel=%d)\n", channel);
++#endif
++
++      /* Clear DMA interrupt */
++      stop_dma();
++
++      audio_device->dmaing = 0;
++
++      /* Update data pointers and counts */
++      audio_start += audio_count;
++      if (audio_start >= BUFSIZE)
++              audio_start = 0;
++      audio_count = 0;
++
++      /* Start new DMA buffer if we can */
++      ssi_audio_dmabuf();
++
++      return IRQ_HANDLED;
++}
++
++static void init_dma(void)
++{
++      /* SSI DMA Signals mapped to DMA request */
++      MCF_CCM_MISCCR &= ~MCF_CCM_MISCCR_TIMDMA;
++      init_edma();
++}
++
++#endif        /* CONFIG_SSIAUDIO_USE_EDMA */
++
++
++/* Write CODEC register using SPI
++ *   address - CODEC register address
++ *   data - data to be written into register
++ */
++static int codec_write(u8 addr, u16 data)
++{
++      u16 spi_word;
++
++      if (audio_device==NULL || audio_device->spi==NULL)
++              return -ENODEV;
++
++      spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF);
++      return spi_write(audio_device->spi, (const u8*)&spi_word, sizeof(spi_word));
++}
++
++static inline void enable_ssi(void)
++{
++      if (audio_device==NULL || audio_device->ssi_enabled) return;
++      audio_device->ssi_enabled = 1;
++      MCF_SSI_CR |= MCF_SSI_CR_SSI_EN;  /* enable SSI module */
++      MCF_SSI_CR |= MCF_SSI_CR_TE;      /* enable tranmitter */
++}
++
++static inline void disable_ssi(void)
++{
++      if (audio_device==NULL || audio_device->ssi_enabled==0) return;
++      MCF_SSI_CR &= ~MCF_SSI_CR_TE;           /* disable transmitter */
++      MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN;       /* disable SSI module  */
++      audio_device->ssi_enabled = 0;
++}
++
++/* Audio CODEC initialization */
++/* TODO: also the SSI frequency/dividers must be adjusted */
++static void adjust_codec_speed(void) {
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed);
++#endif
++
++      if (audio_device->speed == 8000) {
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ);
++      } else if (audio_device->speed == 16000) {
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ);
++      } else if (audio_device->speed == 22000) {
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ);
++      } else if (audio_device->speed == 44000 || audio_device->speed == 44100) {
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
++      } else if (audio_device->speed == 48000) {
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ);
++      } else {
++              /* default 44KHz */
++              codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
++      }
++}
++
++static void codec_reset(void)
++{
++      codec_write(CODEC_RESET_REG, 0); /* reset the audio chip */
++      udelay(1500); /* wait for reset */
++}
++
++static void init_audio_codec(void)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":init_audio_codec()\n");
++#endif
++      codec_reset();
++
++      codec_write(CODEC_LEFT_IN_REG, 0x017);
++      codec_write(CODEC_RIGHT_IN_REG, 0x017);
++      codec_write(CODEC_POWER_DOWN_REG, 0x000); /* Turn off line input */
++      codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x00A); /* I2S slave mode */
++      /* codec_write(CODEC_DIGITAL_IF_FMT_REG, 0x042); // I2S master mode */
++      codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */
++
++      /* set sample rate */
++    adjust_codec_speed();
++
++      codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */
++      codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */
++      codec_write(CODEC_DIGITAL_IF_ACT_REG, 1); /* Activate digital interface */
++      codec_write(CODEC_ANALOG_APATH_REG, 0x0F2);
++}
++
++
++static void chip_init(void)
++{
++#ifdef CONFIG_SSIAUDIO_USE_EDMA
++      init_dma();
++#endif
++
++      /* Enable the SSI pins */
++      MCF_GPIO_PAR_SSI = ( 0
++                                                      | MCF_GPIO_PAR_SSI_MCLK
++                                                      | MCF_GPIO_PAR_SSI_STXD(3)
++                                                      | MCF_GPIO_PAR_SSI_SRXD(3)
++                                                      | MCF_GPIO_PAR_SSI_FS(3)
++                                                      | MCF_GPIO_PAR_SSI_BCLK(3) );
++
++}
++
++static void init_ssi(void)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":init_ssi()\n");
++#endif
++
++      /* Dividers are for MCF54445 on 266Mhz, the output is 44.1Khz*/
++      /* Enable SSI clock in CCM */
++      MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
++
++      /* Issue a SSI reset */
++      MCF_SSI_CR &= ~MCF_SSI_CR_SSI_EN;  /* disable SSI module */
++
++      /* SSI module uses internal CPU clock */
++      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSISRC;
++
++      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUE;
++      MCF_CCM_MISCCR |= MCF_CCM_MISCCR_SSIPUS_UP;
++
++      MCF_SSI_CR = 0
++                      | MCF_SSI_CR_CIS
++                      | MCF_SSI_CR_TCH    /* Enable two channel mode */
++                      | MCF_SSI_CR_MCE    /* Set clock out on SSI_MCLK pin */
++                      | MCF_SSI_CR_I2S_MASTER    /* Set I2S master mode */
++                      | MCF_SSI_CR_SYN      /* Enable synchronous mode */
++                      | MCF_SSI_CR_NET
++                      ;
++
++      MCF_SSI_TCR = 0
++                      | MCF_SSI_TCR_TXDIR  /* internally generated bit clock */
++                      | MCF_SSI_TCR_TFDIR  /* internally generated frame sync */
++                      | MCF_SSI_TCR_TSCKP  /* Clock data on falling edge of bit clock */
++                      | MCF_SSI_TCR_TFSI   /* Frame sync active low */
++                      | MCF_SSI_TCR_TEFS   /* TX frame sync 1 bit before data */
++                      | MCF_SSI_TCR_TFEN0  /* TX FIFO 0 enabled */
++                      | MCF_SSI_TCR_TFEN1  /* TX FIFO 1 enabled */
++                      | MCF_SSI_TCR_TXBIT0
++                      ;
++
++      MCF_SSI_CCR = MCF_SSI_CCR_WL(7)  /* 16 bit word length */
++                      | MCF_SSI_CCR_DC(1)      /* Frame rate divider */
++                      | MCF_SSI_CCR_PM(0)
++                      | MCF_SSI_CCR_DIV2
++                      ;
++
++      MCF_SSI_FCSR = 0
++                      | MCF_SSI_FCSR_TFWM0(0)
++                      | MCF_SSI_FCSR_TFWM1(0)
++                      ;
++
++      MCF_SSI_IER =   0 // interrupts
++#ifndef CONFIG_SSIAUDIO_USE_EDMA
++                              | MCF_SSI_IER_TIE   /* transmit interrupts */
++                              | MCF_SSI_IER_TFE0  /* transmit FIFO 0 empty */
++                              | MCF_SSI_IER_TFE1  /* transmit FIFO 1 empty */
++#else
++                              | MCF_SSI_IER_TDMAE /* DMA request enabled */
++                              | MCF_SSI_IER_TFE0  /* transmit FIFO 0 empty */
++                              | MCF_SSI_IER_TFE1  /* transmit FIFO 1 empty */
++#endif
++                              ;
++
++#ifndef CONFIG_SSIAUDIO_USE_EDMA
++      /* enable IRQ:  SSI interrupt */
++      MCF_INTC1_ICR(M5445x_AUDIO_IRQ_SOURCE) = M5445x_AUDIO_IRQ_LEVEL;
++      MCF_INTC1_CIMR = M5445x_AUDIO_IRQ_SOURCE;
++#endif
++}
++
++#ifndef CONFIG_SSIAUDIO_USE_EDMA
++/* interrupt for SSI */
++static int ssi_audio_isr(int irq, void *dev_id)
++{
++      unsigned long   *bp;
++
++      if (audio_txbusy==0) {
++              return IRQ_HANDLED;
++      }
++
++      spin_lock(&(audio_device->lock));
++
++      if (audio_start == audio_append) {
++              disable_ssi();
++              audio_txbusy = 0;
++      } else {
++              if (MCF_SSI_ISR & (MCF_SSI_ISR_TFE0|MCF_SSI_ISR_TFE1)) {
++                      bp = (unsigned long *) &audio_device->audio_buf[audio_start];
++                      if (audio_device->channel) {
++                              MCF_SSI_TX1 = *bp;
++                              audio_device->channel = 0;
++                      } else {
++                              MCF_SSI_TX0 = *bp;
++                              audio_device->channel = 1;
++                      }
++                      audio_start += 4;
++                      if (audio_start >= BUFSIZE)
++                              audio_start = 0;
++              }
++      }
++
++      spin_unlock(&(audio_device->lock));
++
++      return IRQ_HANDLED;
++}
++#endif
++
++/* Set initial driver playback defaults. */
++static void init_driver_variables(void)
++{
++      audio_device->speed = 44100;
++      audio_device->format = AFMT_S16_LE;
++      audio_device->bits = 16;
++      audio_device->stereo = 1;
++      audio_device->ssi_enabled = 0;
++
++      audio_start = 0;
++      audio_count = 0;
++      audio_append = 0;
++      audio_appstart = 0;
++      audio_txbusy = 0;
++      audio_device->dmaing = 0;
++}
++
++/* open audio device */
++static int ssi_audio_open(struct inode *inode, struct file *filp)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_open()\n");
++#endif
++
++      if (audio_device==NULL) return (-ENODEV);
++
++      if (audio_device->isopen)
++              return(-EBUSY);
++
++      spin_lock(&(audio_device->lock));
++
++      audio_device->isopen = 1;
++
++      init_driver_variables();
++      init_ssi();
++      init_audio_codec();
++
++      spin_unlock(&(audio_device->lock));
++
++      udelay(100);
++
++      return 0;
++}
++
++/* close audio device */
++static int ssi_audio_close(struct inode *inode, struct file *filp)
++{
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_close()\n");
++#endif
++
++      if (audio_device==NULL) return (-ENODEV);
++
++      ssi_audio_txdrain();
++
++      spin_lock(&(audio_device->lock));
++
++#ifdef CONFIG_SSIAUDIO_USE_EDMA
++      stop_dma();
++#endif
++      disable_ssi();
++      codec_reset();
++      init_driver_variables();
++      audio_device->isopen = 0;
++
++      spin_unlock(&(audio_device->lock));
++      return 0;
++}
++
++/* write to audio device */
++static ssize_t ssi_audio_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
++{
++      unsigned long   *dp, *buflp;
++      unsigned short  *bufwp;
++      unsigned char   *bufbp;
++      unsigned int    slen, bufcnt, i, s, e;
++
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", (int) buf, count);
++#endif
++
++      if (audio_device==NULL) return (-ENODEV);
++
++      if (count <= 0)
++              return 0;
++
++      spin_lock(&(audio_device->lock));
++
++      buflp = (unsigned long *) buf;
++      bufwp = (unsigned short *) buf;
++      bufbp = (unsigned char *) buf;
++
++      bufcnt = count & ~0x3;
++
++      bufcnt <<= 1;
++      if (audio_device->stereo == 0)
++              bufcnt <<= 1;
++      if (audio_device->bits == 8)
++              bufcnt <<= 1;
++
++tryagain:
++      /*
++       *      Get a snapshot of buffer, so we can figure out how
++       *      much data we can fit in...
++       */
++      s = audio_start;
++      e = audio_append;
++      dp = (unsigned long *) &(audio_device->audio_buf[e]);
++
++      slen = ((s > e) ? (s - e) : (BUFSIZE - (e - s))) - 4;
++      if (slen > bufcnt)
++              slen = bufcnt;
++      if ((BUFSIZE - e) < slen)
++              slen = BUFSIZE - e;
++
++      if (slen == 0) {
++              if (signal_pending(current))
++                      return(-ERESTARTSYS);
++              set_current_state(TASK_INTERRUPTIBLE);
++              schedule_timeout(1);
++              goto tryagain;
++      }
++
++      /* For DMA we need to have data as 32 bit
++         values (since SSI TX register is 32 bit).
++         So, the incomming 16 bit data must be put to buffer as 32 bit values.
++         Also, the endianess is converted if needed
++      */
++      if (audio_device->stereo) {
++              if (audio_device->bits == 16) {
++                      if (audio_device->format==AFMT_S16_LE) {
++                              /*- convert endianess, probably could be done by SSI also */
++                              for (i = 0; (i < slen); i += 4) {
++                                      unsigned short val = le16_to_cpu((*bufwp++));
++                                      *dp++ = val;
++                              }
++                      } else {
++                              for (i = 0; (i < slen); i += 4) {
++                                      *dp++ = *bufwp++;
++                              }
++                      }
++              } else {
++                      for (i = 0; (i < slen); i += 4) {
++                              *dp    = (((unsigned long) *bufbp++) << 24);
++                              *dp++ |= (((unsigned long) *bufbp++) << 8);
++                      }
++              }
++      } else {
++              if (audio_device->bits == 16) {
++                      for (i = 0; (i < slen); i += 4) {
++                              *dp++ = (((unsigned long)*bufwp)<<16) | *bufwp;
++                              bufwp++;
++                      }
++              } else {
++                      for (i = 0; (i < slen); i += 4) {
++                              *dp++ = (((unsigned long) *bufbp) << 24) |
++                                      (((unsigned long) *bufbp) << 8);
++                              bufbp++;
++                      }
++              }
++      }
++
++      e += slen;
++      if (e >= BUFSIZE)
++              e = 0;
++      audio_append = e;
++
++      /* If not outputing audio, then start now */
++      if (audio_txbusy == 0) {
++              audio_txbusy++;
++              audio_device->channel = 0;
++              enable_ssi();
++#ifdef CONFIG_SSIAUDIO_USE_EDMA
++              ssi_audio_dmabuf(); /* start first DMA transfer */
++#endif
++      }
++
++      bufcnt -= slen;
++
++      if (bufcnt > 0)
++              goto tryagain;
++
++      spin_unlock(&(audio_device->lock));
++
++      return count;
++}
++
++/* ioctl: control the driver */
++static int ssi_audio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
++{
++      long    val;
++      int     rc = 0;
++
++#ifdef AUDIO_DEBUG
++    printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", (int) cmd, (int) arg);
++#endif
++
++      if (audio_device==NULL) return (-ENODEV);
++
++      switch (cmd) {
++
++      case SNDCTL_DSP_SPEED:
++              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
++                      get_user(val, (unsigned long *) arg);
++#ifdef AUDIO_DEBUG
++                      printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SPEED: %ld\n", val);
++#endif
++                      ssi_audio_txdrain();
++                      audio_device->speed = val;
++                      init_audio_codec();
++              } else {
++                      rc = -EINVAL;
++              }
++              break;
++
++      case SNDCTL_DSP_SAMPLESIZE:
++              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
++                      get_user(val, (unsigned long *) arg);
++                      ssi_audio_txdrain();
++                      ssi_audio_setsamplesize(val);
++              } else {
++                      rc = -EINVAL;
++              }
++              break;
++
++      case SNDCTL_DSP_STEREO:
++              if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
++                      get_user(val, (unsigned long *) arg);
++                      ssi_audio_txdrain();
++                      audio_device->stereo = val;
++              } else {
++                      rc = -EINVAL;
++              }
++              break;
++
++      case SNDCTL_DSP_GETBLKSIZE:
++              if (access_ok(VERIFY_WRITE, (void *) arg, sizeof(long)))
++                      put_user(BUFSIZE, (long *) arg);
++              else
++                      rc = -EINVAL;
++              break;
++
++      case SNDCTL_DSP_SYNC:
++              ssi_audio_txdrain();
++              break;
++
++      default:
++              rc = -EINVAL;
++              break;
++      }
++
++      return rc;
++}
++
++/****************************************************************************/
++
++struct file_operations        ssi_audio_fops = {
++      open: ssi_audio_open,           /* open */
++      release: ssi_audio_close,       /* close */
++      write: ssi_audio_write,         /* write */
++      ioctl: ssi_audio_ioctl,         /* ioctl */
++};
++
++/* initialize audio driver */
++static int __devinit ssi_audio_probe(struct spi_device *spi)
++{
++      struct ssi_audio        *audio;
++      int     err;
++
++#ifdef AUDIO_DEBUG
++      printk(DRIVER_NAME": probe\n");
++#endif
++
++      if (!spi->irq) {
++              dev_dbg(&spi->dev, "no IRQ?\n");
++              return -ENODEV;
++      }
++
++      /* don't exceed max specified sample rate */
++      if (spi->max_speed_hz > MAX_SPEED_HZ) {
++              dev_dbg(&spi->dev, "f(sample) %d KHz?\n",
++                              (spi->max_speed_hz)/1000);
++              return -EINVAL;
++      }
++
++      /* register charcter device */
++      if (register_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME, &ssi_audio_fops) < 0) {
++              printk(KERN_WARNING DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR);
++              dev_dbg(&spi->dev, DRIVER_NAME ": failed to register major %d\n", SOUND_MAJOR);
++              return -ENODEV;
++      }
++
++      audio = kzalloc(sizeof(struct ssi_audio), GFP_KERNEL);
++      if (!audio) {
++              err = -ENOMEM;
++              goto err_out;
++      }
++
++      /* DMA buffer must be from GFP_DMA zone, so it will not be cached */
++      audio->audio_buf = kmalloc(BUFSIZE, GFP_DMA);
++      if (audio->audio_buf == NULL) {
++              dev_dbg(&spi->dev, DRIVER_NAME ": failed to allocate DMA[%d] buffer\n", BUFSIZE);
++              err = -ENOMEM;
++              goto err_free_mem;
++      }
++
++      audio_device = audio;
++
++      dev_set_drvdata(&spi->dev, audio);
++      spi->dev.power.power_state = PMSG_ON;
++
++      audio->spi = spi;
++
++#ifndef CONFIG_SSIAUDIO_USE_EDMA
++      if (request_irq(spi->irq, ssi_audio_isr, SA_INTERRUPT,  spi->dev.bus_id, audio)) {
++              dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
++              err = -EBUSY;
++              goto err_free_mem;
++      }
++
++#else
++      /* request 2 eDMA channels since two channel output mode is used */
++      if (request_edma_channel(DMA_TCD,
++                                                      ssi_audio_dma_handler_empty,
++                                                      NULL,
++                                                      audio,
++                                                      &(audio_device->lock),
++                                                      DRIVER_NAME
++                                                      )!=0)
++      {
++              dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD);
++              err = -EBUSY;
++              goto err_free_mem;
++      }
++      if (request_edma_channel(DMA_TCD2,
++                                                      ssi_audio_dma_handler,
++                                                      NULL,
++                                                      audio,
++                                                      &(audio_device->lock),
++                                                      DRIVER_NAME
++                                                      )!=0)
++      {
++              dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2);
++              err = -EBUSY;
++              goto err_free_mem;
++      }
++
++#endif
++      chip_init();
++      printk(DRIVER_NAME ": Probed successfully\n");
++
++      return 0;
++
++ err_free_mem:
++      kfree(audio);
++      audio_device = NULL;
++ err_out:
++      unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME);
++      return err;
++}
++
++static int __devexit ssi_audio_remove(struct spi_device *spi)
++{
++      struct ssi_audio *audio = dev_get_drvdata(&spi->dev);
++
++      ssi_audio_txdrain();
++#ifndef CONFIG_SSIAUDIO_USE_EDMA
++      free_irq(spi->irq, audio);
++#else
++      free_edma_channel(DMA_TCD, audio);
++      free_edma_channel(DMA_TCD2, audio);
++#endif
++      kfree(audio->audio_buf);
++      kfree(audio);
++      audio_device = NULL;
++      unregister_chrdev(SOUND_MAJOR, SOUND_DEVICE_NAME);
++      dev_dbg(&spi->dev, "unregistered audio\n");
++      return 0;
++}
++
++static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) {
++      return 0;
++}
++
++static int ssi_audio_resume(struct spi_device *spi) {
++      return 0;
++}
++
++static struct spi_driver ssi_audio_driver = {
++      .driver = {
++              .name   = DRIVER_NAME,
++              .bus    = &spi_bus_type,
++              .owner  = THIS_MODULE,
++      },
++      .probe          = ssi_audio_probe,
++      .remove         = __devexit_p(ssi_audio_remove),
++      .suspend        = ssi_audio_suspend,
++      .resume         = ssi_audio_resume,
++};
++
++static int __init ssi_audio_init(void)
++{
++      return spi_register_driver(&ssi_audio_driver);
++}
++module_init(ssi_audio_init);
++
++static void __exit ssi_audio_exit(void)
++{
++      spi_unregister_driver(&ssi_audio_driver);
++}
++module_exit(ssi_audio_exit);
++
++MODULE_DESCRIPTION("SSI/I2S Audio Driver");
++MODULE_LICENSE("GPL");
+--- a/include/asm-m68k/coldfire_edma.h
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -1,39 +1,102 @@
++/*
++ * coldfire_edma.h - eDMA driver for Coldfire MCF5445x
++ *
++ * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
+ #ifndef _LINUX_COLDFIRE_DMA_H
+ #define _LINUX_COLDFIRE_DMA_H
+ #include <linux/interrupt.h>
++#include <asm/mcf5445x_edma.h>
+-#define EDMA_DRIVER_NAME              "ColdFire-eDMA"
+-#define DMA_DEV_MINOR                         1
++#define EDMA_DRIVER_NAME "ColdFire-eDMA"
++#define DMA_DEV_MINOR 1
+ #define EDMA_INT_CHANNEL_BASE                 8
+ #define EDMA_INT_CONTROLLER_BASE      64
+ #define EDMA_CHANNELS                 16
+-
++ 
+ #define EDMA_IRQ_LEVEL                        5
+-
++ 
+ typedef irqreturn_t (*edma_irq_handler)(int, void *);
+ typedef void (*edma_error_handler)(int, void *);
+-
++ 
++/* Setup transfer control descriptor (TCD)
++ *   channel - descriptor number
++ *   source  - source address
++ *   dest    - destination address
++ *   attr    - attributes
++ *   soff    - source offset
++ *   nbytes  - number of bytes to be transfered in minor loop
++ *   slast   - last source address adjustment
++ *   citer   - major loop count
++ *   biter   - beggining minor loop count
++ *   doff    - destination offset
++ *   dlast_sga - last destination address adjustment
++ *   major_int - generate interrupt after each major loop
++ *   disable_req - disable DMA request after major loop
++ */
+ void set_edma_params(int channel, u32 source, u32 dest,
+-      u32 attr, u32 soff, u32 nbytes, u32 slast,
+-      u32 citer, u32 biter, u32 doff, u32 dlast_sga);
+-
+-void start_edma_transfer(int channel, int major_int);
+-
+-void stop_edma_transfer(int channel);
+-
+-void confirm_edma_interrupt_handled(int channel);
+-
++              u32 attr, u32 soff, u32 nbytes, u32 slast,
++              u32 citer, u32 biter, u32 doff, u32 dlast_sga,
++              int major_int, int disable_req);
++
++/* Starts eDMA transfer on specified channel
++ *   channel - eDMA TCD number
++ */
++static inline void  start_edma_transfer(int channel)
++{
++      MCF_EDMA_SERQ = channel;
++      MCF_EDMA_SSRT = channel;
++}
++
++/* Stops eDMA transfer
++ *   channel - eDMA TCD number
++ */
++static inline void stop_edma_transfer(int channel)
++{
++      MCF_EDMA_CINT = channel;
++      MCF_EDMA_CERQ = channel;
++}
++
++
++/* Confirm that interrupt has been handled
++ *   channel - eDMA TCD number
++ */
++static inline void confirm_edma_interrupt_handled(int channel)
++{
++      MCF_EDMA_CINT = channel;
++}
++ 
++/* Initialize eDMA controller */
+ void init_edma(void);
+-
+-int  request_edma_channel(int channel,
+-                      edma_irq_handler handler,
+-                      edma_error_handler error_handler,
+-                      void *dev,
+-                      spinlock_t *lock,
+-                      const char *device_id);
+-
++ 
++/* Request eDMA channel:
++ *   channel - eDMA TCD number
++ *   handler - channel IRQ callback
++ *   error_handler - error interrupt handler callback for channel
++ *   dev - device
++ *   lock - spinlock to be locked (can be NULL)
++ *   device_id - device driver name for proc file system output
++ */
++int request_edma_channel(int channel,
++              edma_irq_handler handler,
++              edma_error_handler error_handler,
++              void *dev,
++              spinlock_t *lock,
++              const char *device_id);
++  
++/* Free eDMA channel
++ *  channel - eDMA TCD number
++ *  dev - device
++ */
+ int free_edma_channel(int channel, void *dev);
+-
+ #endif
+--- /dev/null
++++ b/include/linux/spi/mcfqspi.h
+@@ -0,0 +1,80 @@
++/****************************************************************************/
++
++/*
++ *    mcfqspi.c - Master QSPI controller for the ColdFire processors
++ *
++ *    (C) Copyright 2005, Intec Automation,
++ *                        Mike Lavender (mike@steroidmicros)
++ *
++
++     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.
++
++     This program is distributed in the hope that it will be useful,
++     but WITHOUT ANY WARRANTY; without even the implied warranty of
++     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++     GNU General Public License for more details.
++
++     You should have received a copy of the GNU General Public License
++     along with this program; if not, write to the Free Software
++     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
++/* ------------------------------------------------------------------------- */
++
++#ifndef MCFQSPI_H_
++#define MCFQSPI_H_
++
++#define QSPI_CS_INIT          0x01
++#define QSPI_CS_ASSERT                0x02
++#define QSPI_CS_DROP          0x04
++
++#define QSPIIOCS_DOUT_HIZ     1       /* QMR[DOHIE] set hi-z dout between transfers */
++#define QSPIIOCS_BITS         2       /* QMR[BITS] set transfer size */
++#define QSPIIOCG_BITS         3       /* QMR[BITS] get transfer size */
++#define QSPIIOCS_CPOL         4       /* QMR[CPOL] set SCK inactive state */
++#define QSPIIOCS_CPHA         5       /* QMR[CPHA] set SCK phase, 1=rising edge */
++#define QSPIIOCS_BAUD         6       /* QMR[BAUD] set SCK baud rate divider */
++#define QSPIIOCS_QCD          7       /* QDLYR[QCD] set start delay */
++#define QSPIIOCS_DTL          8       /* QDLYR[DTL] set after delay */
++#define QSPIIOCS_CONT         9       /* continuous CS asserted during transfer */
++#define QSPIIOCS_READDATA     10      /* set data send during read */
++#define QSPIIOCS_ODD_MOD      11      /* if length of buffer is a odd number, 16-bit transfers */
++                                      /* are finalized with a 8-bit transfer */
++#define QSPIIOCS_DSP_MOD      12      /* transfers are bounded to 15/30 bytes (a multiple of 3 bytes = 1 DSPword) */
++#define QSPIIOCS_POLL_MOD     13      /* driver uses polling instead of interrupts */
++
++#define QSPIIOCS_SET_CSIV     14      /* sets CSIV flag (cs inactive level) */
++
++#ifdef CONFIG_M520x
++#undef  MCF_GPIO_PAR_QSPI
++#define MCF_GPIO_PAR_QSPI      (0xA4034)
++#endif
++
++struct coldfire_spi_master {
++      u16 bus_num;
++      u16 num_chipselect;
++      u8  irq_source;
++      u32 irq_vector;
++      u32 irq_mask;
++      u8  irq_lp;
++      u8  par_val;
++      u16 par_val16;
++      void (*cs_control)(u8 cs, u8 command);
++};
++
++
++struct coldfire_spi_chip {
++      u8 mode;
++      u8 bits_per_word;
++      u8 del_cs_to_clk;
++      u8 del_after_trans;
++      u16 void_write_data;
++};
++
++typedef struct qspi_read_data {
++        __u32 length;
++        __u8 *buf;                   /* data to send during read */
++        unsigned int loop : 1;
++} qspi_read_data;
++#endif /*MCFQSPI_H_*/
diff --git a/target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch b/target/linux/coldfire/patches/020-mcfv4e_inline_memory_params.patch
new file mode 100644 (file)
index 0000000..bd1769d
--- /dev/null
@@ -0,0 +1,168 @@
+From 3f698a1cf08cc02911cdb2ca3217be77eeba794b Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 27 Nov 2007 23:17:53 -0700
+Subject: [PATCH] Change inline assembly memory params.
+
+For various routines change how the assembly memory pointer
+is passed in.
+
+LTIBName: mcfv4e-inline-memory-params
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/bitops.h |   68 ++++++++++++++++++++++++++++++++++++++++++++-
+ 1 files changed, 67 insertions(+), 1 deletions(-)
+
+--- a/include/asm-m68k/bitops.h
++++ b/include/asm-m68k/bitops.h
+@@ -465,7 +465,7 @@ static inline int ext2_find_next_bit(con
+    __constant_coldfire_test_and_set_bit(nr, vaddr) :  \
+    __generic_coldfire_test_and_set_bit(nr, vaddr))
+-
++#if 0
+ static __inline__ int __constant_coldfire_test_and_set_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -477,6 +477,17 @@ static __inline__ int __constant_coldfir
+            : "di" (nr & 7));
+       return retval;
+ }
++#else
++static __inline__ int __constant_coldfire_test_and_set_bit(int nr,volatile void * vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bset %2,(%4); sne %0"
++           : "=d" (retval), "=m" (*p)
++           : "di" (nr & 7), "m" (*p), "a" (p));
++      return retval;
++}
++#endif
+ static __inline__ int __generic_coldfire_test_and_set_bit(int nr,
+       volatile void *vaddr)
+@@ -496,6 +507,7 @@ static __inline__ int __generic_coldfire
+    __constant_coldfire_set_bit(nr, vaddr) :   \
+    __generic_coldfire_set_bit(nr, vaddr))
++#if 0
+ static __inline__ void __constant_coldfire_set_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -503,6 +515,14 @@ static __inline__ void __constant_coldfi
+       __asm__ __volatile__ ("bset %1,%0"
+            : "+QUd" (*p) : "di" (nr & 7));
+ }
++#else
++static __inline__ void __constant_coldfire_set_bit(int nr, volatile void * vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bset %1,(%3)"
++           : "=m" (*p) : "di" (nr & 7), "m" (*p), "a" (p));
++}
++#endif
+ static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr)
+ {
+@@ -518,6 +538,7 @@ static __inline__ void __generic_coldfir
+    __constant_coldfire_test_and_clear_bit(nr, vaddr) :        \
+    __generic_coldfire_test_and_clear_bit(nr, vaddr))
++#if 0
+ static __inline__ int __constant_coldfire_test_and_clear_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -530,6 +551,19 @@ static __inline__ int __constant_coldfir
+       return retval;
+ }
++#else
++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, volatile void *vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++
++      __asm__ __volatile__ ("bclr %2,(%4); sne %0"
++           : "=d" (retval), "=m" (*p)
++           : "id" (nr & 7), "m" (*p), "a" (p));
++
++      return retval;
++}
++#endif
+ static __inline__ int __generic_coldfire_test_and_clear_bit(int nr,
+       volatile void *vaddr)
+@@ -556,6 +590,7 @@ static __inline__ int __generic_coldfire
+    __constant_coldfire_clear_bit(nr, vaddr) : \
+    __generic_coldfire_clear_bit(nr, vaddr))
++#if 0
+ static __inline__ void __constant_coldfire_clear_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -563,6 +598,14 @@ static __inline__ void __constant_coldfi
+       __asm__ __volatile__ ("bclr %1,%0"
+            : "+QUd" (*p) : "id" (nr & 7));
+ }
++#else
++static __inline__ void __constant_coldfire_clear_bit(int nr, volatile void * vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bclr %1,(%3)"
++           : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p));
++}
++#endif
+ static __inline__ void __generic_coldfire_clear_bit(int nr,
+       volatile void *vaddr)
+@@ -579,6 +622,7 @@ static __inline__ void __generic_coldfir
+    __constant_coldfire_test_and_change_bit(nr, vaddr) :       \
+    __generic_coldfire_test_and_change_bit(nr, vaddr))
++#if 0
+ static __inline__ int __constant_coldfire_test_and_change_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -591,6 +635,19 @@ static __inline__ int __constant_coldfir
+       return retval;
+ }
++#else
++static __inline__ int __constant_coldfire_test_and_change_bit(int nr, volatile void * vaddr)
++{
++      char retval;
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++
++      __asm__ __volatile__ ("bchg %2,(%4); sne %0"
++           : "=d" (retval), "=m" (*p)
++           : "id" (nr & 7), "m" (*p), "a" (p));
++
++      return retval;
++}
++#endif
+ static __inline__ int __generic_coldfire_test_and_change_bit(int nr,
+       volatile void *vaddr)
+@@ -612,6 +669,7 @@ static __inline__ int __generic_coldfire
+    __constant_coldfire_change_bit(nr, vaddr) :        \
+    __generic_coldfire_change_bit(nr, vaddr))
++#if 0
+ static __inline__ void __constant_coldfire_change_bit(int nr,
+       volatile void *vaddr)
+ {
+@@ -619,6 +677,14 @@ static __inline__ void __constant_coldfi
+       __asm__ __volatile__ ("bchg %1,%0"
+            : "+QUd" (*p) : "id" (nr & 7));
+ }
++#else
++static __inline__ void __constant_coldfire_change_bit(int nr, volatile void * vaddr)
++{
++      volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
++      __asm__ __volatile__ ("bchg %1,(%3)"
++           : "=m" (*p) : "id" (nr & 7), "m" (*p), "a" (p));
++}
++#endif
+ static __inline__ void __generic_coldfire_change_bit(int nr,
+       volatile void *vaddr)
diff --git a/target/linux/coldfire/patches/021-m5445x_usb_premerge.patch b/target/linux/coldfire/patches/021-m5445x_usb_premerge.patch
new file mode 100644 (file)
index 0000000..4650aae
--- /dev/null
@@ -0,0 +1,45 @@
+From 3d7f85e904cf9dab191eeab9933ecac1e90d06e4 Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Thu, 29 Nov 2007 16:30:47 -0700
+Subject: [PATCH] USB pre-merge
+
+LTIBName: m5445x-usb-premerge
+Signed-off-by: Duck <duck@freescale.com>
+---
+ drivers/usb/host/ehci-arc.c |   18 +++++++++++++++++-
+ 1 files changed, 17 insertions(+), 1 deletions(-)
+
+--- a/drivers/usb/host/ehci-arc.c
++++ b/drivers/usb/host/ehci-arc.c
+@@ -373,14 +373,30 @@ static int ehci_fsl_drv_resume(struct pl
+       pr_debug("%s pdev=0x%p  pdata=0x%p  ehci=0x%p  hcd=0x%p\n",
+                __FUNCTION__, pdev, pdata, ehci, hcd);
+-      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p",
++      pr_debug("%s ehci->regs=0x%p  hcd->regs=0x%p\n",
+                __FUNCTION__, ehci->regs, hcd->regs);
+       memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs));
++
++#if 0 // DDD test
+       ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
++      printk("set portsc %08x  %08x\n", usb_ehci_portsc,
++              ehci_readl(ehci,  &ehci->regs->port_status[0]));
++      printk("set usbmode %08x\n", 
++              ehci_readl(ehci,  &ehci->regs + FSL_SOC_USB_USBMODE));
+       tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
+       ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
++#else
++      tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
++      ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
++      printk("tmp %08x  set usbmode %08x\n", tmp,
++              ehci_readl(ehci,  hcd->regs + FSL_SOC_USB_USBMODE));
++
++      ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
++      printk("set portsc %08x  %08x\n", usb_ehci_portsc,
++              ehci_readl(ehci,  &ehci->regs->port_status[0]));
++#endif
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+       hcd->state = HC_STATE_RUNNING;
diff --git a/target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch b/target/linux/coldfire/patches/022-m5445x_ccm_bitdefs.patch
new file mode 100644 (file)
index 0000000..dbaae3a
--- /dev/null
@@ -0,0 +1,54 @@
+From b100a50c3bf7884a97d5008fc79d9b45f3b6e999 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 30 Nov 2007 12:55:12 -0700
+Subject: [PATCH] Fix bitfield definitions.
+
+LTIBName: m5445x-ccm-bitdefs
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/mcf5445x_ccm.h |   34 ++++++++++++++++++----------------
+ 1 files changed, 18 insertions(+), 16 deletions(-)
+
+--- a/include/asm-m68k/mcf5445x_ccm.h
++++ b/include/asm-m68k/mcf5445x_ccm.h
+@@ -118,22 +118,24 @@
+ #define MCF_CCM_MISCCR_BMT(x)           (((x) & 0x0007) << 8) /* Bus monitor timing field */
+ #define MCF_CCM_MISCCR_BME              (0x0800)      /* Bus monitor external enable bit */
+ #define MCF_CCM_MISCCR_LIMP             (0x1000)      /* Limp mode enable */
+-#define MCF_CCM_MISCCR_BMT_65536        (0)
+-#define MCF_CCM_MISCCR_BMT_32768        (1)
+-#define MCF_CCM_MISCCR_BMT_16384        (2)
+-#define MCF_CCM_MISCCR_BMT_8192         (3)
+-#define MCF_CCM_MISCCR_BMT_4096         (4)
+-#define MCF_CCM_MISCCR_BMT_2048         (5)
+-#define MCF_CCM_MISCCR_BMT_1024         (6)
+-#define MCF_CCM_MISCCR_BMT_512          (7)
+-#define MCF_CCM_MISCCR_SSIPUS_UP        (1)
+-#define MCF_CCM_MISCCR_SSIPUS_DOWN      (0)
+-#define MCF_CCM_MISCCR_TIMDMA_TIM       (1)
+-#define MCF_CCM_MISCCR_TIMDMA_SSI       (0)
+-#define MCF_CCM_MISCCR_SSISRC_CLKIN     (0)
+-#define MCF_CCM_MISCCR_SSISRC_PLL       (1)
+-#define MCF_CCM_MISCCR_USBOC_ACTHI      (0)
+-#define MCF_CCM_MISCCR_USBOV_ACTLO      (1)
++#define MCF_CCM_MISCCR_BMT_65536        (0 << 8)
++#define MCF_CCM_MISCCR_BMT_32768        (1 << 8)
++#define MCF_CCM_MISCCR_BMT_16384        (2 << 8)
++#define MCF_CCM_MISCCR_BMT_8192         (3 << 8)
++#define MCF_CCM_MISCCR_BMT_4096         (4 << 8)
++#define MCF_CCM_MISCCR_BMT_2048         (5 << 8)
++#define MCF_CCM_MISCCR_BMT_1024         (6 << 8)
++#define MCF_CCM_MISCCR_BMT_512          (7 << 8)
++#define MCF_CCM_MISCCR_SSIPUE_UP        (1 << 7)
++#define MCF_CCM_MISCCR_SSIPUE_DOWN      (0 << 7)
++#define MCF_CCM_MISCCR_SSIPUS_UP        (1 << 6)
++#define MCF_CCM_MISCCR_SSIPUS_DOWN      (0 << 6)
++#define MCF_CCM_MISCCR_TIMDMA_TIM       (1 << 5)
++#define MCF_CCM_MISCCR_TIMDMA_SSI       (0 << 5)
++#define MCF_CCM_MISCCR_SSISRC_CLKIN     (0 << 4)
++#define MCF_CCM_MISCCR_SSISRC_PLL       (1 << 4)
++#define MCF_CCM_MISCCR_USBOC_ACTHI      (0 << 1)
++#define MCF_CCM_MISCCR_USBOC_ACTLO      (1 << 1)
+ #define MCF_CCM_MISCCR_USBSRC_CLKIN     (0)
+ #define MCF_CCM_MISCCR_USBSRC_PLL       (1)
diff --git a/target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch b/target/linux/coldfire/patches/023-mcfv4e_cache_base_update.patch
new file mode 100644 (file)
index 0000000..9215085
--- /dev/null
@@ -0,0 +1,1194 @@
+From 3592cd3db82e5b010df590079f1e310b5d317248 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 3 Dec 2007 23:03:07 -0700
+Subject: [PATCH] Rewrite Coldfire cache code.
+
+LTIBName: mcfv4e-cache-base-update
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/cache.c       |  196 +-------------
+ arch/m68k/coldfire/head.S        |    6 +-
+ arch/m68k/coldfire/signal.c      |    4 +-
+ arch/m68k/kernel/sys_m68k.c      |   16 ++
+ arch/m68k/mm/cache.c             |   31 +---
+ arch/m68k/mm/memory.c            |   76 +-----
+ include/asm-m68k/cf_cacheflush.h |  525 +++++++++++++++++++++++++++++---------
+ include/asm-m68k/cfcache.h       |   95 ++++----
+ 8 files changed, 495 insertions(+), 454 deletions(-)
+
+--- a/arch/m68k/coldfire/cache.c
++++ b/arch/m68k/coldfire/cache.c
+@@ -1,7 +1,8 @@
+ /*
+- *  linux/arch/m68k/coldifre/cache.c
++ *  linux/arch/m68k/coldfire/cache.c
+  *
+  *  Matt Waddel Matt.Waddel@freescale.com
++ *  Kurt Mahan kmahan@freescale.com
+  *  Copyright Freescale Semiconductor, Inc. 2007
+  *
+  *  This program is free software; you can redistribute it and/or modify
+@@ -15,191 +16,13 @@
+ #include <asm/coldfire.h>
+ #include <asm/system.h>
+-#define _DCACHE_SIZE (2*16384)
+-#define _ICACHE_SIZE (2*16384)
+-
+-#define _SET_SHIFT 4
+-
+-/*
+- * Masks for cache sizes.  Programming note: because the set size is a
+- * power of two, the mask is also the last address in the set.
+- */
+-
+-#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT)
+-#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT)
+-#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
+-#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
+-
+-/************************************************************
+- *  Routine to cleanly flush the cache, pushing all lines and
+- *  invalidating them.
+- *
+- *  The is the flash-resident version, used after copying the .text
+- *  segment from flash to ram.
+- *************************************************************/
+-void FLASHDcacheFlushInvalidate(void)
+-      __attribute__ ((section (".text_loader")));
+-
+-void FLASHDcacheFlushInvalidate()
+-{
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      start_set = 0;
+-      end_set = (unsigned long)LAST_DCACHE_ADDR;
+-
+-      for (set = start_set; set < end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)" : : "a" (set));
+-}
+-
+-/************************************************************
+- *  Routine to cleanly flush the cache, pushing all lines and
+- *  invalidating them.
+- *
+- *************************************************************/
+-void DcacheFlushInvalidate()
+-{
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      start_set = 0;
+-      end_set = (unsigned long)LAST_DCACHE_ADDR;
+-
+-      for (set = start_set; set < end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)" : : "a" (set));
+-}
+-
+-
+-
+-/******************************************************************************
+- *  Routine to cleanly flush the a block of cache, pushing all relevant lines
+- *  and invalidating them.
+- *
+- ******************************************************************************/
+-void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size)
+-{
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      /* if size is bigger than the cache can store
+-       * set the size to the maximum amount
+-       */
+-
+-      if (size > LAST_DCACHE_ADDR)
+-              size = LAST_DCACHE_ADDR;
+-
+-      start_set = ((unsigned long)start) & _DCACHE_SET_MASK;
+-      end_set = ((unsigned long)(start+size-1)) & _DCACHE_SET_MASK;
+-
+-      if (start_set > end_set) {
+-              /* from the begining to the lowest address */
+-              for (set = 0; set <= end_set; set += (0x10 - 3))
+-                      asm volatile("cpushl %%dc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%dc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%dc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%dc,(%0)" : : "a" (set));
+-
+-              /* next loop will finish the cache ie pass the hole */
+-              end_set = LAST_DCACHE_ADDR;
+-      }
+-      for (set = start_set; set <= end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%dc,(%0)" : : "a" (set));
+-}
+-
+-
+-void IcacheInvalidateCacheBlock(void *start, unsigned long size)
+-{
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      /* if size is bigger than the cache can store
+-       * set the size to the maximum ammount
+-       */
+-
+-      if (size > LAST_ICACHE_ADDR)
+-              size = LAST_ICACHE_ADDR;
+-
+-      start_set = ((unsigned long)start) & _ICACHE_SET_MASK;
+-      end_set = ((unsigned long)(start+size-1)) & _ICACHE_SET_MASK;
+-
+-      if (start_set > end_set) {
+-              /* from the begining to the lowest address */
+-              for (set = 0; set <= end_set; set += (0x10 - 3))
+-                      asm volatile("cpushl %%ic,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%ic,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%ic,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%ic,(%0)" : : "a" (set));
+-
+-              /* next loop will finish the cache ie pass the hole */
+-              end_set = LAST_ICACHE_ADDR;
+-      }
+-      for (set = start_set; set <= end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%ic,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%ic,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%ic,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%ic,(%0)" : : "a" (set));
+-}
+-
+-
+-/********************************************************************
+- *  Disable the data cache completely
+- ********************************************************************/
+-void DcacheDisable(void)
+-{
+-      int newValue;
+-      unsigned long flags;
+-
+-      local_save_flags(flags);
+-      local_irq_disable();
+-
+-      DcacheFlushInvalidate();      /* begin by flushing the cache */
+-      newValue = CACHE_DISABLE_MODE; /* disable it */
+-      cacr_set(newValue);
+-      local_irq_restore(flags);
+-}
+-
+-/********************************************************************
+- *  Unconditionally enable the data cache
+- ********************************************************************/
+-void DcacheEnable(void)
+-{
+-      cacr_set(CACHE_INITIAL_MODE);
+-}
+-
+-
++/* Cache Control Reg shadow reg */
+ unsigned long shadow_cacr;
++/**
++ * cacr_set - Set the Cache Control Register
++ * @x Value to set
++ */
+ void cacr_set(unsigned long x)
+ {
+       shadow_cacr = x;
+@@ -209,6 +32,11 @@ void cacr_set(unsigned long x)
+                             : "r" (shadow_cacr));
+ }
++/**
++ * cacr_get - Get the current value of the Cache Control Register
++ *
++ * @return CACR value
++ */
+ unsigned long cacr_get(void)
+ {
+       return shadow_cacr;
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -244,7 +244,7 @@ ENTRY(__start)
+ /* Setup initial stack pointer */
+       movel   #0x40001000,%sp 
+-/* Clear usp */
++/* Setup usp */
+       subl    %a0,%a0
+       movel   %a0,%usp
+@@ -252,6 +252,10 @@ ENTRY(__start)
+       movec   %d0, %rambar1
+       movew   #0x2700,%sr
++/* reset cache */
++      movel   #(CF_CACR_ICINVA + CF_CACR_DCINVA),%d0
++      movecl  %d0,%cacr
++
+       movel   #(MMU_BASE+1),%d0
+       movecl  %d0,%mmubar
+       movel   #MMUOR_CA,%a0                   /* Clear tlb entries */
+--- a/arch/m68k/coldfire/signal.c
++++ b/arch/m68k/coldfire/signal.c
+@@ -37,6 +37,7 @@
+ #include <asm/cf_pgtable.h>
+ #include <asm/traps.h>
+ #include <asm/ucontext.h>
++#include <asm/cacheflush.h>
+ #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+@@ -605,10 +606,9 @@ static inline int rt_setup_ucontext(stru
+       return err;
+ }
+-extern void IcacheInvalidateCacheBlock(void *, unsigned long);
+ static inline void push_cache(unsigned long vaddr)
+ {
+-      IcacheInvalidateCacheBlock((void *)vaddr, 8);
++      cf_cache_push(__pa(vaddr), 8);
+ }
+ static inline void __user *
+--- a/arch/m68k/kernel/sys_m68k.c
++++ b/arch/m68k/kernel/sys_m68k.c
+@@ -29,6 +29,9 @@
+ #include <asm/traps.h>
+ #include <asm/page.h>
+ #include <asm/unistd.h>
++#ifdef CONFIG_COLDFIRE
++#include <asm/cacheflush.h>
++#endif
+ /*
+  * sys_pipe() is the normal C calling standard for creating
+@@ -257,6 +260,7 @@ asmlinkage int sys_ipc (uint call, int f
+       return -EINVAL;
+ }
++#ifndef CONFIG_COLDFIRE
+ /* Convert virtual (user) address VADDR to physical address PADDR */
+ #define virt_to_phys_040(vaddr)                                               \
+ ({                                                                    \
+@@ -580,6 +584,7 @@ cache_flush_060 (unsigned long addr, int
+     }
+   return 0;
+ }
++#endif /* CONFIG_COLDFIRE */
+ /* sys_cacheflush -- flush (part of) the processor cache.  */
+ asmlinkage int
+@@ -612,6 +617,7 @@ sys_cacheflush (unsigned long addr, int 
+                       goto out;
+       }
++#ifndef CONFIG_COLDFIRE
+       if (CPU_IS_020_OR_030) {
+               if (scope == FLUSH_SCOPE_LINE && len < 256) {
+                       unsigned long cacr;
+@@ -656,6 +662,16 @@ sys_cacheflush (unsigned long addr, int 
+               ret = cache_flush_060 (addr, scope, cache, len);
+           }
+       }
++#else /* CONFIG_COLDFIRE */
++      if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA))
++              flush_bcache();
++      else if (cache & FLUSH_CACHE_INSN)
++              flush_icache();
++      else
++              flush_dcache();
++
++      ret = 0;
++#endif /* CONFIG_COLDFIRE */
+ out:
+       unlock_kernel();
+       return ret;
+--- a/arch/m68k/mm/cache.c
++++ b/arch/m68k/mm/cache.c
+@@ -81,36 +81,7 @@ static unsigned long virt_to_phys_slow(u
+ void flush_icache_range(unsigned long address, unsigned long endaddr)
+ {
+ #ifdef CONFIG_COLDFIRE
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      start_set = address & _ICACHE_SET_MASK;
+-      end_set = endaddr & _ICACHE_SET_MASK;
+-
+-      if (start_set > end_set) {
+-      /* from the begining to the lowest address */
+-              for (set = 0; set <= end_set; set += (0x10 - 3))
+-                      asm volatile ("cpushl %%ic,(%0)\n"
+-                                    "\taddq%.l #1,%0\n"
+-                                    "\tcpushl %%ic,(%0)\n"
+-                                    "\taddq%.l #1,%0\n"
+-                                    "\tcpushl %%ic,(%0)\n"
+-                                    "\taddq%.l #1,%0\n"
+-                                    "\tcpushl %%ic,(%0)" : : "a" (set));
+-
+-              /* next loop will finish the cache ie pass the hole */
+-              end_set = LAST_ICACHE_ADDR;
+-      }
+-      for (set = start_set; set <= end_set; set += (0x10 - 3))
+-              asm volatile ("cpushl %%ic,(%0)\n"
+-                            "\taddq%.l #1,%0\n"
+-                            "\tcpushl %%ic,(%0)\n"
+-                            "\taddq%.l #1,%0\n"
+-                            "\tcpushl %%ic,(%0)\n"
+-                            "\taddq%.l #1,%0\n"
+-                            "\tcpushl %%ic,(%0)" : : "a" (set));
+-
++      cf_icache_flush_range(address, endaddr);
+ #else /* !CONFIG_COLDFIRE */
+       if (CPU_IS_040_OR_060) {
+--- a/arch/m68k/mm/memory.c
++++ b/arch/m68k/mm/memory.c
+@@ -127,6 +127,7 @@ int free_pointer_table (pmd_t *ptable)
+       return 0;
+ }
++#ifndef CONFIG_COLDFIRE
+ /* invalidate page in both caches */
+ static inline void clear040(unsigned long paddr)
+ {
+@@ -173,6 +174,7 @@ static inline void pushcl040(unsigned lo
+               clear040(paddr);
+       local_irq_restore(flags);
+ }
++#endif /* CONFIG_COLDFIRE */
+ /*
+  * 040: Hit every page containing an address in the range paddr..paddr+len-1.
+@@ -203,38 +205,10 @@ static inline void pushcl040(unsigned lo
+ void cache_clear (unsigned long paddr, int len)
+ {
+-    if (CPU_IS_CFV4E) {
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      start_set = paddr & _ICACHE_SET_MASK;
+-      end_set = (paddr+len-1) & _ICACHE_SET_MASK;
+-
+-      if (start_set > end_set) {
+-              /* from the begining to the lowest address */
+-              for (set = 0; set <= end_set; set += (0x10 - 3))
+-                      asm volatile("cpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)" : : "a" (set));
+-
+-              /* next loop will finish the cache ie pass the hole */
+-              end_set = LAST_ICACHE_ADDR;
+-      }
+-      for (set = start_set; set <= end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)" : : "a" (set));
+-
+-    } else if (CPU_IS_040_OR_060) {
++#ifdef CONFIG_COLDFIRE
++      cf_cache_clear(paddr, len);
++#else
++    if (CPU_IS_040_OR_060) {
+       int tmp;
+       /*
+@@ -268,6 +242,7 @@ void cache_clear (unsigned long paddr, i
+     if(mach_l2_flush)
+       mach_l2_flush(0);
+ #endif
++#endif /* CONFIG_COLDFIRE */
+ }
+ EXPORT_SYMBOL(cache_clear);
+@@ -281,38 +256,10 @@ EXPORT_SYMBOL(cache_clear);
+ void cache_push (unsigned long paddr, int len)
+ {
+-    if (CPU_IS_CFV4E) {
+-      unsigned long set;
+-      unsigned long start_set;
+-      unsigned long end_set;
+-
+-      start_set = paddr & _ICACHE_SET_MASK;
+-      end_set = (paddr+len-1) & _ICACHE_SET_MASK;
+-
+-      if (start_set > end_set) {
+-              /* from the begining to the lowest address */
+-              for (set = 0; set <= end_set; set += (0x10 - 3))
+-                      asm volatile("cpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)\n"
+-                                   "\taddq%.l #1,%0\n"
+-                                   "\tcpushl %%bc,(%0)" : : "a" (set));
+-
+-              /* next loop will finish the cache ie pass the hole */
+-              end_set = LAST_ICACHE_ADDR;
+-      }
+-      for (set = start_set; set <= end_set; set += (0x10 - 3))
+-              asm volatile("cpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)\n"
+-                           "\taddq%.l #1,%0\n"
+-                           "\tcpushl %%bc,(%0)" : : "a" (set));
+-
+-    } else if (CPU_IS_040_OR_060) {
++#ifdef CONFIG_COLDFIRE
++      cf_cache_push(paddr, len);
++#else
++    if (CPU_IS_040_OR_060) {
+       int tmp = PAGE_SIZE;
+       /*
+@@ -352,6 +299,7 @@ void cache_push (unsigned long paddr, in
+     if(mach_l2_flush)
+       mach_l2_flush(1);
+ #endif
++#endif /* CONFIG_COLDFIRE */
+ }
+ EXPORT_SYMBOL(cache_push);
+--- a/include/asm-m68k/cf_cacheflush.h
++++ b/include/asm-m68k/cf_cacheflush.h
+@@ -1,160 +1,439 @@
++/*
++ * include/asm-m68k/cf_cacheflush.h - Coldfire Cache
++ *
++ * Based on include/asm-m68k/cacheflush.h
++ *
++ * Coldfire pieces by:
++ *   Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
+ #ifndef M68K_CF_CACHEFLUSH_H
+ #define M68K_CF_CACHEFLUSH_H
+ #include <asm/cfcache.h>
+ /*
+- * Cache handling functions
++ * Coldfire Cache Model
++ *
++ * The Coldfire processors use a Harvard architecture cache configured
++ * as four-way set associative.  The cache does not implement bus snooping
++ * so cache coherency with other masters must be maintained in software.
++ *
++ * The cache is managed via the CPUSHL instruction in conjunction with
++ * bits set in the CACR (cache control register).  Currently the code
++ * uses the CPUSHL enhancement which adds the ability to
++ * invalidate/clear/push a cacheline by physical address.  This feature
++ * is designated in the Hardware Configuration Register [D1-CPES].
++ *
++ * CACR Bits:
++ *    DPI[28]         cpushl invalidate disable for d-cache
++ *    IDPI[12]        cpushl invalidate disable for i-cache
++ *    SPA[14]         cpushl search by physical address
++ *    IVO[20]         cpushl invalidate only
++ *
++ * Random Terminology:
++ *  * invalidate = reset the cache line's valid bit
++ *  * push = generate a line-sized store of the data if its contents are marked
++ *         as modifed (the modified flag is cleared after the store)
++ *  * clear = push + invalidate
+  */
+-#define flush_icache()                                                \
+-({                                                            \
+-  unsigned long set;                                          \
+-  unsigned long start_set;                                    \
+-  unsigned long end_set;                                      \
+-                                                              \
+-  start_set = 0;                                              \
+-  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
+-                                                              \
+-  for (set = start_set; set <= end_set; set += (0x10 - 3))    \
+-    asm volatile("cpushl %%ic,(%0)\n"                         \
+-               "\taddq%.l #1,%0\n"                            \
+-               "\tcpushl %%ic,(%0)\n"                         \
+-               "\taddq%.l #1,%0\n"                            \
+-               "\tcpushl %%ic,(%0)\n"                         \
+-               "\taddq%.l #1,%0\n"                            \
+-               "\tcpushl %%ic,(%0)" : : "a" (set));           \
+-})
++/**
++ * flush_icache - Flush all of the instruction cache
++ */
++static inline void flush_icache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%ic,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
+-/*
+- * invalidate the cache for the specified memory range.
+- * It starts at the physical address specified for
+- * the given number of bytes.
++/**
++ * flush_dcache - Flush all of the data cache
+  */
+-extern void cache_clear(unsigned long paddr, int len);
+-/*
+- * push any dirty cache in the specified memory range.
+- * It starts at the physical address specified for
+- * the given number of bytes.
++static inline void flush_dcache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%dc,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
++
++/**
++ * flush_bcache - Flush all of both caches
+  */
+-extern void cache_push(unsigned long paddr, int len);
++static inline void flush_bcache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
+-/*
+- * push and invalidate pages in the specified user virtual
+- * memory range.
++/**
++ * cf_cache_clear - invalidate cache
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Invalidate cache lines starting at paddr for len bytes.
++ * Those lines are not pushed.
++ */
++static inline void cf_cache_clear(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne%.b    1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA+CF_CACR_IVO)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_push - Push dirty cache out with no invalidate
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Push the any dirty lines starting at paddr for len bytes.
++ * Those lines are not invalidated.
++ */
++static inline void cf_cache_push(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_flush - Push dirty cache out and invalidate
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Push the any dirty lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_cache_flush(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty data/instr lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      int len;
++
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
++      len = vend - vstart;
++      vstart = __pa(vstart);
++      vend = vstart + len;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (vstart), "a" (vend),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
++
++/**
++ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty data lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%dc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (__pa(vstart)), "a" (__pa(vend)),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
++
++/**
++ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty instr lines starting at paddr for len bytes and
++ * invalidate those lines.  This should just be an invalidate since you
++ * shouldn't be able to have dirty instruction cache.
+  */
+-extern void cache_push_v(unsigned long vaddr, int len);
++static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%ic,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (__pa(vstart)), "a" (__pa(vend)),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
+-/* This is needed whenever the virtual mapping of the current
+-   process changes.  */
++/**
++ * flush_cache_mm - Flush an mm_struct
++ * @mm: mm_struct to flush
++ */
++static inline void flush_cache_mm(struct mm_struct *mm)
++{
++      if (mm == current->mm)
++              flush_bcache();
++}
++#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
+-#define flush_cache_all()             do { } while (0)
+-#define flush_cache_mm(mm)            do { } while (0)
+-#define flush_cache_range(mm, a, b)   do { } while (0)
+-#define flush_cache_page(vma, vmaddr, pfn)    do { } while (0)
+-
+-#define flush_dcache_range(paddr, len)        do { } while (0)
+-
+-/* Push the page at kernel virtual address and clear the icache */
+-/* use cpush %bc instead of cpush %dc, cinv %ic */
+-#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
+-extern inline void __flush_page_to_ram(void *address)
+-{
+-  unsigned long set;
+-  unsigned long start_set;
+-  unsigned long end_set;
+-  unsigned long addr = (unsigned long) address;
+-
+-  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
+-
+-  start_set = addr & _ICACHE_SET_MASK;
+-  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
+-
+-  if (start_set > end_set) {
+-    /* from the begining to the lowest address */
+-    for (set = 0; set <= end_set; set += (0x10 - 3))
+-      asm volatile("cpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)" : : "a" (set));
+-
+-    /* next loop will finish the cache ie pass the hole */
+-    end_set = LAST_ICACHE_ADDR;
+-  }
+-  for (set = start_set; set <= end_set; set += (0x10 - 3))
+-    asm volatile("cpushl %%bc,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%bc,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%bc,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%bc,(%0)" : : "a" (set));
+-}
+-
+-#define flush_dcache_page(page)                       do { } while (0)
+-#define flush_icache_page(vma, pg)            do { } while (0)
+-#define flush_icache_user_range(adr, len)     do { } while (0)
+-/* NL */
+-#define flush_icache_user_page(vma, page, addr, len)  do { } while (0)
+-
+-/* Push n pages at kernel virtual address and clear the icache */
+-/* use cpush %bc instead of cpush %dc, cinv %ic */
+-extern inline void flush_icache_range(unsigned long address,
+-                                    unsigned long endaddr)
+-{
+-  unsigned long set;
+-  unsigned long start_set;
+-  unsigned long end_set;
+-
+-  start_set = address & _ICACHE_SET_MASK;
+-  end_set = endaddr & _ICACHE_SET_MASK;
+-
+-  if (start_set > end_set) {
+-    /* from the begining to the lowest address */
+-    for (set = 0; set <= end_set; set += (0x10 - 3))
+-      asm volatile("cpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)" : : "a" (set));
+-
+-    /* next loop will finish the cache ie pass the hole */
+-    end_set = LAST_ICACHE_ADDR;
+-  }
+-  for (set = start_set; set <= end_set; set += (0x10 - 3))
+-    asm volatile("cpushl %%ic,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%ic,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%ic,(%0)\n"
+-               "\taddq%.l #1,%0\n"
+-               "\tcpushl %%ic,(%0)" : : "a" (set));
++/**
++ * flush_cache_range - Flush a cache range
++ * @vma: vma struct
++ * @start: Starting address
++ * @end: Ending address
++ *
++ * flush_cache_range must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_range(struct vm_area_struct *vma,
++      unsigned long start, unsigned long end)
++{
++      if (vma->vm_mm == current->mm)
++              cf_cache_flush_range(start, end);
+ }
++/**
++ * flush_cache_page - Flush a page of the cache
++ * @vma: vma struct
++ * @vmaddr:
++ * @pfn: page numer
++ *
++ * flush_cache_page must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_page(struct vm_area_struct *vma,
++      unsigned long vmaddr, unsigned long pfn)
++{
++      if (vma->vm_mm == current->mm)
++              cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
++}
++
++/**
++ * __flush_page_to_ram - Push a page out of the cache
++ * @vaddr: Virtual address at start of page
++ *
++ * Push the page at kernel virtual address *vaddr* and clear
++ * the icache.
++ */
++static inline void __flush_page_to_ram(void *vaddr)
++{
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%d0\n"
++                   "and%.l    #0xfffffff0,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE),
++                       "r" (shadow_cacr), "i" (CF_CACR_SPA)
++                   : "a0", "d0");
++}
++
++/*
++ * Various defines for the kernel.
++ */
++
++extern void cache_clear(unsigned long paddr, int len);
++extern void cache_push(unsigned long paddr, int len);
++extern void flush_icache_range(unsigned long address, unsigned long endaddr);
++
++#define flush_cache_all()                     flush_bcache()
++#define flush_cache_vmap(start, end)          flush_bcache()
++#define flush_cache_vunmap(start, end)                flush_bcache()
++
++#define flush_dcache_range(vstart, vend)      cf_dcache_flush_range(vstart, vend)
++#define flush_dcache_page(page)                       __flush_page_to_ram(page_address(page))
++#define flush_dcache_mmap_lock(mapping)               do { } while (0)
++#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++
++#define flush_icache_page(vma, page)          __flush_page_to_ram(page_address(page))
++
++/**
++ * copy_to_user_page - Copy memory to user page
++ */
+ static inline void copy_to_user_page(struct vm_area_struct *vma,
+                                    struct page *page, unsigned long vaddr,
+                                    void *dst, void *src, int len)
+ {
+       memcpy(dst, src, len);
+-      flush_icache_user_page(vma, page, vaddr, len);
++      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
+ }
++
++/**
++ * copy_from_user_page - Copy memory from user page
++ */
+ static inline void copy_from_user_page(struct vm_area_struct *vma,
+                                      struct page *page, unsigned long vaddr,
+                                      void *dst, void *src, int len)
+ {
++      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
+       memcpy(dst, src, len);
+ }
+-#define flush_cache_dup_mm(mm)                        flush_cache_mm(mm)
+-#define flush_cache_vmap(start, end)          flush_cache_all()
+-#define flush_cache_vunmap(start, end)                flush_cache_all()
+-#define flush_dcache_mmap_lock(mapping)               do { } while (0)
+-#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
+-
+ #endif /* M68K_CF_CACHEFLUSH_H */
+--- a/include/asm-m68k/cfcache.h
++++ b/include/asm-m68k/cfcache.h
+@@ -1,19 +1,32 @@
+ /*
+- * include/asm-m68k/cfcache.h
++ * include/asm-m68k/cfcache.h - Coldfire Cache Controller
++ *
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
+  */
+ #ifndef CF_CFCACHE_H
+ #define CF_CFCACHE_H
++/*
++ * CACR Cache Control Register
++ */
+ #define CF_CACR_DEC         (0x80000000) /* Data Cache Enable                */
+ #define CF_CACR_DW          (0x40000000) /* Data default Write-protect       */
+ #define CF_CACR_DESB        (0x20000000) /* Data Enable Store Buffer         */
+-#define CF_CACR_DDPI        (0x10000000) /* Data Disable CPUSHL Invalidate   */
++#define CF_CACR_DPI         (0x10000000) /* Data Disable CPUSHL Invalidate   */
+ #define CF_CACR_DHLCK       (0x08000000) /* 1/2 Data Cache Lock Mode         */
+ #define CF_CACR_DDCM_00     (0x00000000) /* Cacheable writethrough imprecise */
+ #define CF_CACR_DDCM_01     (0x02000000) /* Cacheable copyback               */
+ #define CF_CACR_DDCM_10     (0x04000000) /* Noncacheable precise             */
+ #define CF_CACR_DDCM_11     (0x06000000) /* Noncacheable imprecise           */
+ #define CF_CACR_DCINVA      (0x01000000) /* Data Cache Invalidate All        */
++#define CF_CACR_DDSP        (0x00800000) /* Data default supervisor-protect  */
+ #define CF_CACR_IVO         (0x00100000) /* Invalidate only                  */
+ #define CF_CACR_BEC         (0x00080000) /* Branch Cache Enable              */
+ #define CF_CACR_BCINVA      (0x00040000) /* Branch Cache Invalidate All      */
+@@ -24,61 +37,43 @@
+ #define CF_CACR_IHLCK       (0x00000800) /* 1/2 Instruction Cache Lock Mode  */
+ #define CF_CACR_IDCM        (0x00000400) /* Noncacheable Instr default mode  */
+ #define CF_CACR_ICINVA      (0x00000100) /* Instr Cache Invalidate All       */
++#define CF_CACR_IDSP      (0x00000080) /* Ins default supervisor-protect   */
+ #define CF_CACR_EUSP        (0x00000020) /* Switch stacks in user mode       */
+-#define DCACHE_LINE_SIZE 0x0010     /* bytes per line        */
+-#define DCACHE_WAY_SIZE  0x2000     /* words per cache block */
+-#define CACHE_DISABLE_MODE (CF_CACR_DCINVA+CF_CACR_BCINVA+CF_CACR_ICINVA)
+-#ifdef CONFIG_M5445X_DISABLE_CACHE
+-/* disable cache for testing rev0 silicon */
+-#define CACHE_INITIAL_MODE (CF_CACR_EUSP)
+-#else
+-#define CACHE_INITIAL_MODE (CF_CACR_DEC+CF_CACR_BEC+CF_CACR_IEC+CF_CACR_EUSP)
+-#endif
+-
+-#define _DCACHE_SIZE (2*16384)
+-#define _ICACHE_SIZE (2*16384)
+-
+-#define _SET_SHIFT 4
+-
++#ifdef CONFIG_M54455
+ /*
+- * Masks for cache sizes.  Programming note: because the set size is a
+- * power of two, the mask is also the last address in the set.
+- * This may need to be #ifdef for other Coldfire processors.
++ * M5445x Cache Configuration
++ *    - cache line size is 16 bytes
++ *    - cache is 4-way set associative
++ *    - each cache has 256 sets (64k / 16bytes / 4way)
++ *    - I-Cache size is 16KB
++ *    - D-Cache size is 16KB
+  */
++#define ICACHE_SIZE 0x4000            /* instruction - 16k */
++#define DCACHE_SIZE 0x4000            /* data - 16k */
+-#define _DCACHE_SET_MASK ((_DCACHE_SIZE/64-1)<<_SET_SHIFT)
+-#define _ICACHE_SET_MASK ((_ICACHE_SIZE/64-1)<<_SET_SHIFT)
+-#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
+-#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
+-
++#define CACHE_LINE_SIZE 0x0010                /* 16 bytes */
++#define CACHE_SETS 0x0100             /* 256 sets */
++#define CACHE_WAYS 0x0004             /* 4 way */
++
++#define CACHE_DISABLE_MODE    (CF_CACR_DCINVA+        \
++                               CF_CACR_BCINVA+        \
++                               CF_CACR_ICINVA)
++
++#ifndef CONFIG_M5445X_DISABLE_CACHE
++#define CACHE_INITIAL_MODE    (CF_CACR_DEC+           \
++                               CF_CACR_BEC+           \
++                               CF_CACR_IEC+           \
++                               CF_CACR_EUSP)
++#else
++/* cache disabled for testing */
++#define CACHE_INITIAL_MODE    (CF_CACR_EUSP)
++#endif /* CONFIG_M5445X_DISABLE_CACHE */
++#endif /* CONFIG_M54455 */
+ #ifndef __ASSEMBLY__
+-extern void DcacheFlushInvalidate(void);
+-
+-extern void DcacheDisable(void);
+-extern void DcacheEnable(void);
+-
+-/******************************************************************************/
+-/*** Unimplemented Cache functionality                                      ***/
+-/******************************************************************************/
+-#define preDcacheInvalidateBlockMark()
+-#define postDcacheInvalidateBlockMark()
+-#define DcacheZeroBlock(p, l)           fast_bzero((char *)(p), (long)(l))
+-#define loadDcacheInvalidateBlock()     ASSERT(!"Not Implemented on V4e")
+-#define IcacheInvalidateBlock()         ASSERT(!"Not Implemented on V4e")
+-
+-/******************************************************************************/
+-/*** Redundant Cache functionality on ColdFire                              ***/
+-/******************************************************************************/
+-#define DcacheInvalidateBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l)
+-#define DcacheFlushCacheBlock(p, l) DcacheFlushInvalidateCacheBlock(p, l)
+-#define DcacheFlushBlock(p, l)      DcacheFlushInvalidateCacheBlock(p, l)
+-
+-extern void DcacheFlushInvalidateCacheBlock(void *start, unsigned long size);
+-extern void FLASHDcacheFlushInvalidate(void);
+-
++extern unsigned long shadow_cacr;
+ extern void cacr_set(unsigned long x);
+ #endif /* !__ASSEMBLY__ */
diff --git a/target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch b/target/linux/coldfire/patches/024-m5445x_enable_cache_store.patch
new file mode 100644 (file)
index 0000000..e0b9c80
--- /dev/null
@@ -0,0 +1,40 @@
+From 96de11ad11db226423d364a75cc82c6118a18a1f Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 4 Dec 2007 00:04:21 -0700
+Subject: [PATCH] Enable Cache Store Buffer.
+
+LTIBName: m5445x-enable-cache-store
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c |    2 ++
+ include/asm-m68k/cfcache.h  |    1 +
+ 2 files changed, 3 insertions(+), 0 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -21,6 +21,7 @@
+ #include <asm/machdep.h>
+ #include <asm/coldfire.h>
+ #include <asm/cfcache.h>
++#include <asm/cacheflush.h>
+ #include <asm/bootinfo.h>
+ #include <asm/io.h>
+ #include <asm/cfmmu.h>
+@@ -165,6 +166,7 @@ asmlinkage void __init cf_early_init(voi
+               + sizeof(record->data[0]) + sizeof(record->data[1]);
+       /* Invalidate caches via CACR */
++      flush_bcache();
+       cacr_set(CACHE_DISABLE_MODE);
+       /* Turn on caches via CACR, enable EUSP */
+--- a/include/asm-m68k/cfcache.h
++++ b/include/asm-m68k/cfcache.h
+@@ -64,6 +64,7 @@
+ #define CACHE_INITIAL_MODE    (CF_CACR_DEC+           \
+                                CF_CACR_BEC+           \
+                                CF_CACR_IEC+           \
++                               CF_CACR_DESB+          \
+                                CF_CACR_EUSP)
+ #else
+ /* cache disabled for testing */
diff --git a/target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch b/target/linux/coldfire/patches/025-m5445x_usb_autosuspend_delay.patch
new file mode 100644 (file)
index 0000000..39f4e6a
--- /dev/null
@@ -0,0 +1,22 @@
+From 2ff438b85bd3f34f31886883d9dacbd15bc16df8 Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Tue, 4 Dec 2007 11:30:14 -0700
+Subject: [PATCH] USB: restore usb_autosuspend_delay
+
+LTIBName: m5445x-usb-autosuspend-delay
+Signed-off-by: Duck <duck@freescale.com>
+---
+ drivers/usb/core/usb.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -52,7 +52,7 @@ static int nousb;    /* Disable USB when bu
+ struct workqueue_struct *ksuspend_usb_wq;
+ #ifdef        CONFIG_USB_SUSPEND
+-static int usb_autosuspend_delay = -1;                /* Default delay value,
++static int usb_autosuspend_delay = 2;         /* Default delay value,
+                                                * in seconds */
+ module_param_named(autosuspend, usb_autosuspend_delay, int, 0644);
+ MODULE_PARM_DESC(autosuspend, "default autosuspend delay");
diff --git a/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch b/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch
new file mode 100644 (file)
index 0000000..634e9df
--- /dev/null
@@ -0,0 +1,470 @@
+From b014a8a0b66b1f0f55b3384f586f43e67e6dcc5d Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Tue, 4 Dec 2007 16:03:17 -0700
+Subject: [PATCH] USB: cleanup
+
+LTIBName: m5445x-usb-cleanup-2
+Signed-off-by: Duck <duck@freescale.com>
+---
+ drivers/usb/gadget/mcf5445x_udc.c |   14 ---
+ drivers/usb/host/ehci-arc.c       |   19 +---
+ drivers/usb/otg/fsl_otg.c         |  225 ++-----------------------------------
+ drivers/usb/otg/otg_fsm.h         |    2 +-
+ include/linux/usb/fsl_usb2.h      |    5 +-
+ 5 files changed, 15 insertions(+), 250 deletions(-)
+
+--- a/drivers/usb/gadget/mcf5445x_udc.c
++++ b/drivers/usb/gadget/mcf5445x_udc.c
+@@ -321,11 +321,6 @@ static void pullup_enable(struct fsl_udc
+       temp = fsl_readl(&dr_regs->usbcmd);
+       temp |= USB_CMD_RUN_STOP;
+       fsl_writel(temp, &dr_regs->usbcmd);
+-
+-#ifdef NEVER /* DDD FIXME: we want this? */
+-      if (!udc->transceiver)
+-              *((u16 *)(MCF_FBCS1_CSAR)) &= ~0x1; /* Enable pullup register */
+-#endif
+ }
+ static void pullup_disable(struct fsl_udc *udc)
+@@ -345,12 +340,6 @@ static void pullup_disable(struct fsl_ud
+       tmp = fsl_readl(&dr_regs->usbcmd);
+       tmp &= ~USB_CMD_RUN_STOP;
+       fsl_writel(tmp, &dr_regs->usbcmd);
+-
+-#ifdef NEVER /* DDD FIXME: we want this? */
+-      if (!udc->transceiver)
+-              *((u16 *)(MCF_FBCS1_CSAR)) |= 0x1; /* Disable pullup register */
+-#endif
+-
+ }
+ static void dr_controller_run(struct fsl_udc *udc)
+@@ -2598,9 +2587,6 @@ static int __init fsl_udc_probe(struct p
+               ret = -ENOMEM;
+               goto err4;
+       }
+-#if 0 // DDD why this? hoarks OTG host
+-      pullup_disable(udc);
+-#endif
+       create_proc_file();
+       return 0;
+--- a/drivers/usb/host/ehci-arc.c
++++ b/drivers/usb/host/ehci-arc.c
+@@ -378,25 +378,14 @@ static int ehci_fsl_drv_resume(struct pl
+       memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs));
+-#if 0 // DDD test
+-      ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
+-      printk("set portsc %08x  %08x\n", usb_ehci_portsc,
+-              ehci_readl(ehci,  &ehci->regs->port_status[0]));
+-      printk("set usbmode %08x\n", 
+-              ehci_readl(ehci,  &ehci->regs + FSL_SOC_USB_USBMODE));
+-
+       tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
+       ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
+-#else
+-      tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
+-      ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
+-      printk("tmp %08x  set usbmode %08x\n", tmp,
+-              ehci_readl(ehci,  hcd->regs + FSL_SOC_USB_USBMODE));
++      pr_debug("tmp %08x  set usbmode %08x\n", tmp,
++               ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE));
+       ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]);
+-      printk("set portsc %08x  %08x\n", usb_ehci_portsc,
+-              ehci_readl(ehci,  &ehci->regs->port_status[0]));
+-#endif
++      pr_debug("set portsc %08x  %08x\n", usb_ehci_portsc,
++               ehci_readl(ehci, &ehci->regs->port_status[0]));
+       set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
+       hcd->state = HC_STATE_RUNNING;
+--- a/drivers/usb/otg/fsl_otg.c
++++ b/drivers/usb/otg/fsl_otg.c
+@@ -98,6 +98,7 @@ static struct fsl_otg_config fsl_otg_ini
+       .otg_port = 1,
+ };
++#if 0
+ static void dump_state(const char *string, struct otg_fsm *fsm)
+ {
+       printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string,
+@@ -135,6 +136,7 @@ static void dump_state(const char *strin
+       printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld);
+       printk(KERN_DEBUG "\tid: %d\n", fsm->id);
+ }
++#endif
+ /* Routines to access transceiver ULPI registers */
+@@ -537,6 +539,7 @@ int fsl_otg_start_gadget(struct otg_fsm 
+       return 0;
+ }
++#if 0
+ static void fsl_otg_enable(struct otg_transceiver *otg_p)
+ {
+       struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
+@@ -549,7 +552,7 @@ static void fsl_otg_enable(struct otg_tr
+       otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK;
+       otg_sc &= ~OTGSC_IE_1ms_TIMER;
+       otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE;
+-      otg_sc |= OTGSC_IE_USB_ID;      /* DDD added this */
++      otg_sc |= OTGSC_IE_USB_ID;
+       fsl_writel(otg_sc, &usb_dr_regs->otgsc);
+       fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
+@@ -570,6 +573,7 @@ static void fsl_otg_enable(struct otg_tr
+       fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0;
+       fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0;
+ }
++#endif
+ /*
+  * Called by initialization code of host driver.  Register host controller
+@@ -577,34 +581,6 @@ static void fsl_otg_enable(struct otg_tr
+  */
+ static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host)
+ {
+-#if 0 // DDD beta-final
+-      struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
+-      struct device *dev = host->controller;
+-
+-      if (!otg_p || otg_dev != fsl_otg_dev)
+-              return -ENODEV;
+-
+-      otg_p->host = host;
+-      otg_p->host->is_b_host = otg_dev->fsm.id;
+-
+-      otg_dev->fsm.a_bus_drop = 0;
+-      otg_dev->fsm.a_bus_req = 1;
+-
+-      otg_p->host->otg_port = fsl_otg_initdata.otg_port;
+-
+-      if (dev && dev->driver) {
+-              VDBG("suspending host\n");
+-              dev->driver->suspend(dev, PMSG_SUSPEND);
+-              otg_dev->host_working = 0;
+-              VDBG("back\n");
+-      }
+-
+-
+-      /* dump_state("set_host running statemachine", &otg_dev->fsm); DDD */
+-      otg_statemachine(&otg_dev->fsm);
+-
+-      return 0;
+-#else
+       struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg);
+       if (!otg_p || otg_dev != fsl_otg_dev)
+@@ -644,7 +620,6 @@ static int fsl_otg_set_host(struct otg_t
+       otg_statemachine(&otg_dev->fsm);
+       return 0;
+-#endif
+ }
+ /* Called by initialization code of udc.  Register udc to OTG.*/
+@@ -673,12 +648,6 @@ static int fsl_otg_set_peripheral(struct
+       otg_dev->fsm.b_bus_req = 1;
+-#if 0 /* DDD uClinux */
+-      if (otg_p->host) {
+-              fsl_otg_enable(otg_p);
+-              otg_statemachine(&otg_dev->fsm);
+-      }
+-#endif
+       /* start the gadget right away if the ID pin says Mini-B */
+       DBG("ID pin=%d\n", otg_dev->fsm.id);
+       if (otg_dev->fsm.id == 1) {
+@@ -815,162 +784,6 @@ irqreturn_t fsl_otg_isr(int irq, void *d
+ }
+-#if 0 // DDD feta-final
+-irqreturn_t foo_fsl_otg_isr(int irq, void *dev_id)
+-{
+-      struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm;
+-      struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg;
+-      u32 otg_int_src, usb_int_src, otg_sc;
+-      int trigger = 0;
+-      int tmp;
+-
+-      usb_int_src = fsl_readl(&usb_dr_regs->usbsts);
+-      otg_sc = fsl_readl(&usb_dr_regs->otgsc);
+-      otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8);
+-
+-      /* Only clear otg interrupts */
+-      fsl_writel(otg_sc, &usb_dr_regs->otgsc);
+-
+-      /*FIXME: ID change not generate when init to 0 */
+-      /* process OTG interrupts */
+-      if (otg_int_src) {
+-              VDBG("\nOTG irq 0x%08x\n", otg_int_src);
+-              if (otg_int_src & OTGSC_INTSTS_1MS_TIMER)
+-                      trigger = fsl_otg_tick_timer();
+-
+-              if (otg_int_src & OTGSC_INTSTS_USB_ID) {
+-                      fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0;
+-                      otg->default_a = (fsm->id == 0);
+-                      if (otg->host)
+-                              otg->host->is_b_host = fsm->id;
+-                      if (otg->gadget)
+-                              otg->gadget->is_a_peripheral = !fsm->id;
+-                      VDBG("IRQ=ID now=%d\n", fsm->id);
+-
+-                      if (fsm->id) {  /* switch to gadget */
+-                              schedule_delayed_work(&((struct fsl_otg *)
+-                                                      dev_id)->otg_event, 25);
+-                      } else {        /* switch to host */
+-                              cancel_delayed_work(&
+-                                                  ((struct fsl_otg *)dev_id)->
+-                                                  otg_event);
+-                              fsl_otg_start_gadget(fsm, 0);
+-                              fsl_otg_drv_vbus(1);
+-                              fsl_otg_start_host(fsm, 1);
+-                      }
+-
+-                      return IRQ_HANDLED;
+-              }
+-              if (otg_int_src & OTGSC_INTSTS_DATA_PULSE) {
+-                      fsm->a_srp_det = 1;
+-                      trigger = 1;
+-                      VDBG("!!!!Data pulse int\n");
+-              }
+-              if (otg_int_src & OTGSC_INTSTS_A_SESSION_VALID) {
+-                      fsm->a_sess_vld =
+-                          (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0;
+-                      /* detect VBUS pulsing */
+-                      if ((fsm->transceiver->state == OTG_STATE_A_IDLE)
+-                          && fsm->a_sess_vld)
+-                              fsm->a_srp_det = 1;
+-                      trigger = 1;
+-                      VDBG("!!!a_sess_vld int state=%d\n", fsm->a_sess_vld);
+-              }
+-              if (otg_int_src & OTGSC_INTSTS_A_VBUS_VALID) {
+-                      fsm->a_vbus_vld = !!(otg_sc & OTGSC_STS_A_VBUS_VALID);
+-                      trigger = 1;
+-                      VDBG("!!!a_vbus_vld int state=%d\n", fsm->a_vbus_vld);
+-
+-#if 1
+-              if ((fsm->a_vbus_vld == 0) && (fsm->id == 0)) {
+-                      if (fsm->transceiver->state != OTG_STATE_A_WAIT_VFALL)
+-                              /* Warning insted of transfer to Error state. */
+-                              printk(KERN_WARNING "ulpi: The USB Device is "
+-                                     "sinking too much current!!\n");
+-                      fsm->a_vbus_vld = 1;
+-              }
+-#endif
+-
+-
+-              }
+-              if (otg_int_src & OTGSC_INTSTS_B_SESSION_VALID) {
+-                      fsm->b_sess_vld =
+-                          (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0;
+-                      trigger = 1;
+-                      /* SRP done */
+-                      if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) &&
+-                          fsm->b_sess_vld && srp_wait_done)
+-                              fsm->b_srp_done = 1;
+-                      VDBG("!!!!b_sess_vld int state=%d\n", fsm->b_sess_vld);
+-              }
+-              if (otg_int_src & OTGSC_INTSTS_B_SESSION_END) {
+-                      fsm->b_sess_end =
+-                          (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0;
+-                      trigger = 1;
+-                      VDBG("!!!!b_sess_end int state=%d\n", fsm->b_sess_end);
+-              }
+-      }
+-
+-      /* process USB interrupts */
+-      if ((usb_int_src & USB_STS_PORT_CHANGE)
+-          && (fsm->protocol == PROTO_HOST)) {
+-              VDBG("\nUSB irq A 0x%08x\n", usb_int_src);
+-              /* Device resume do not generate statemachine change */
+-              if (fsl_readl(&usb_dr_regs->portsc1) &
+-                  PORTSCX_PORT_FORCE_RESUME) {
+-                      if (otg->default_a) {
+-                              fsm->b_bus_resume = 1;
+-                              trigger = 1;
+-                      } else {
+-                              fsm->a_bus_resume = 1;
+-                              trigger = 1;
+-                      }
+-              }
+-
+-              tmp = (fsl_readl(&usb_dr_regs->portsc1) &
+-                     PORTSCX_CURRENT_CONNECT_STATUS) ? 1 : 0;
+-              if (otg->default_a && (fsm->b_conn != tmp)) {
+-                      fsm->b_conn = tmp;
+-                      trigger = 1;
+-              } else if (!otg->default_a && (fsm->a_conn != tmp)) {
+-                      fsm->a_conn = tmp;
+-                      trigger = 1;
+-              }
+-      }
+-      /* Workaround: sometimes CSC bit will lost.  We change to
+-       * polling CCS bit for connect change */
+-      if (fsm->protocol == PROTO_GADGET) {
+-              if (usb_int_src & USB_STS_SUSPEND) {
+-                      VDBG("\nUSB irq B 0x%08x\n", usb_int_src);
+-                      VDBG("peripheral detected suspend\n");
+-                      if (otg->default_a)
+-                              /* A-device detects B suspend */
+-                              fsm->b_bus_suspend = 1;
+-                      else
+-                              /* B-device detects A suspend */
+-                              fsm->a_bus_suspend = 1;
+-                      trigger = 1;
+-              } else if (usb_int_src & USB_STS_PORT_CHANGE) {
+-                      VDBG("\nUSB irq C 0x%08x\n", usb_int_src);
+-                      VDBG("peripheral resumed\n");
+-                      if (otg->default_a)
+-                              fsm->b_bus_suspend = 0;
+-                      else
+-                              fsm->a_bus_suspend = 0;
+-                      trigger = 1;
+-              }
+-      }
+-
+-      /* Invoke statemachine until state is stable */
+-      while (trigger) {
+-              trigger = otg_statemachine(fsm);
+-      }
+-
+-      return IRQ_HANDLED;
+-}
+-#endif
+-
+-
+ static struct otg_fsm_ops fsl_otg_ops = {
+       .chrg_vbus = fsl_otg_chrg_vbus,
+       .drv_vbus = fsl_otg_drv_vbus,
+@@ -1003,7 +816,6 @@ int fsl_otg_cfg(struct platform_device *
+       if (!fsl_otg_tc)
+               return -ENODEV;
+-#if 1 // DDD
+       if (pdata->regs) {
+               fsl_otg_tc->dr_mem_map = pdata->regs;
+       } else {
+@@ -1013,8 +825,10 @@ int fsl_otg_cfg(struct platform_device *
+                       return -ENODEV;
+               }
++              /*
+               printk("DDD %s(): rsrc_start=0x%x  rsrc_len=0x%x\n",
+                    __FUNCTION__, res->start, res->end - res->start + 1);
++              */
+               if (!request_mem_region(res->start, res->end - res->start + 1,
+                                       "OTG")) {
+@@ -1026,7 +840,6 @@ int fsl_otg_cfg(struct platform_device *
+       }
+       DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map);
+-#endif 
+       INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event);
+       INIT_LIST_HEAD(&active_timers);
+@@ -1035,12 +848,11 @@ int fsl_otg_cfg(struct platform_device *
+       /* Set OTG state machine operations */
+       fsl_otg_tc->fsm.ops = &fsl_otg_ops;
+-#if 1 /* DDD */
+       /* record initial state of ID pin */
+       fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID)
+           ? 1 : 0;
+       DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id);
+-#endif
++
+       /* initialize the otg structure */
+       fsl_otg_tc->otg.label = DRIVER_DESC;
+       fsl_otg_tc->otg.set_host = fsl_otg_set_host;
+@@ -1115,13 +927,8 @@ int usb_otg_start(struct platform_device
+                       __FUNCTION__, timeout);
+       /* configure the VBUSHS as IDLE(both host and device) */
+-#if 0
+-      /* DDD really have to check into setting the following */
+-      fsl_writel(USB_MODE_STREAM_DISABLE, &usb_dr_regs->usbmode);
+-#else
+       temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0);
+       fsl_writel(temp, &usb_dr_regs->usbmode);
+-#endif
+       /* configure PHY interface */
+       temp = fsl_readl(&usb_dr_regs->portsc1);
+@@ -1135,24 +942,11 @@ int usb_otg_start(struct platform_device
+       /* disable all interrupt and clear all OTGSC status */
+       temp = fsl_readl(&usb_dr_regs->otgsc);
+       temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK;
+-#if 0 // DDD
+-      /* DDD only want ID int
+-       * temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
+-       */
+-      temp |= OTGSC_IE_USB_ID;        /* DDD added this */
+-      temp &= ~OTGSC_IE_1ms_TIMER;    /* DDD added this */
+-#else
+       temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE;
+-#endif
+       fsl_writel(temp, &usb_dr_regs->otgsc);
+       fsl_otg_drv_vbus(0);
+-#if 0 // DDD beta-final
+-      temp = fsl_readl(&usb_dr_regs->otgsc);
+-      temp |= OTGSC_IE_A_SESSION_VALID;
+-      fsl_writel(temp, &usb_dr_regs->otgsc);
+-#else
+       /*
+        * The identification (id) input is FALSE when a Mini-A plug is inserted
+        * in the devices Mini-AB receptacle. Otherwise, this input is TRUE.
+@@ -1173,7 +967,6 @@ int usb_otg_start(struct platform_device
+       temp |= OTGSC_IE_USB_ID;
+       temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER);
+       fsl_writel(temp, &usb_dr_regs->otgsc);
+-#endif
+       return 0;
+ }
+@@ -1427,10 +1220,8 @@ static int __init fsl_otg_probe(struct p
+               return -ENOMEM;
+       pdata = pdev->dev.platform_data;
+-#if 1 // DDD do this elsewhere
+       /* Initialize the clock, multiplexing pin and PHY interface */
+       board_init(pdev);
+-#endif
+       /* configure the OTG */
+       status = fsl_otg_cfg(pdev);
+--- a/drivers/usb/otg/otg_fsm.h
++++ b/drivers/usb/otg/otg_fsm.h
+@@ -18,7 +18,7 @@
+ #ifndef OTG_FSM_H
+ #define OTG_FSM_H
+-#if 1
++#if 0
+ #define DEBUG         1
+ #define VERBOSE       1
+ #endif
+--- a/include/linux/usb/fsl_usb2.h
++++ b/include/linux/usb/fsl_usb2.h
+@@ -104,9 +104,8 @@ struct fsl_usb_host_regs {
+ #if 0
+       u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */
+ #else
+-      // DDD: do these exits in the host register set??
+-      // DDD see DCCPARAMS:DEN for the real number of device endpoints
+-      // DDD 16 is the max
++      /* DDD see DCCPARAMS:DEN for the real number of device endpoints */
++      /* DDD 16 is the max */
+       u32 endptctrl[16];      /* Endpoint Control Registers */
+ #endif
+ };
diff --git a/target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch b/target/linux/coldfire/patches/027-m5445x_usb_sdram_priority.patch
new file mode 100644 (file)
index 0000000..e75f092
--- /dev/null
@@ -0,0 +1,130 @@
+From b6b6d18a54e22784cb48e1953201484830d030e4 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 6 Dec 2007 14:17:46 -0700
+Subject: [PATCH] Change USB to SDRAM priority.
+
+Increase the USB priority to the maximum, above ColdfireCore,
+in the SDRAM crossbar switch.  This fixes the issues with the
+USB core not being able to transfer to memory fast enough to
+keep up with HS.
+
+LTIBName: m5445x-usb-sdram-priority
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c     |   12 ++++++
+ include/asm-m68k/mcf5445x_xbs.h |   81 +++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 93 insertions(+), 0 deletions(-)
+ create mode 100644 include/asm-m68k/mcf5445x_xbs.h
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -36,6 +36,7 @@
+ #include <asm/mcf5445x_sdramc.h>
+ #include <asm/mcf5445x_fbcs.h>
+ #include <asm/mcf5445x_dtim.h>
++#include <asm/mcf5445x_xbs.h>
+ /* JKM -- testing */
+ #include <linux/pfn.h>
+@@ -131,6 +132,17 @@ asmlinkage void __init cf_early_init(voi
+       MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B;
+ #endif
++      /* Setup SDRAM crossbar(XBS) priorities */
++printk(KERN_INFO "Bumping USB Priority\n");
++      MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) |
++                      MCF_XBS_PRS_M1(MCF_XBS_PRI_3) |
++                      MCF_XBS_PRS_M2(MCF_XBS_PRI_4) |
++                      MCF_XBS_PRS_M3(MCF_XBS_PRI_5) |
++                      MCF_XBS_PRS_M5(MCF_XBS_PRI_6) |
++                      MCF_XBS_PRS_M6(MCF_XBS_PRI_1) |
++                      MCF_XBS_PRS_M7(MCF_XBS_PRI_7));
++      
++
+       m68k_machtype = MACH_CFMMU;
+       m68k_fputype = FPU_CFV4E;
+       m68k_mmutype = MMU_CFV4E;
+--- /dev/null
++++ b/include/asm-m68k/mcf5445x_xbs.h
+@@ -0,0 +1,81 @@
++/*
++ * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007
++ *
++ * 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.
++ */
++
++#ifndef __MCF5445X_XBS_H__
++#define __MCF5445X_XBS_H__
++
++/*
++ * Crossbar Switch (XBS)
++ */
++
++/* Register read/write macros */
++#define MCF_XBS_PRS1          MCF_REG32(0xFC004100) /* Flexbus Priority */
++#define MCF_XBS_CRS1          MCF_REG32(0xFC004110) /* Flexbus Control */
++#define MCF_XBS_PRS2          MCF_REG32(0xFC004200) /* SDRam Priority */
++#define MCF_XBS_CRS2          MCF_REG32(0xFC004210) /* SDRam Control */
++#define MCF_XBS_PRS3          MCF_REG32(0xFC004300) /* ATA Priority */
++#define MCF_XBS_CRS3          MCF_REG32(0xFC004310) /* ATA Control */
++#define MCF_XBS_PRS4          MCF_REG32(0xFC004400) /* SRAM Priority */
++#define MCF_XBS_CRS4          MCF_REG32(0xFC004410) /* SRAM Control */
++#define MCF_XBS_PRS5          MCF_REG32(0xFC004500) /* PCI Priority */
++#define MCF_XBS_CRS5          MCF_REG32(0xFC004510) /* PCI Control */
++#define MCF_XBS_PRS6          MCF_REG32(0xFC004600) /* Slave6 Priority */
++#define MCF_XBS_CRS6          MCF_REG32(0xFC004610) /* Slave6 Control */
++#define MCF_XBS_PRS7          MCF_REG32(0xFC004700) /* Other Priority */
++#define MCF_XBS_CRS7          MCF_REG32(0xFC004710) /* Other Control */
++
++/* Priorities */
++#define MCF_XBS_PRI_1         0       /* Level 1 (highest) */
++#define MCF_XBS_PRI_2         1       /* Level 2 */
++#define MCF_XBS_PRI_3         2       /* Level 3 */
++#define MCF_XBS_PRI_4         3       /* Level 4 */
++#define MCF_XBS_PRI_5         4       /* Level 5 */
++#define MCF_XBS_PRI_6         5       /* Level 6 */
++#define MCF_XBS_PRI_7         6       /* Level 7 (lowest) */
++#define MCF_XBS_PRI_MASK      7       /* Mask (Not a valid level) */
++
++/* Priority Register (PRSn) Defs */
++#define       MCF_XBS_PRS_MACRO(m,p)  ((p)<<((m)<<2))
++#define       MCF_XBS_PRS_M0(p)       MCF_XBS_PRS_MACRO(0, p) /* Coldfire Core */
++#define       MCF_XBS_PRS_M1(p)       MCF_XBS_PRS_MACRO(1, p) /* eDMA */
++#define       MCF_XBS_PRS_M2(p)       MCF_XBS_PRS_MACRO(2, p) /* FEC0 */
++#define       MCF_XBS_PRS_M3(p)       MCF_XBS_PRS_MACRO(3, p) /* FEC1 */
++#define       MCF_XBS_PRS_M4(p)       MCF_XBS_PRS_MACRO(4, p) /* Master 4 */
++#define       MCF_XBS_PRS_M5(p)       MCF_XBS_PRS_MACRO(5, p) /* PCI */
++#define       MCF_XBS_PRS_M6(p)       MCF_XBS_PRS_MACRO(6, p) /* USB OTG */
++#define       MCF_XBS_PRS_M7(p)       MCF_XBS_PRS_MACRO(7, p) /* Serial Boot */
++
++/* Control Register (CRSn) Defs */
++#define MCF_XBS_CRS_RO                0x80000000      /* Read Only */
++#define       MCF_XBS_CRS_ARB         0x00000100      /* Arbitration Mode */
++#define       MCF_XBS_CRS_PCTL        0x00000030      /* Parking Control */
++#define       MCF_XBS_CRS_PARK        0x00000007      /* Park Location */
++
++/* MCF_XBS_CRS_ARB Defs */
++#define MCF_ABS_CRS_ARB_FIXED 0x00000000      /* Fixed priority */
++#define MCF_ABS_CRS_ARB_ROUND 0x00000100      /* Round Robin priority */
++
++/* MCF_XBS_CRS_PCTL Defs */
++#define MCF_ABS_CRS_PCTL_PARK 0x00000000      /* Park on the defined PARK */
++#define MCF_ABS_CRS_PCTL_LAST         0x00000010      /* Park on the last master */
++#define MCF_ABS_CRS_PCTL_NONE         0x00000020      /* Don't park */
++
++/* MCF_XBS_CRS_PARK Defs */
++#define MCF_ABS_CRS_PARK_M0   0x00000000      /* Park on Coldfire Core */
++#define MCF_ABS_CRS_PARK_M1   0x00000001      /* Park on eDMA */
++#define MCF_ABS_CRS_PARK_M2   0x00000002      /* Park on FEC0 */
++#define MCF_ABS_CRS_PARK_M3   0x00000003      /* Park on FEC1 */
++#define MCF_ABS_CRS_PARK_M4   0x00000004      /* Park on Reserved */
++#define MCF_ABS_CRS_PARK_M5   0x00000005      /* Park on PCI */
++#define MCF_ABS_CRS_PARK_M6   0x00000006      /* Park on USB OTG */
++#define MCF_ABS_CRS_PARK_M7   0x00000007      /* Park on Serial Boot */
++
++#endif /* __MCF5445X_XBS_H__ */
diff --git a/target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch b/target/linux/coldfire/patches/028-mcfv4e_cache_ck_0_len.patch
new file mode 100644 (file)
index 0000000..a160f56
--- /dev/null
@@ -0,0 +1,55 @@
+From 679a5be6f06b909adccc9c588feb26bf6d6df402 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 6 Dec 2007 16:40:39 -0700
+Subject: [PATCH] Add zero length checking to cache routines.
+
+LTIBName: mcfv4e-cache-ck-0-len
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/cf_cacheflush.h |   14 +++++++++++---
+ 1 files changed, 11 insertions(+), 3 deletions(-)
+
+--- a/include/asm-m68k/cf_cacheflush.h
++++ b/include/asm-m68k/cf_cacheflush.h
+@@ -127,7 +127,9 @@ static inline void flush_bcache(void)
+ static inline void cf_cache_clear(unsigned long paddr, int len)
+ {
+       /* number of lines */
+-      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
+       /* align on set boundary */
+       paddr &= 0xfffffff0;
+@@ -161,7 +163,9 @@ static inline void cf_cache_clear(unsign
+ static inline void cf_cache_push(unsigned long paddr, int len)
+ {
+       /* number of lines */
+-      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
+       /* align on set boundary */
+       paddr &= 0xfffffff0;
+@@ -195,7 +199,9 @@ static inline void cf_cache_push(unsigne
+ static inline void cf_cache_flush(unsigned long paddr, int len)
+ {
+       /* number of lines */
+-      len =  (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
+       /* align on set boundary */
+       paddr &= 0xfffffff0;
+@@ -234,6 +240,8 @@ static inline void cf_cache_flush_range(
+       vstart &= 0xfffffff0;
+       vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
+       len = vend - vstart;
++      if (len == 0)
++              return;
+       vstart = __pa(vstart);
+       vend = vstart + len;
diff --git a/target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch b/target/linux/coldfire/patches/029-m5445x_usb_disable_debug.patch
new file mode 100644 (file)
index 0000000..fa74786
--- /dev/null
@@ -0,0 +1,22 @@
+From d6cd1bb1f60f790f8a5d410cfe40bfb344dde09b Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Thu, 6 Dec 2007 17:22:23 -0700
+Subject: [PATCH] USB: gadget: turn off DEBUG
+
+LTIBName: m5445x-usb-disable-debug
+Signed-off-by: Duck <duck@freescale.com>
+---
+ drivers/usb/gadget/mcf5445x_udc.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/drivers/usb/gadget/mcf5445x_udc.c
++++ b/drivers/usb/gadget/mcf5445x_udc.c
+@@ -34,7 +34,7 @@
+  *
+  */
+-#define DEBUG
++#undef DEBUG
+ #undef VERBOSE
+ #include <linux/module.h>
diff --git a/target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch b/target/linux/coldfire/patches/030-m5445x_usb_add_dualspeed.patch
new file mode 100644 (file)
index 0000000..d2ffa69
--- /dev/null
@@ -0,0 +1,21 @@
+From 5fb2a68befbec97dba2264b2834487c72f47095d Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Wed, 5 Dec 2007 14:43:19 -0700
+Subject: [PATCH] USB: add is_dualspeed.
+
+LTIBName: m5445x-usb-add-dualspeed
+Signed-off-by: Duck <duck@freescale.com>
+---
+ drivers/usb/gadget/mcf5445x_udc.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+--- a/drivers/usb/gadget/mcf5445x_udc.c
++++ b/drivers/usb/gadget/mcf5445x_udc.c
+@@ -2538,6 +2538,7 @@ static int __init fsl_udc_probe(struct p
+        * set the fsl_udc->gadget.xxx
+        */
+       udc->gadget.ops = &fsl_gadget_ops;
++      udc->gadget.is_dualspeed = 1;
+       /* gadget.ep0 is a pointer */
+       udc->gadget.ep0 = &udc->eps[0].ep;
diff --git a/target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch b/target/linux/coldfire/patches/031-m5445x_usb_defconfig.patch
new file mode 100644 (file)
index 0000000..e39f03f
--- /dev/null
@@ -0,0 +1,273 @@
+From 023b850e67316fbf595bf0cda13f02fabca1f29d Mon Sep 17 00:00:00 2001
+From: Bruce Schmid <duck@freescale.com>
+Date: Fri, 7 Dec 2007 10:30:46 -0700
+Subject: [PATCH] USB: add default USB settings
+
+LTIBName: m5445x-usb-defconfig
+Signed-off-by: Duck <duck@freescale.com>
+---
+ arch/m68k/configs/m54455evb_defconfig |  175 +++++++++++++++++++++++++++++++--
+ 1 files changed, 165 insertions(+), 10 deletions(-)
+
+--- a/arch/m68k/configs/m54455evb_defconfig
++++ b/arch/m68k/configs/m54455evb_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+ # Linux kernel version: 2.6.23
+-# Tue Nov 27 23:42:38 2007
++# Thu Dec  6 12:14:18 2007
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -347,6 +347,7 @@ CONFIG_BLK_DEV=y
+ CONFIG_BLK_DEV_LOOP=y
+ # CONFIG_BLK_DEV_CRYPTOLOOP is not set
+ # CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_UB is not set
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=64000
+@@ -361,7 +362,7 @@ CONFIG_MISC_DEVICES=y
+ # SCSI device support
+ #
+ # CONFIG_RAID_ATTRS is not set
+-CONFIG_SCSI=m
++CONFIG_SCSI=y
+ CONFIG_SCSI_DMA=y
+ # CONFIG_SCSI_TGT is not set
+ # CONFIG_SCSI_NETLINK is not set
+@@ -370,7 +371,7 @@ CONFIG_SCSI_PROC_FS=y
+ #
+ # SCSI support type (disk, tape, CD-ROM)
+ #
+-CONFIG_BLK_DEV_SD=m
++CONFIG_BLK_DEV_SD=y
+ # CONFIG_CHR_DEV_ST is not set
+ # CONFIG_CHR_DEV_OSST is not set
+ # CONFIG_BLK_DEV_SR is not set
+@@ -380,7 +381,7 @@ CONFIG_BLK_DEV_SD=m
+ #
+ # Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+ #
+-# CONFIG_SCSI_MULTI_LUN is not set
++CONFIG_SCSI_MULTI_LUN=y
+ # CONFIG_SCSI_CONSTANTS is not set
+ # CONFIG_SCSI_LOGGING is not set
+ # CONFIG_SCSI_SCAN_ASYNC is not set
+@@ -420,6 +421,26 @@ CONFIG_NETDEV_10000=y
+ #
+ # CONFIG_WLAN_PRE80211 is not set
+ # CONFIG_WLAN_80211 is not set
++
++#
++# USB Network Adapters
++#
++# CONFIG_USB_CATC is not set
++# CONFIG_USB_KAWETH is not set
++CONFIG_USB_PEGASUS=m
++CONFIG_USB_RTL8150=m
++CONFIG_USB_USBNET_MII=m
++CONFIG_USB_USBNET=m
++CONFIG_USB_NET_AX8817X=m
++CONFIG_USB_NET_CDCETHER=m
++# CONFIG_USB_NET_DM9601 is not set
++# CONFIG_USB_NET_GL620A is not set
++# CONFIG_USB_NET_NET1080 is not set
++# CONFIG_USB_NET_PLUSB is not set
++# CONFIG_USB_NET_MCS7830 is not set
++# CONFIG_USB_NET_RNDIS_HOST is not set
++# CONFIG_USB_NET_CDC_SUBSET is not set
++# CONFIG_USB_NET_ZAURUS is not set
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+@@ -446,13 +467,19 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+ # CONFIG_INPUT_JOYDEV is not set
+ # CONFIG_INPUT_TSDEV is not set
+-# CONFIG_INPUT_EVDEV is not set
++CONFIG_INPUT_EVDEV=y
+ # CONFIG_INPUT_EVBUG is not set
+ #
+ # Input Device Drivers
+ #
+-# CONFIG_INPUT_KEYBOARD is not set
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ATKBD is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
+ # CONFIG_INPUT_MOUSE is not set
+ # CONFIG_INPUT_JOYSTICK is not set
+ # CONFIG_INPUT_TABLET is not set
+@@ -534,6 +561,7 @@ CONFIG_SPI_COLDFIRE_SSI_AUDIO=y
+ # CONFIG_VIDEO_DEV is not set
+ # CONFIG_DVB_CORE is not set
+ CONFIG_DAB=y
++# CONFIG_USB_DABUSB is not set
+ #
+ # Graphics support
+@@ -560,19 +588,144 @@ CONFIG_DUMMY_CONSOLE=y
+ CONFIG_HID_SUPPORT=y
+ CONFIG_HID=y
+ CONFIG_HID_DEBUG=y
++
++#
++# USB Input Devices
++#
++CONFIG_USB_HID=y
++# CONFIG_USB_HIDINPUT_POWERBOOK is not set
++# CONFIG_HID_FF is not set
++# CONFIG_USB_HIDDEV is not set
+ CONFIG_USB_SUPPORT=y
+-# CONFIG_USB_ARCH_HAS_HCD is not set
++CONFIG_USB_ARCH_HAS_HCD=y
+ # CONFIG_USB_ARCH_HAS_OHCI is not set
+-# CONFIG_USB_ARCH_HAS_EHCI is not set
++CONFIG_USB_ARCH_HAS_EHCI=y
++CONFIG_USB=y
++# CONFIG_USB_DEBUG is not set
++
++#
++# Miscellaneous USB options
++#
++CONFIG_USB_DEVICEFS=y
++# CONFIG_USB_DEVICE_CLASS is not set
++# CONFIG_USB_DYNAMIC_MINORS is not set
++# CONFIG_USB_OTG is not set
++
++#
++# USB Host Controller Drivers
++#
++CONFIG_USB_EHCI_HCD=m
++CONFIG_USB_EHCI_SPLIT_ISO=y
++CONFIG_USB_EHCI_ROOT_HUB_TT=y
++# CONFIG_USB_EHCI_TT_NEWSCHED is not set
++CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
++CONFIG_USB_EHCI_BIG_ENDIAN_DESC=y
++# CONFIG_USB_ISP116X_HCD is not set
++# CONFIG_USB_SL811_HCD is not set
++# CONFIG_USB_R8A66597_HCD is not set
++CONFIG_USB_M5445X_ULPI=y
++# CONFIG_USB_M5445X_FSLS is not set
++
++#
++# USB Device Class drivers
++#
++# CONFIG_USB_ACM is not set
++# CONFIG_USB_PRINTER is not set
+ #
+ # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+ #
+ #
++# may also be needed; see USB_STORAGE Help for more information
++#
++CONFIG_USB_STORAGE=y
++# CONFIG_USB_STORAGE_DEBUG is not set
++# CONFIG_USB_STORAGE_DATAFAB is not set
++# CONFIG_USB_STORAGE_FREECOM is not set
++# CONFIG_USB_STORAGE_DPCM is not set
++# CONFIG_USB_STORAGE_USBAT is not set
++# CONFIG_USB_STORAGE_SDDR09 is not set
++# CONFIG_USB_STORAGE_SDDR55 is not set
++# CONFIG_USB_STORAGE_JUMPSHOT is not set
++# CONFIG_USB_STORAGE_ALAUDA is not set
++# CONFIG_USB_STORAGE_ONETOUCH is not set
++# CONFIG_USB_STORAGE_KARMA is not set
++# CONFIG_USB_LIBUSUAL is not set
++
++#
++# USB Imaging devices
++#
++# CONFIG_USB_MDC800 is not set
++# CONFIG_USB_MICROTEK is not set
++# CONFIG_USB_MON is not set
++
++#
++# USB port drivers
++#
++
++#
++# USB Serial Converter support
++#
++# CONFIG_USB_SERIAL is not set
++
++#
++# USB Miscellaneous drivers
++#
++# CONFIG_USB_EMI62 is not set
++# CONFIG_USB_EMI26 is not set
++# CONFIG_USB_ADUTUX is not set
++# CONFIG_USB_AUERSWALD is not set
++# CONFIG_USB_RIO500 is not set
++# CONFIG_USB_LEGOTOWER is not set
++# CONFIG_USB_LCD is not set
++# CONFIG_USB_BERRY_CHARGE is not set
++# CONFIG_USB_LED is not set
++# CONFIG_USB_CYPRESS_CY7C63 is not set
++# CONFIG_USB_CYTHERM is not set
++# CONFIG_USB_PHIDGET is not set
++# CONFIG_USB_IDMOUSE is not set
++# CONFIG_USB_FTDI_ELAN is not set
++# CONFIG_USB_APPLEDISPLAY is not set
++# CONFIG_USB_SISUSBVGA is not set
++# CONFIG_USB_LD is not set
++# CONFIG_USB_TRANCEVIBRATOR is not set
++# CONFIG_USB_IOWARRIOR is not set
++# CONFIG_USB_TEST is not set
++
++#
++# USB DSL modem support
++#
++
++#
+ # USB Gadget Support
+ #
+-# CONFIG_USB_GADGET is not set
++CONFIG_USB_GADGET=m
++# CONFIG_USB_GADGET_DEBUG is not set
++# CONFIG_USB_GADGET_DEBUG_FILES is not set
++CONFIG_USB_GADGET_SELECTED=y
++# CONFIG_USB_GADGET_AMD5536UDC is not set
++# CONFIG_USB_GADGET_FSL_USB2 is not set
++# CONFIG_USB_GADGET_NET2280 is not set
++# CONFIG_USB_GADGET_PXA2XX is not set
++# CONFIG_USB_GADGET_M66592 is not set
++CONFIG_USB_GADGET_MCF5445X=y
++CONFIG_USB_MCF5445X=m
++# CONFIG_USB_GADGET_GOKU is not set
++# CONFIG_USB_GADGET_LH7A40X is not set
++# CONFIG_USB_GADGET_OMAP is not set
++# CONFIG_USB_GADGET_S3C2410 is not set
++# CONFIG_USB_GADGET_AT91 is not set
++# CONFIG_USB_GADGET_DUMMY_HCD is not set
++CONFIG_USB_GADGET_DUALSPEED=y
++# CONFIG_USB_ZERO is not set
++CONFIG_USB_ETH=m
++CONFIG_USB_ETH_RNDIS=y
++CONFIG_USB_GADGETFS=m
++CONFIG_USB_FILE_STORAGE=m
++# CONFIG_USB_FILE_STORAGE_TEST is not set
++# CONFIG_USB_G_SERIAL is not set
++# CONFIG_USB_MIDI_GADGET is not set
+ # CONFIG_MMC is not set
+ # CONFIG_NEW_LEDS is not set
+ # CONFIG_RTC_CLASS is not set
+@@ -603,7 +756,9 @@ CONFIG_USB_SUPPORT=y
+ #
+ # File systems
+ #
+-# CONFIG_EXT2_FS is not set
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
+ CONFIG_EXT3_FS=y
+ CONFIG_EXT3_FS_XATTR=y
+ # CONFIG_EXT3_FS_POSIX_ACL is not set
diff --git a/target/linux/coldfire/patches/032-m5445x_edma_update.patch b/target/linux/coldfire/patches/032-m5445x_edma_update.patch
new file mode 100644 (file)
index 0000000..17f2bec
--- /dev/null
@@ -0,0 +1,553 @@
+From 7b5b08d99d5362e9c36fd7d42d6c06c2a848266c Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Sun, 9 Dec 2007 02:21:19 -0700
+Subject: [PATCH] Update EDMA.
+
+LTIBName: m5445x-edma-update
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/coldfire_edma.c      |  261 +++++++++++++++++++++++---------------
+ include/asm-m68k/coldfire_edma.h |    9 +-
+ include/asm-m68k/mcf5445x_edma.h |   28 +++-
+ 3 files changed, 188 insertions(+), 110 deletions(-)
+
+--- a/drivers/spi/coldfire_edma.c
++++ b/drivers/spi/coldfire_edma.c
+@@ -20,76 +20,91 @@
+ #include <linux/cdev.h>
+ #include <linux/seq_file.h>
+ #include <linux/proc_fs.h>
++#ifdef CONFIG_M54455
+ #include <asm/mcf5445x_edma.h>
+ #include <asm/mcf5445x_intc.h>
++#endif /* CONFIG_M54455 */
+ #include <asm/coldfire_edma.h>
+-
+-/* callback handler data for each TCD */
++/*
++ * Callback handler data for each TCD
++ */
+ struct edma_isr_record {
+-      edma_irq_handler irq_handler;       /* interrupt handler */
+-      edma_error_handler error_handler;       /* error interrupt handler */
+-      void* dev;                                                      /* device used for the channel */
+-      int  allocated;                                         /* busy flag */
+-      spinlock_t *lock;                                       /* spin lock (if needs to be locked in interrupt) */
+-      const char* device_id;                          /* device id string, used in proc file system */
++      edma_irq_handler irq_handler;     /* interrupt handler */
++      edma_error_handler error_handler; /* error interrupt handler */
++      void *arg;                        /* argument to pass back */
++      int allocated;                    /* busy flag */
++      spinlock_t *lock;                 /* spin lock (optional) */
++      const char *device_id;            /* dev id string, used in procfs */
+ };
+-/* device structure */
++/*
++ * Device structure
++ */
+ struct coldfire_edma_dev {
+-      struct cdev cdev;                       /* character device */
+-      struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS]; /* channel handlers */
++      struct cdev cdev;                 /* character device */
++      struct edma_isr_record dma_interrupt_handlers[EDMA_CHANNELS];
+ };
+ /* allocated major device number */
+ static int coldfire_dma_major;
++
+ /* device driver structure */
+-static struct coldfire_edma_dev* devp = NULL;
++static struct coldfire_edma_dev *devp = NULL;
+ /* device driver file operations */
+ struct file_operations coldfire_edma_fops = {
+       .owner = THIS_MODULE,
+ };
+-/* eDMA channel interrupt handler */
++/**
++ * dmaisr - eDMA channel interrupt handler
++ * @irq: interrupt number
++ * @dev_id: argument
++ */
+ static int dmaisr(int irq, void *dev_id)
+ {
+       int channel = irq - EDMA_INT_CONTROLLER_BASE - EDMA_INT_CHANNEL_BASE;
+       int result = IRQ_HANDLED;
+-      if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) {
+-              spin_lock(devp->dma_interrupt_handlers[channel].lock);
+-      }
++      if ((devp != NULL) &&
++          (devp->dma_interrupt_handlers[channel].irq_handler)) {
++              /* call user irq handler */
++              if (devp->dma_interrupt_handlers[channel].lock)
++                      spin_lock(devp->dma_interrupt_handlers[channel].lock);
++
++              result = devp->dma_interrupt_handlers[channel].irq_handler(
++                      channel, devp->dma_interrupt_handlers[channel].arg);
+-      if (devp!=NULL && devp->dma_interrupt_handlers[channel].irq_handler) {
+-              result = devp->dma_interrupt_handlers[channel].irq_handler(channel,
+-                                                      devp->dma_interrupt_handlers[channel].dev);
++              if (devp->dma_interrupt_handlers[channel].lock)
++                      spin_unlock(devp->dma_interrupt_handlers[channel].lock);
+       } else {
++              /* no irq handler so just ack it */
+               confirm_edma_interrupt_handled(channel);
+-              printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n", channel);
+-      }
+-
+-      if (devp!=NULL && devp->dma_interrupt_handlers[channel].lock) {
+-              spin_unlock(devp->dma_interrupt_handlers[channel].lock);
++              printk(EDMA_DRIVER_NAME ": No handler for DMA channel %d\n",
++                     channel);
+       }
+       return result;
+ }
+-/* eDMA error interrupt handler */
++/**
++ * dma_error_isr - eDMA error interrupt handler
++ * @irq: interrupt number
++ * @dev_id: argument
++ */
+ static int dma_error_isr(int irq, void* dev_id)
+ {
+       u16 err;
+       int i;
+       err = MCF_EDMA_ERR;
+-      for (i=0;i<EDMA_CHANNELS;i++) {
++      for (i=0; i<EDMA_CHANNELS; i++) {
+               if (err & (1<<i)) {
+-                      if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler) {
+-                              devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].dev);
+-                      } else {
++                      if (devp!=NULL && devp->dma_interrupt_handlers[i].error_handler)
++                              devp->dma_interrupt_handlers[i].error_handler(i, devp->dma_interrupt_handlers[i].arg);
++                      else
+                               printk(KERN_WARNING EDMA_DRIVER_NAME ": DMA error on channel %d\n", i);
+-                      }
+               }
+       }
+@@ -97,11 +112,26 @@ static int dma_error_isr(int irq, void* 
+       return IRQ_HANDLED;
+ }
+-/* sets channel parameters */
++/**
++ * set_edma_params - Set transfer control descriptor (TCD)
++ * @channel: channel number
++ * @source: source address
++ * @dest: destination address
++ * @attr: attributes
++ * @soff: source offset
++ * @nbytes: number of bytes to be transfered in minor loop
++ * @slast: last source address adjustment
++ * @citer: major loop count
++ * @biter: beginning minor loop count
++ * @doff: destination offset
++ * @dlast_sga: last destination address adjustment
++ * @major_int: generate interrupt after each major loop
++ * @disable_req: disable DMA request after major loop
++ */
+ void set_edma_params(int channel, u32 source, u32 dest,
+-                                       u32 attr, u32 soff, u32 nbytes, u32 slast,
+-                                       u32 citer, u32 biter, u32 doff, u32 dlast_sga,
+-                                       int major_int, int disable_req)
++      u32 attr, u32 soff, u32 nbytes, u32 slast,
++      u32 citer, u32 biter, u32 doff, u32 dlast_sga,
++      int major_int, int disable_req)
+ {
+       if (channel<0 || channel>EDMA_CHANNELS)
+@@ -117,45 +147,56 @@ void set_edma_params(int channel, u32 so
+       MCF_EDMA_TCD_BITER(channel)=MCF_EDMA_TCD_BITER_BITER(biter);
+       MCF_EDMA_TCD_DOFF(channel) = MCF_EDMA_TCD_DOFF_DOFF(doff);
+       MCF_EDMA_TCD_DLAST_SGA(channel) = MCF_EDMA_TCD_DLAST_SGA_DLAST_SGA(dlast_sga);
++
+       /* interrupt at the end of major loop */
+-      if (major_int) {
++      if (major_int)
+               MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_INT_MAJOR;
+-      } else {
++      else
+               MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_INT_MAJOR;
+-      }
++
+       /* disable request at the end of major loop of transfer or not*/
+-      if (disable_req) {
++      if (disable_req)
+               MCF_EDMA_TCD_CSR(channel) |= MCF_EDMA_TCD_CSR_D_REQ;
+-      } else {
++      else
+               MCF_EDMA_TCD_CSR(channel) &= ~MCF_EDMA_TCD_CSR_D_REQ;
+-      }
+-
+ }
+ EXPORT_SYMBOL(set_edma_params);
+-/* init eDMA controller */
++/**
++ * init_edma - Initialize the eDMA controller
++ */
+ void init_edma(void)
+ {
+       MCF_EDMA_CR = 0;
+ }
+ EXPORT_SYMBOL(init_edma);
+-/* request eDMA channel */
++/**
++ * request_edma_channel - Request an eDMA channel
++ * @channel: channel number
++ * @handler: dma handler
++ * @error_handler: dma error handler
++ * @arg: argument to pass back
++ * @lock: optional spinlock to hold over interrupt
++ * @device_id: device id
++ *
++ * Returns 0 if success or a negative value if failure
++ */
+ int request_edma_channel(int channel,
+-                                              edma_irq_handler handler,
+-                                              edma_error_handler error_handler,
+-                                              void* dev,
+-                                              spinlock_t *lock,
+-                                              const char* device_id )
++      edma_irq_handler handler,
++      edma_error_handler error_handler,
++      void *arg,
++      spinlock_t *lock,
++      const char *device_id )
+ {
+       if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
+-              if (devp->dma_interrupt_handlers[channel].allocated) {
++              if (devp->dma_interrupt_handlers[channel].allocated)
+                       return -EBUSY;
+-              }
++
+               devp->dma_interrupt_handlers[channel].allocated = 1;
+               devp->dma_interrupt_handlers[channel].irq_handler = handler;
+               devp->dma_interrupt_handlers[channel].error_handler = error_handler;
+-              devp->dma_interrupt_handlers[channel].dev = dev;
++              devp->dma_interrupt_handlers[channel].arg = arg;
+               devp->dma_interrupt_handlers[channel].lock = lock;
+               devp->dma_interrupt_handlers[channel].device_id = device_id;
+               return 0;
+@@ -164,16 +205,22 @@ int request_edma_channel(int channel,
+ }
+ EXPORT_SYMBOL(request_edma_channel);
+-/* free eDMA channel */
+-int free_edma_channel(int channel, void* dev)
++/**
++ * free_edma_channel - Free the edma channel
++ * @channel: channel number
++ * @arg: argument created with
++ *
++ * Returns 0 if success or a negative value if failure
++ */
++int free_edma_channel(int channel, void *arg)
+ {
+       if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
+               if (devp->dma_interrupt_handlers[channel].allocated) {
+-                      if (devp->dma_interrupt_handlers[channel].dev != dev) {
++                      if (devp->dma_interrupt_handlers[channel].arg != arg)
+                               return -EBUSY;
+-                      }
++
+                       devp->dma_interrupt_handlers[channel].allocated = 0;
+-                      devp->dma_interrupt_handlers[channel].dev = NULL;
++                      devp->dma_interrupt_handlers[channel].arg = NULL;
+                       devp->dma_interrupt_handlers[channel].irq_handler = NULL;
+                       devp->dma_interrupt_handlers[channel].error_handler = NULL;
+                       devp->dma_interrupt_handlers[channel].lock = NULL;
+@@ -184,7 +231,9 @@ int free_edma_channel(int channel, void*
+ }
+ EXPORT_SYMBOL(free_edma_channel);
+-/* clean-up device driver allocated resources */
++/**
++ * coldfire_edma_cleanup - cleanup driver allocated resources
++ */
+ static void coldfire_edma_cleanup(void)
+ {
+       dev_t devno;
+@@ -192,13 +241,10 @@ static void coldfire_edma_cleanup(void)
+       /* free interrupts/memory */
+       if (devp) {
+-              for (i=0;i<EDMA_CHANNELS;i++)
+-              {
+-                      MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+i;
+-                      free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i,      devp);
+-              }
+-              MCF_INTC0_SIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS;
+-              free_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS, devp);
++              for (i=0; i<EDMA_CHANNELS; i++)
++                      free_irq(EDMA_INT_BASE+i, devp);
++
++              free_irq(EDMA_INT_BASE+EDMA_INT_ERR, devp);
+               cdev_del(&devp->cdev);
+               kfree(devp);
+       }
+@@ -209,30 +255,42 @@ static void coldfire_edma_cleanup(void)
+ }
+ #ifdef CONFIG_PROC_FS
+-/* proc file system support */
++/*
++ * proc file system support
++ */
+ #define FREE_CHANNEL "free"
+ #define DEVICE_UNKNOWN "device unknown"
++/**
++ * proc_edma_show - print out proc info
++ * @m: seq_file
++ * @v:
++ */
+ static int proc_edma_show(struct seq_file *m, void *v)
+ {
+       int i;
+-      if (devp==NULL) return 0;
++      if (devp == NULL)
++              return 0;
+       for (i = 0 ; i < EDMA_CHANNELS ; i++) {
+               if (devp->dma_interrupt_handlers[i].allocated) {
+                       if (devp->dma_interrupt_handlers[i].device_id)
+-                      seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id);
++                              seq_printf(m, "%2d: %s\n", i, devp->dma_interrupt_handlers[i].device_id);
+                       else
+                               seq_printf(m, "%2d: %s\n", i, DEVICE_UNKNOWN);
+-              } else {
++              } else
+                       seq_printf(m, "%2d: %s\n", i, FREE_CHANNEL);
+-              }
+       }
+       return 0;
+ }
++/**
++ * proc_edma_open - open the proc file
++ * @inode: inode ptr
++ * @file: file ptr
++ */
+ static int proc_edma_open(struct inode *inode, struct file *file)
+ {
+       return single_open(file, proc_edma_show, NULL);
+@@ -245,6 +303,9 @@ static const struct file_operations proc
+       .release        = single_release,
+ };
++/**
++ * proc_edma_init - initialize proc filesystem
++ */
+ static int __init proc_edma_init(void)
+ {
+       struct proc_dir_entry *e;
+@@ -258,7 +319,9 @@ static int __init proc_edma_init(void)
+ #endif
+-/* initializes device driver */
++/**
++ * coldfire_edma_init - eDMA module init
++ */
+ static int __init coldfire_edma_init(void)
+ {
+       dev_t dev;
+@@ -267,8 +330,9 @@ static int __init coldfire_edma_init(voi
+       /* allocate free major number */
+       result = alloc_chrdev_region(&dev, DMA_DEV_MINOR, 1, EDMA_DRIVER_NAME);
+-      if (result<0) {
+-              printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n", result);
++      if (result < 0) {
++              printk(KERN_WARNING EDMA_DRIVER_NAME": can't get major %d\n",
++                     result);
+               return result;
+       }
+       coldfire_dma_major = MAJOR(dev);
+@@ -280,71 +344,68 @@ static int __init coldfire_edma_init(voi
+               goto fail;
+       }
+-      /* init handlers (no handlers for beggining) */
+-      for (i=0;i<EDMA_CHANNELS;i++) {
++      /* init handlers (no handlers for beginning) */
++      for (i = 0; i < EDMA_CHANNELS; i++) {
+               devp->dma_interrupt_handlers[i].irq_handler = NULL;
+               devp->dma_interrupt_handlers[i].error_handler = NULL;
+-              devp->dma_interrupt_handlers[i].dev = NULL;
++              devp->dma_interrupt_handlers[i].arg = NULL;
+               devp->dma_interrupt_handlers[i].allocated = 0;
+               devp->dma_interrupt_handlers[i].lock = NULL;
+               devp->dma_interrupt_handlers[i].device_id = NULL;
+       }
+-    /* register char device */
++      /* register char device */
+       cdev_init(&devp->cdev, &coldfire_edma_fops);
+       devp->cdev.owner = THIS_MODULE;
+       devp->cdev.ops = &coldfire_edma_fops;
+       result = cdev_add(&devp->cdev, dev, 1);
+       if (result) {
+-              printk(KERN_NOTICE EDMA_DRIVER_NAME": Error %d adding coldfire-dma device\n", result);
++              printk(KERN_NOTICE EDMA_DRIVER_NAME
++                     ": Error %d adding coldfire-dma device\n", result);
+               result = -ENODEV;
+               goto fail;
+       }
+       /* request/enable irq for each eDMA channel */
+-      for (i=0;i<EDMA_CHANNELS;i++)
+-      {
+-              result = request_irq(EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i,
+-                      dmaisr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp);
++      for (i = 0; i < EDMA_CHANNELS;i++) {
++              result = request_irq(EDMA_INT_BASE + i,
++                                   dmaisr, IRQF_DISABLED,
++                                   EDMA_DRIVER_NAME, devp);
+               if (result) {
+-                      printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n",
+-                              EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+i);
++                      printk(KERN_WARNING EDMA_DRIVER_NAME
++                             ": Cannot request irq %d\n",
++                             (EDMA_INT_BASE + EDMA_INT_ERR+i));
+                       result = -EBUSY;
+                       goto fail;
+               }
+-
+-              MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+i) = EDMA_IRQ_LEVEL;
+-              MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+i;
+-
+       }
+-    /* request error interrupt */
+-      result = request_irq(EDMA_INT_CHANNEL_BASE + EDMA_INT_CONTROLLER_BASE + EDMA_CHANNELS,
+-                              dma_error_isr, SA_INTERRUPT, EDMA_DRIVER_NAME, devp);
++      /* request error interrupt */
++      result = request_irq(EDMA_INT_BASE + EDMA_INT_ERR,
++                           dma_error_isr, IRQF_DISABLED,
++                           EDMA_DRIVER_NAME, devp);
+       if (result) {
+-              printk(KERN_WARNING EDMA_DRIVER_NAME": Cannot request irq %d\n",
+-                              EDMA_INT_CHANNEL_BASE+EDMA_INT_CONTROLLER_BASE+EDMA_CHANNELS);
++              printk(KERN_WARNING EDMA_DRIVER_NAME
++                     ": Cannot request irq %d\n",
++                     (EDMA_INT_BASE + EDMA_INT_ERR));
+               result = -EBUSY;
+               goto fail;
+       }
+-      /* enable error interrupt in interrupt controller */
+-      MCF_INTC0_ICR(EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS) = EDMA_IRQ_LEVEL;
+-      MCF_INTC0_CIMR = EDMA_INT_CHANNEL_BASE+EDMA_CHANNELS;
+-
+ #ifdef CONFIG_PROC_FS
+       proc_edma_init();
+ #endif
+       printk(EDMA_DRIVER_NAME ": initialized successfully\n");
+-
+       return 0;
+ fail:
+       coldfire_edma_cleanup();
+       return result;
+-
+ }
++/**
++ * coldfire_edma_exit - eDMA module exit
++ */
+ static void __exit coldfire_edma_exit(void)
+ {
+       coldfire_edma_cleanup();
+@@ -354,5 +415,5 @@ module_init(coldfire_edma_init);
+ module_exit(coldfire_edma_exit);
+ MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Yaroslav Vinogradov, Freescale Inc.");
+-MODULE_DESCRIPTION("eDMA library for Coldfire 5445x");
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("eDMA library for Coldfire M5445x");
+--- a/include/asm-m68k/coldfire_edma.h
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -20,11 +20,14 @@
+ #define EDMA_DRIVER_NAME "ColdFire-eDMA"
+ #define DMA_DEV_MINOR 1
++#ifdef CONFIG_M54455
+ #define EDMA_INT_CHANNEL_BASE                 8
+ #define EDMA_INT_CONTROLLER_BASE      64
++#define EDMA_INT_BASE                 (EDMA_INT_CHANNEL_BASE + \
++                                       EDMA_INT_CONTROLLER_BASE)
+ #define EDMA_CHANNELS                 16
+- 
+-#define EDMA_IRQ_LEVEL                        5
++#define EDMA_INT_ERR                  16      /* edma error interrupt */
++#endif /* CONFIG_M54455 */
+  
+ typedef irqreturn_t (*edma_irq_handler)(int, void *);
+ typedef void (*edma_error_handler)(int, void *);
+@@ -38,7 +41,7 @@ typedef void (*edma_error_handler)(int, 
+  *   nbytes  - number of bytes to be transfered in minor loop
+  *   slast   - last source address adjustment
+  *   citer   - major loop count
+- *   biter   - beggining minor loop count
++ *   biter   - begining minor loop count
+  *   doff    - destination offset
+  *   dlast_sga - last destination address adjustment
+  *   major_int - generate interrupt after each major loop
+--- a/include/asm-m68k/mcf5445x_edma.h
++++ b/include/asm-m68k/mcf5445x_edma.h
+@@ -11,11 +11,27 @@
+ #ifndef __MCF5445X_EDMA_H__
+ #define __MCF5445X_EDMA_H__
+-/*********************************************************************
+-*
+-* Enhanced DMA (EDMA)
+-*
+-*********************************************************************/
++/*
++ * Enhanced DMA (EDMA)
++ */
++
++/* Channels */
++#define MCF_EDMA_CHAN_DREQ0   0       /* External DMA request 0 */
++#define MCF_EDMA_CHAN_DREQ1   1       /* External DMA request 1 */
++#define MCF_EDMA_CHAN_UART0_RX        2       /* UART0 Receive */
++#define MCF_EDMA_CHAN_UART0_TX        3       /* UART0 Transmit */
++#define MCF_EDMA_CHAN_UART1_RX        4       /* UART1 Receive */
++#define MCF_EDMA_CHAN_UART1_TX        5       /* UART1 Transmit */
++#define MCF_EDMA_CHAN_UART2_RX        6       /* UART2 Receive */
++#define MCF_EDMA_CHAN_UART2_TX        7       /* UART2 Transmit */
++#define MCF_EDMA_CHAN_TIMER0  8       /* Timer 0 / SSI0 Rx */
++#define MCF_EDMA_CHAN_TIMER1  9       /* Timer 1 / SSI1 Rx */
++#define MCF_EDMA_CHAN_TIMER2  10      /* Timer 2 / SSI0 Tx */
++#define MCF_EDMA_CHAN_TIMER3  11      /* Timer 3 / SSI1 Tx */
++#define MCF_EDMA_CHAN_DSPI_RX 12      /* DSPI Receive */
++#define MCF_EDMA_CHAN_DSPI_TX 13      /* DSPI Transmit */
++#define MCF_EDMA_CHAN_ATA_RX  14      /* ATA Receive */
++#define MCF_EDMA_CHAN_ATA_TX  15      /* ATA Transmit */
+ /* Register read/write macros */
+ #define MCF_EDMA_CR                     MCF_REG32(0xFC044000)
+@@ -1453,6 +1469,4 @@
+ #define MCF_EDMA_TCD15_CSR_LINKCH(x)    (((x)&0x003F)<<8)
+ #define MCF_EDMA_TCD15_CSR_BWC(x)       (((x)&0x0003)<<14)
+-/********************************************************************/
+-
+ #endif /* __MCF5445X_EDMA_H__ */
diff --git a/target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch b/target/linux/coldfire/patches/033-m5445x_ssi_cleanup.patch
new file mode 100644 (file)
index 0000000..068323b
--- /dev/null
@@ -0,0 +1,437 @@
+From 98e15babf1e25868d22c024dac6133cc29059d39 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Sun, 9 Dec 2007 02:24:13 -0700
+Subject: [PATCH] Fix DMA mode and cleanup driver.
+
+LTIBName: m5445x-ssi-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/ssi_audio.c |  207 ++++++++++++++++++++++++-----------------------
+ 1 files changed, 104 insertions(+), 103 deletions(-)
+
+--- a/drivers/spi/ssi_audio.c
++++ b/drivers/spi/ssi_audio.c
+@@ -2,7 +2,7 @@
+  * MCF5445x audio driver.
+  *
+  * Yaroslav Vinogradov yaroslav.vinogradov@freescale.com
+- * Copyright Freescale Semiconductor, Inc. 2006
++ * Copyright Freescale Semiconductor, Inc. 2006, 2007
+  *
+  * 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
+@@ -25,9 +25,11 @@
+ #include <asm/coldfire.h>
+ #include <asm/coldfire_edma.h>
++#ifdef CONFIG_M54455
+ #include <asm/mcf5445x_ssi.h>
+ #include <asm/mcf5445x_ccm.h>
+ #include <asm/mcf5445x_gpio.h>
++#endif
+ #define SOUND_DEVICE_NAME "sound"
+ #define DRIVER_NAME "ssi_audio"
+@@ -47,8 +49,8 @@
+ /* TLV320DAC23 audio chip registers */
+-#define CODEC_LEFT_IN_REG                     (0x00)
+-#define CODEC_RIGHT_IN_REG                    (0x01)
++#define CODEC_LEFT_IN_REG             (0x00)
++#define CODEC_RIGHT_IN_REG            (0x01)
+ #define CODEC_LEFT_HP_VOL_REG         (0x02)
+ #define CODEC_RIGHT_HP_VOL_REG                (0x03)
+ #define CODEC_ANALOG_APATH_REG                (0x04)
+@@ -57,7 +59,7 @@
+ #define CODEC_DIGITAL_IF_FMT_REG      (0x07)
+ #define CODEC_SAMPLE_RATE_REG         (0x08)
+ #define CODEC_DIGITAL_IF_ACT_REG      (0x09)
+-#define CODEC_RESET_REG                               (0x0f)
++#define CODEC_RESET_REG                       (0x0f)
+ #define CODEC_SAMPLE_8KHZ             (0x0C)
+ #define CODEC_SAMPLE_16KHZ            (0x58)
+@@ -71,21 +73,21 @@
+ /* DMA transfer size */
+ #define DMASIZE               (16*1024)
+-/* transmit eDMA channel for SSI channel 0 */
+-#define DMA_TCD       10
+-/* transmit eDMA channel for SSI channel 1 */
+-#define DMA_TCD2      11
++/* eDMA channel for SSI channel 0 TX */
++#define DMA_TCD       MCF_EDMA_CHAN_TIMER2
++/* eDMA channel for SSI channel 1 TX */
++#define DMA_TCD2      MCF_EDMA_CHAN_TIMER3
+ struct ssi_audio {
+-      struct spi_device       *spi;
++      struct spi_device *spi;
+       u32 speed;
+       u32 stereo;
+       u32 bits;
+       u32 format;
+-      u8  isopen;
+-      u8  dmaing;
+-      u8  ssi_enabled;
+-      u8  channel;
++      u8 isopen;
++      u8 dmaing;
++      u8 ssi_enabled;
++      u8 channel;
+       spinlock_t lock;
+       u8* audio_buf;
+ };
+@@ -129,7 +131,8 @@ static void ssi_audio_setsamplesize(int 
+       }
+ #ifdef AUDIO_DEBUG
+-      printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n", audio_device->format, audio_device->bits);
++      printk(DRIVER_NAME ":ssi_audio_setsamplesize %d %d\n",
++             audio_device->format, audio_device->bits);
+ #endif
+ }
+@@ -157,62 +160,57 @@ void __inline__ ssi_audio_dmarun(void)
+ {
+       set_edma_params(DMA_TCD,
+ #ifdef USE_MMU
+-                                      virt_to_phys(&(audio_device->audio_buf[audio_start])),
++                      virt_to_phys(&(audio_device->audio_buf[audio_start])),
+ #else
+-                                      (u32)&(audio_device->audio_buf[audio_start]),
++                      (u32)&(audio_device->audio_buf[audio_start]),
+ #endif
+-                                      (u32)&MCF_SSI_TX0,
+-                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
+-                                      8,
+-                                      4,
+-                                      0,
+-                                      audio_count/8,
+-                                      audio_count/8,
+-                                      0,
+-                                      0,
+-                                      0, // major_int
+-                                      0  // disable_req
+-                                      );
++                      (u32)&MCF_SSI_TX0,
++                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                      8,
++                      4,
++                      0,
++                      audio_count/8,
++                      audio_count/8,
++                      0,
++                      0,
++                      0, // major_int
++                      0  // disable_req
++                      );
+       set_edma_params(DMA_TCD2,
+ #ifdef USE_MMU
+-                                      virt_to_phys(&(audio_device->audio_buf[audio_start+4])),
++                      virt_to_phys(&(audio_device->audio_buf[audio_start+4])),
+ #else
+-                                      (u32)&(audio_device->audio_buf[audio_start+4]),
++                      (u32)&(audio_device->audio_buf[audio_start+4]),
+ #endif
+-                                      (u32)&MCF_SSI_TX1,
+-                                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
+-                                      8,
+-                                      4,
+-                                      0,
+-                                      audio_count/8,
+-                                      audio_count/8,
+-                                      0,
+-                                      0,
+-                                      1, // major_int
+-                    0  // disable_req
+-                                      );
++                      (u32)&MCF_SSI_TX1,
++                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                      8,
++                      4,
++                      0,
++                      audio_count/8,
++                      audio_count/8,
++                      0,
++                      0,
++                      1, // major_int
++                      0  // disable_req
++                      );
+       audio_device->dmaing = 1;
+       audio_txbusy = 1;
+       start_edma_transfer(DMA_TCD);
+       start_edma_transfer(DMA_TCD2);
+-#if 0
+-      MCF_EDMA_ERQ |= (1<<DMA_TCD) | (1<<DMA_TCD2);
+-      MCF_EDMA_SSRT = DMA_TCD;
+-      MCF_EDMA_SSRT = DMA_TCD2;
+-#endif
+-
+ }
+-/*
+- *    Start DMA'ing a new buffer of data if any available.
++/**
++ * ssi_audio_dmabuf - Start DMA'ing a new buffer of data if any available.
+  */
+ static void ssi_audio_dmabuf(void)
+ {
+ #ifdef AUDIO_DEBUG
+-      printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n", audio_append, audio_appstart);
++      printk(DRIVER_NAME ":ssi_audio_dmabuf(): append=%x start=%x\n",
++             audio_append, audio_appstart);
+ #endif
+       /* If already running then nothing to do... */
+@@ -241,7 +239,8 @@ static void ssi_audio_dmabuf(void)
+       }
+ }
+-void __inline__ stop_dma(void) {
++void __inline__ stop_dma(void)
++{
+       stop_edma_transfer(DMA_TCD);
+       stop_edma_transfer(DMA_TCD2);
+ }
+@@ -283,7 +282,6 @@ static void init_dma(void)
+ #endif        /* CONFIG_SSIAUDIO_USE_EDMA */
+-
+ /* Write CODEC register using SPI
+  *   address - CODEC register address
+  *   data - data to be written into register
+@@ -296,7 +294,8 @@ static int codec_write(u8 addr, u16 data
+               return -ENODEV;
+       spi_word = ((addr & 0x7F)<<9)|(data & 0x1FF);
+-      return spi_write(audio_device->spi, (const u8*)&spi_word, sizeof(spi_word));
++      return spi_write(audio_device->spi, (const u8*)&spi_word,
++                       sizeof(spi_word));
+ }
+ static inline void enable_ssi(void)
+@@ -359,7 +358,7 @@ static void init_audio_codec(void)
+       codec_write(CODEC_DIGITAL_APATH_REG, 0x007); /* Set A path */
+       /* set sample rate */
+-    adjust_codec_speed();
++      adjust_codec_speed();
+       codec_write(CODEC_LEFT_HP_VOL_REG, 0x075); /* set volume */
+       codec_write(CODEC_RIGHT_HP_VOL_REG, 0x075); /* set volume */
+@@ -375,13 +374,12 @@ static void chip_init(void)
+ #endif
+       /* Enable the SSI pins */
+-      MCF_GPIO_PAR_SSI = ( 0
+-                                                      | MCF_GPIO_PAR_SSI_MCLK
+-                                                      | MCF_GPIO_PAR_SSI_STXD(3)
+-                                                      | MCF_GPIO_PAR_SSI_SRXD(3)
+-                                                      | MCF_GPIO_PAR_SSI_FS(3)
+-                                                      | MCF_GPIO_PAR_SSI_BCLK(3) );
+-
++      MCF_GPIO_PAR_SSI = (0
++                          | MCF_GPIO_PAR_SSI_MCLK
++                          | MCF_GPIO_PAR_SSI_STXD(3)
++                          | MCF_GPIO_PAR_SSI_SRXD(3)
++                          | MCF_GPIO_PAR_SSI_FS(3)
++                          | MCF_GPIO_PAR_SSI_BCLK(3) );
+ }
+ static void init_ssi(void)
+@@ -430,8 +428,8 @@ static void init_ssi(void)
+                       ;
+       MCF_SSI_FCSR = 0
+-                      | MCF_SSI_FCSR_TFWM0(0)
+-                      | MCF_SSI_FCSR_TFWM1(0)
++                      | MCF_SSI_FCSR_TFWM0(2)
++                      | MCF_SSI_FCSR_TFWM1(2)
+                       ;
+       MCF_SSI_IER =   0 // interrupts
+@@ -459,9 +457,8 @@ static int ssi_audio_isr(int irq, void *
+ {
+       unsigned long   *bp;
+-      if (audio_txbusy==0) {
++      if (audio_txbusy==0)
+               return IRQ_HANDLED;
+-      }
+       spin_lock(&(audio_device->lock));
+@@ -560,7 +557,8 @@ static int ssi_audio_close(struct inode 
+ }
+ /* write to audio device */
+-static ssize_t ssi_audio_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
++static ssize_t ssi_audio_write(struct file *filp, const char *buf,
++      size_t count, loff_t *ppos)
+ {
+       unsigned long   *dp, *buflp;
+       unsigned short  *bufwp;
+@@ -568,10 +566,12 @@ static ssize_t ssi_audio_write(struct fi
+       unsigned int    slen, bufcnt, i, s, e;
+ #ifdef AUDIO_DEBUG
+-      printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n", (int) buf, count);
++      printk(DRIVER_NAME ":ssi_audio_write(buf=%x,count=%d)\n",
++             (int)buf, count);
+ #endif
+-      if (audio_device==NULL) return (-ENODEV);
++      if (audio_device==NULL)
++              return (-ENODEV);
+       if (count <= 0)
+               return 0;
+@@ -592,8 +592,8 @@ static ssize_t ssi_audio_write(struct fi
+ tryagain:
+       /*
+-       *      Get a snapshot of buffer, so we can figure out how
+-       *      much data we can fit in...
++       * Get a snapshot of buffer, so we can figure out how
++       * much data we can fit in...
+        */
+       s = audio_start;
+       e = audio_append;
+@@ -613,11 +613,12 @@ tryagain:
+               goto tryagain;
+       }
+-      /* For DMA we need to have data as 32 bit
+-         values (since SSI TX register is 32 bit).
+-         So, the incomming 16 bit data must be put to buffer as 32 bit values.
+-         Also, the endianess is converted if needed
+-      */
++      /*
++       * For DMA we need to have data as 32 bit
++       * values (since SSI TX register is 32 bit).
++       * So, the incoming 16 bit data must be put to buffer as 32 bit values.
++       * Also, the endianess is converted if needed
++       */
+       if (audio_device->stereo) {
+               if (audio_device->bits == 16) {
+                       if (audio_device->format==AFMT_S16_LE) {
+@@ -678,16 +679,19 @@ tryagain:
+ }
+ /* ioctl: control the driver */
+-static int ssi_audio_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
++static int ssi_audio_ioctl(struct inode *inode, struct file *filp,
++      unsigned int cmd, unsigned long arg)
+ {
+-      long    val;
+-      int     rc = 0;
++      long val;
++      int rc = 0;
+ #ifdef AUDIO_DEBUG
+-    printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n", (int) cmd, (int) arg);
++    printk(DRIVER_NAME ":ssi_audio_ioctl(cmd=%x,arg=%x)\n",
++         (int)cmd, (int)arg);
+ #endif
+-      if (audio_device==NULL) return (-ENODEV);
++      if (audio_device==NULL)
++              return (-ENODEV);
+       switch (cmd) {
+@@ -744,8 +748,6 @@ static int ssi_audio_ioctl(struct inode 
+       return rc;
+ }
+-/****************************************************************************/
+-
+ struct file_operations        ssi_audio_fops = {
+       open: ssi_audio_open,           /* open */
+       release: ssi_audio_close,       /* close */
+@@ -756,8 +758,8 @@ struct file_operations     ssi_audio_fops = 
+ /* initialize audio driver */
+ static int __devinit ssi_audio_probe(struct spi_device *spi)
+ {
+-      struct ssi_audio        *audio;
+-      int     err;
++      struct ssi_audio *audio;
++      int err;
+ #ifdef AUDIO_DEBUG
+       printk(DRIVER_NAME": probe\n");
+@@ -804,7 +806,7 @@ static int __devinit ssi_audio_probe(str
+       audio->spi = spi;
+ #ifndef CONFIG_SSIAUDIO_USE_EDMA
+-      if (request_irq(spi->irq, ssi_audio_isr, SA_INTERRUPT,  spi->dev.bus_id, audio)) {
++      if (request_irq(spi->irq, ssi_audio_isr, IRQF_DISABLED, spi->dev.bus_id, audio)) {
+               dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
+               err = -EBUSY;
+               goto err_free_mem;
+@@ -813,25 +815,21 @@ static int __devinit ssi_audio_probe(str
+ #else
+       /* request 2 eDMA channels since two channel output mode is used */
+       if (request_edma_channel(DMA_TCD,
+-                                                      ssi_audio_dma_handler_empty,
+-                                                      NULL,
+-                                                      audio,
+-                                                      &(audio_device->lock),
+-                                                      DRIVER_NAME
+-                                                      )!=0)
+-      {
++                               ssi_audio_dma_handler_empty,
++                               NULL,
++                               audio,
++                               &(audio_device->lock),
++                               DRIVER_NAME)!=0) {
+               dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD);
+               err = -EBUSY;
+               goto err_free_mem;
+       }
+       if (request_edma_channel(DMA_TCD2,
+-                                                      ssi_audio_dma_handler,
+-                                                      NULL,
+-                                                      audio,
+-                                                      &(audio_device->lock),
+-                                                      DRIVER_NAME
+-                                                      )!=0)
+-      {
++                               ssi_audio_dma_handler,
++                               NULL,
++                               audio,
++                               &(audio_device->lock),
++                               DRIVER_NAME)!=0) {
+               dev_dbg(&spi->dev, "DMA channel %d busy?\n", DMA_TCD2);
+               err = -EBUSY;
+               goto err_free_mem;
+@@ -870,11 +868,13 @@ static int __devexit ssi_audio_remove(st
+       return 0;
+ }
+-static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message) {
++static int ssi_audio_suspend(struct spi_device *spi, pm_message_t message)
++{
+       return 0;
+ }
+-static int ssi_audio_resume(struct spi_device *spi) {
++static int ssi_audio_resume(struct spi_device *spi)
++{
+       return 0;
+ }
+@@ -902,5 +902,6 @@ static void __exit ssi_audio_exit(void)
+ }
+ module_exit(ssi_audio_exit);
+-MODULE_DESCRIPTION("SSI/I2S Audio Driver");
+ MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Freescale Semiconductor, Inc.");
++MODULE_DESCRIPTION("SSI/I2S Audio Driver");
diff --git a/target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch b/target/linux/coldfire/patches/034-m5445x_spi_deprecated_api.patch
new file mode 100644 (file)
index 0000000..7e96268
--- /dev/null
@@ -0,0 +1,22 @@
+From b999c1fe5c6e5fa4f7e43fae02f59fc547d18093 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Sun, 9 Dec 2007 02:24:57 -0700
+Subject: [PATCH] Fix use of deprecated API.
+
+LTIBName: m5445x-spi-deprecated-api
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/spi_coldfire.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/drivers/spi/spi_coldfire.c
++++ b/drivers/spi/spi_coldfire.c
+@@ -1311,7 +1311,7 @@ static int coldfire_spi_probe(struct pla
+       irq = platform_info->irq_vector;
+-      status = request_irq(platform_info->irq_vector, qspi_interrupt, SA_INTERRUPT, dev->bus_id, drv_data);
++      status = request_irq(platform_info->irq_vector, qspi_interrupt, IRQF_DISABLED, dev->bus_id, drv_data);
+       if (status < 0) {
+               dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
+               goto out_error_master_alloc;
diff --git a/target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch b/target/linux/coldfire/patches/035-mcfv4e_bitops_cleanup.patch
new file mode 100644 (file)
index 0000000..c4f8cec
--- /dev/null
@@ -0,0 +1,83 @@
+From 898b269952d096ce3f990c51b02457c27e16b83c Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Sun, 9 Dec 2007 02:25:49 -0700
+Subject: [PATCH] Clean up formatting.
+
+LTIBName: mcfv4e-bitops-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/bitops.h |   21 ++++++++++++++-------
+ 1 files changed, 14 insertions(+), 7 deletions(-)
+
+--- a/include/asm-m68k/bitops.h
++++ b/include/asm-m68k/bitops.h
+@@ -478,7 +478,8 @@ static __inline__ int __constant_coldfir
+       return retval;
+ }
+ #else
+-static __inline__ int __constant_coldfire_test_and_set_bit(int nr,volatile void * vaddr)
++static __inline__ int __constant_coldfire_test_and_set_bit(int nr,
++      volatile void *vaddr)
+ {
+       char retval;
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+@@ -516,7 +517,8 @@ static __inline__ void __constant_coldfi
+            : "+QUd" (*p) : "di" (nr & 7));
+ }
+ #else
+-static __inline__ void __constant_coldfire_set_bit(int nr, volatile void * vaddr)
++static __inline__ void __constant_coldfire_set_bit(int nr,
++      volatile void *vaddr)
+ {
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+       __asm__ __volatile__ ("bset %1,(%3)"
+@@ -524,7 +526,8 @@ static __inline__ void __constant_coldfi
+ }
+ #endif
+-static __inline__ void __generic_coldfire_set_bit(int nr, volatile void *vaddr)
++static __inline__ void __generic_coldfire_set_bit(int nr,
++      volatile void *vaddr)
+ {
+       __asm__ __volatile__ ("bset %1,%0"
+            : "=m" (((volatile char *)vaddr)[(nr^31) >> 3])
+@@ -552,7 +555,8 @@ static __inline__ int __constant_coldfir
+       return retval;
+ }
+ #else
+-static __inline__ int __constant_coldfire_test_and_clear_bit(int nr, volatile void *vaddr)
++static __inline__ int __constant_coldfire_test_and_clear_bit(int nr,
++      volatile void *vaddr)
+ {
+       char retval;
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+@@ -599,7 +603,8 @@ static __inline__ void __constant_coldfi
+            : "+QUd" (*p) : "id" (nr & 7));
+ }
+ #else
+-static __inline__ void __constant_coldfire_clear_bit(int nr, volatile void * vaddr)
++static __inline__ void __constant_coldfire_clear_bit(int nr,
++      volatile void *vaddr)
+ {
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+       __asm__ __volatile__ ("bclr %1,(%3)"
+@@ -636,7 +641,8 @@ static __inline__ int __constant_coldfir
+       return retval;
+ }
+ #else
+-static __inline__ int __constant_coldfire_test_and_change_bit(int nr, volatile void * vaddr)
++static __inline__ int __constant_coldfire_test_and_change_bit(int nr,
++      volatile void *vaddr)
+ {
+       char retval;
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+@@ -678,7 +684,8 @@ static __inline__ void __constant_coldfi
+            : "+QUd" (*p) : "id" (nr & 7));
+ }
+ #else
+-static __inline__ void __constant_coldfire_change_bit(int nr, volatile void * vaddr)
++static __inline__ void __constant_coldfire_change_bit(int nr,
++      volatile void *vaddr)
+ {
+       volatile char *p = &((volatile char *)vaddr)[(nr^31) >> 3];
+       __asm__ __volatile__ ("bchg %1,(%3)"
diff --git a/target/linux/coldfire/patches/036-m5445x_pci.patch b/target/linux/coldfire/patches/036-m5445x_pci.patch
new file mode 100644 (file)
index 0000000..abeaad4
--- /dev/null
@@ -0,0 +1,251 @@
+From da8e8fe3d6ad5eb9589c8e77e7716e4f7e1a7499 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 10 Dec 2007 03:36:05 -0700
+Subject: [PATCH] Coldfire M5445x PCI Bits.
+
+LTIBName: m5445x-pci
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig                     |   12 ++++++++++--
+ arch/m68k/Makefile                    |    4 ++++
+ arch/m68k/coldfire/config.c           |    2 +-
+ arch/m68k/coldfire/iomap.c            |    2 ++
+ arch/m68k/coldfire/mcf5445x-devices.c |    9 +++++++++
+ arch/m68k/coldfire/mcf5445x-pci.c     |    5 +++--
+ arch/m68k/coldfire/pci.c              |    6 +++---
+ arch/m68k/kernel/Makefile             |    2 +-
+ drivers/macintosh/Kconfig             |    1 -
+ drivers/pci/Makefile                  |    1 +
+ include/asm-m68k/io.h                 |   13 ++++++++++++-
+ include/asm-m68k/pci.h                |    2 ++
+ 12 files changed, 48 insertions(+), 11 deletions(-)
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -11,6 +11,14 @@ config MMU
+       bool
+       default y
++config GENERIC_TIME
++        bool
++        default n
++
++config GENERIC_CLOCKEVENTS
++        bool
++        default n
++
+ config RWSEM_GENERIC_SPINLOCK
+       bool
+       default y
+@@ -48,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC
+       default y
+ config NO_IOPORT
+-      def_bool y
++      def_bool !M54455
+ config NO_DMA
+       def_bool SUN3
+@@ -159,7 +167,7 @@ config HADES
+ config PCI
+       bool
+-      depends on HADES
++      depends on HADES || M54455
+       default y
+       help
+         Find out whether you have a PCI motherboard. PCI is the name of a
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -32,6 +32,10 @@ ifdef CONFIG_SUN3
+ LDFLAGS_vmlinux = -N
+ endif
++ifdef CONFIG_COLDFIRE
++# LDFLAGS_vmlinux = --verbose
++endif
++
+ CHECKFLAGS += -D__mc68000__
+ # without -fno-strength-reduce the 53c7xx.c driver fails ;-(
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -252,7 +252,7 @@ void __init coldfire_sched_init(irq_hand
+                    MCF_DTIM_DTMR_FRR  | MCF_DTIM_DTMR_RST_EN, \
+                    MCF_DTIM0_DTMR);
+-      request_irq(mcf_timervector, handler, SA_INTERRUPT, \
++      request_irq(mcf_timervector, handler, IRQF_DISABLED, \
+                   "timer", (void *)MCF_DTIM0_DTMR);
+       settimericr(1, mcf_timerlevel);
+--- a/arch/m68k/coldfire/iomap.c
++++ b/arch/m68k/coldfire/iomap.c
+@@ -12,6 +12,7 @@
+ #include <linux/pci.h>
+ #include <asm/io.h>
++#if 0
+ void __iomem *__attribute__ ((weak))
+ ioport_map(unsigned long port, unsigned int len)
+ {
+@@ -52,3 +53,4 @@ void pci_iounmap(struct pci_dev *dev, vo
+       /* Nothing .. */
+ }
+ EXPORT_SYMBOL(ioport_unmap);
++#endif
+--- a/arch/m68k/coldfire/mcf5445x-devices.c
++++ b/arch/m68k/coldfire/mcf5445x-devices.c
+@@ -75,10 +75,19 @@ static int ata_get_clk_rate(void)
+       return MCF_BUSCLK;
+ }
++/* JKM -- move these to a header file */
++#define MCF_IDE_DMA_WATERMARK 32      /* DMA watermark level in bytes */
++#define MCF_IDE_DMA_BD_NR     (512/3/4) /* number of BDs per channel */
++
+ static struct fsl_ata_platform_data ata_data = {
+       .init             = ata_init,
+       .exit             = ata_exit,
+       .get_clk_rate     = ata_get_clk_rate,
++#ifdef CONFIG_PATA_FSL_USE_DMA
++        .udma_mask        = 0x0F, /* the board handles up to UDMA3 */
++        .fifo_alarm       = MCF_IDE_DMA_WATERMARK / 2,
++        .max_sg           = MCF_IDE_DMA_BD_NR,
++#endif
+ };
+ static struct resource pata_fsl_resources[] = {
+--- a/arch/m68k/coldfire/mcf5445x-pci.c
++++ b/arch/m68k/coldfire/mcf5445x-pci.c
+@@ -8,6 +8,7 @@
+  */
+ #include <linux/delay.h>
++#include <linux/interrupt.h>
+ #include <linux/pci.h>
+ #include <asm/mcfsim.h>
+@@ -76,7 +77,7 @@ void mcf5445x_pci_dumpregs(void);
+ #endif
+ /*
+- * static void mcf5445x_conf_device(struct pci_dev *dev)
++ * mcf5445x_conf_device(struct pci_dev *dev)
+  *
+  * Machine dependent Configure the given device.
+  *
+@@ -84,7 +85,7 @@ void mcf5445x_pci_dumpregs(void);
+  *
+  * dev                - the pci device.
+  */
+-void __init
++void
+ mcf5445x_conf_device(struct pci_dev *dev)
+ {
+       set_fpga(FPGA_PCI_IRQ_ENABLE, 0x0f);
+--- a/arch/m68k/coldfire/pci.c
++++ b/arch/m68k/coldfire/pci.c
+@@ -56,7 +56,7 @@ struct pci_ops pci_root_ops = {
+  *
+  * Initialize the pcibios based on cmd line params.
+  */
+-char * __init
++char *
+ pcibios_setup(char *str)
+ {
+       if (!strcmp(str, "debug")) {
+@@ -124,7 +124,7 @@ pcibios_map_irq(struct pci_dev *dev, u8 
+  *
+  * Update a PCI interrupt.
+  */
+-void __init
++void
+ pcibios_update_irq(struct pci_dev *dev, int irq)
+ {
+       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
+@@ -171,7 +171,7 @@ pcibios_enable_device(struct pci_dev *de
+ /*
+  * pcibios_fixup_bus(struct pci_bus *bus)
+  */
+-void __init
++void
+ pcibios_fixup_bus(struct pci_bus *bus)
+ {
+       struct pci_dev *dev = bus->self;
+--- a/arch/m68k/kernel/Makefile
++++ b/arch/m68k/kernel/Makefile
+@@ -9,6 +9,7 @@ else
+ ifndef CONFIG_COLDFIRE
+   extra-y := head.o vmlinux.lds
+   obj-y := entry.o signal.o traps.o ints.o
++  obj-$(CONFIG_PCI) += bios32.o
+ else   # CONFIG_COLDFIRE
+   extra-y := ../coldfire/head.o vmlinux.lds
+ endif
+@@ -19,7 +20,6 @@ obj-y        += process.o ptrace.o module.o \
+ devres-y = ../../../kernel/irq/devres.o
+-obj-$(CONFIG_PCI)     += bios32.o
+ obj-y$(CONFIG_MMU_SUN3) += dma.o      # no, it's not a typo
+ EXTRA_AFLAGS := -traditional
+--- a/drivers/macintosh/Kconfig
++++ b/drivers/macintosh/Kconfig
+@@ -118,7 +118,6 @@ config PMAC_SMU
+ config PMAC_APM_EMU
+       tristate "APM emulation"
+-      select APM_EMULATION
+       depends on ADB_PMU && PM && PPC32
+ config PMAC_MEDIABAY
+--- a/drivers/pci/Makefile
++++ b/drivers/pci/Makefile
+@@ -39,6 +39,7 @@ obj-$(CONFIG_PPC) += setup-bus.o
+ obj-$(CONFIG_MIPS) += setup-bus.o setup-irq.o
+ obj-$(CONFIG_X86_VISWS) += setup-irq.o
+ obj-$(CONFIG_MN10300) += setup-bus.o
++obj-$(CONFIG_M54455) += setup-bus.o setup-irq.o
+ #
+ # ACPI Related PCI FW Functions
+--- a/include/asm-m68k/io.h
++++ b/include/asm-m68k/io.h
+@@ -306,7 +306,18 @@ static inline void isa_delay(void)
+ #define outw(val,port) out_le16((port),(val))
+ #define inl(port)      in_le32(port)
+ #define outl(val,port) out_le32((port),(val))
+-
++#define insb(port, buf, nr)   \
++              raw_insb((u8 *)(port), (u8 *)(buf), (nr))
++#define outsb(port, buf, nr)  \
++              raw_outsb((u8 *)(port), (u8 *)(buf), (nr))
++#define insw(port, buf, nr)   \
++              raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr))
++#define outsw(port, buf, nr)  \
++              raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr))
++#define insl(port, buf, nr)   \
++              raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
++#define outsl(port, buf, nr)  \
++              raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
+ #else
+ /*
+  * kernel with both ISA and PCI compiled in, those have
+--- a/include/asm-m68k/pci.h
++++ b/include/asm-m68k/pci.h
+@@ -42,11 +42,13 @@ pcibios_penalize_isa_irq(int irq, int ac
+       /* no dynamic PCI IRQ allocation */
+ }
++#if 0
+ static inline void
+ pcibios_add_platform_entries(struct pci_dev *dev)
+ {
+       /* no special handling */
+ }
++#endif
+ static inline void
+ pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
diff --git a/target/linux/coldfire/patches/037-m5445x_edma_callback.patch b/target/linux/coldfire/patches/037-m5445x_edma_callback.patch
new file mode 100644 (file)
index 0000000..af2705c
--- /dev/null
@@ -0,0 +1,90 @@
+From acd937ac924aefd22ea9a66ea621ab80a4f9b594 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 10 Dec 2007 03:37:19 -0700
+Subject: [PATCH] Update EDMA driver to allow callback/arg changes.
+
+LTIBName: m5445x-edma-callback
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/coldfire_edma.c      |   27 +++++++++++++++++++++++++++
+ include/asm-m68k/coldfire_edma.h |   20 ++++++++++++++++++++
+ 2 files changed, 47 insertions(+), 0 deletions(-)
+
+--- a/drivers/spi/coldfire_edma.c
++++ b/drivers/spi/coldfire_edma.c
+@@ -206,6 +206,31 @@ int request_edma_channel(int channel,
+ EXPORT_SYMBOL(request_edma_channel);
+ /**
++ * set_edma_callback - Update the channel callback/arg
++ * @channel: channel number
++ * @handler: dma handler
++ * @error_handler: dma error handler
++ * @arg: argument to pass back
++ *
++ * Returns 0 if success or a negative value if failure
++ */
++int set_edma_callback(int channel,
++      edma_irq_handler handler,
++      edma_error_handler error_handler,
++      void *arg )
++{
++      if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS &&
++          devp->dma_interrupt_handlers[channel].allocated) {
++              devp->dma_interrupt_handlers[channel].irq_handler = handler;
++              devp->dma_interrupt_handlers[channel].error_handler = error_handler;
++              devp->dma_interrupt_handlers[channel].arg = arg;
++              return 0;
++      }
++      return -EINVAL;
++}
++EXPORT_SYMBOL(set_edma_callback);
++
++/**
+  * free_edma_channel - Free the edma channel
+  * @channel: channel number
+  * @arg: argument created with
+@@ -216,8 +241,10 @@ int free_edma_channel(int channel, void 
+ {
+       if (devp!=NULL && channel>=0 && channel<=EDMA_CHANNELS) {
+               if (devp->dma_interrupt_handlers[channel].allocated) {
++#if 0
+                       if (devp->dma_interrupt_handlers[channel].arg != arg)
+                               return -EBUSY;
++#endif
+                       devp->dma_interrupt_handlers[channel].allocated = 0;
+                       devp->dma_interrupt_handlers[channel].arg = NULL;
+--- a/include/asm-m68k/coldfire_edma.h
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -96,10 +96,30 @@ int request_edma_channel(int channel,
+               void *dev,
+               spinlock_t *lock,
+               const char *device_id);
++
++/**
++ * set_edma_callback - Update the channel callback/arg
++ * @channel: channel number
++ * @handler: dma handler
++ * @error_handler: dma error handler
++ * @arg: argument to pass back
++ *
++ * Returns 0 if success or a negative value if failure
++ */
++int set_edma_callback(int channel,
++              edma_irq_handler handler,
++              edma_error_handler error_handler,
++              void *arg);
+   
+ /* Free eDMA channel
+  *  channel - eDMA TCD number
+  *  dev - device
+  */
+ int free_edma_channel(int channel, void *dev);
++
++/*
++ * DMA Modes
++ */
++#define       DMA_MODE_READ           0
++#define DMA_MODE_WRITE                1
+ #endif
diff --git a/target/linux/coldfire/patches/038-m5445x_audio_rates.patch b/target/linux/coldfire/patches/038-m5445x_audio_rates.patch
new file mode 100644 (file)
index 0000000..09e47c4
--- /dev/null
@@ -0,0 +1,77 @@
+From de5f4660856350ac43f642bb7c5adf063fc68287 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 10 Dec 2007 13:15:33 -0700
+Subject: [PATCH] Fix to allow playback at other than 44.1.
+
+LTIBName: m5445x-audio-rates
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/ssi_audio.c |   34 ++++++++++++++++++++++++----------
+ 1 files changed, 24 insertions(+), 10 deletions(-)
+
+--- a/drivers/spi/ssi_audio.c
++++ b/drivers/spi/ssi_audio.c
+@@ -34,7 +34,6 @@
+ #define SOUND_DEVICE_NAME "sound"
+ #define DRIVER_NAME "ssi_audio"
+-
+ /* #define AUDIO_DEBUG */
+ #ifdef CONFIG_MMU
+@@ -315,24 +314,36 @@ static inline void disable_ssi(void)
+ }
+ /* Audio CODEC initialization */
+-/* TODO: also the SSI frequency/dividers must be adjusted */
+ static void adjust_codec_speed(void) {
+ #ifdef AUDIO_DEBUG
+       printk(DRIVER_NAME ":adjust_codec_speed: %d\n", audio_device->speed);
+ #endif
+-
+-      if (audio_device->speed == 8000) {
++      disable_ssi();
++      switch (audio_device->speed) {
++      case 8000:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(255);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_8KHZ);
+-      } else if (audio_device->speed == 16000) {
++              break;
++      case 16000:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(129);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_16KHZ);
+-      } else if (audio_device->speed == 22000) {
++              break;
++      case 22000:
++      case 22050:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(94);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_22KHZ);
+-      } else if (audio_device->speed == 44000 || audio_device->speed == 44100) {
++              break;
++      case 44000:
++      case 44100:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
+-      } else if (audio_device->speed == 48000) {
++              break;
++      case 48000:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(42);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_48KHZ);
+-      } else {
+-              /* default 44KHz */
++              break;
++      default:
++              MCF_CCM_CDR = MCF_CCM_CDR_SSIDIV(47);
+               codec_write(CODEC_SAMPLE_RATE_REG,CODEC_SAMPLE_44KHZ);
+       }
+ }
+@@ -712,6 +723,9 @@ static int ssi_audio_ioctl(struct inode 
+       case SNDCTL_DSP_SAMPLESIZE:
+               if (access_ok(VERIFY_READ, (void *) arg, sizeof(val))) {
+                       get_user(val, (unsigned long *) arg);
++#ifdef AUDIO_DEBUG
++                      printk(DRIVER_NAME ":ssi_audio_ioctl: SNDCTL_DSP_SAMPLESIZE: %d\n", val);
++#endif
+                       ssi_audio_txdrain();
+                       ssi_audio_setsamplesize(val);
+               } else {
diff --git a/target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch b/target/linux/coldfire/patches/039-mcfv4e_kbuild_flags_update.patch
new file mode 100644 (file)
index 0000000..e560749
--- /dev/null
@@ -0,0 +1,32 @@
+From ea71d637a9d8606624056fad67d050face9fc03c Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 15 Feb 2008 15:32:35 -0700
+Subject: [PATCH] Update to use KBUILD_ for CFLAGS and AFLAGS.
+
+LTIBName: mcfv4e-kbuild-flags-update
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Makefile |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -33,6 +33,7 @@ LDFLAGS_vmlinux = -N
+ endif
+ ifdef CONFIG_COLDFIRE
++# OBJCOPYFLAGS    := -R .note -R .note.gnu.build-id -R .comment -S
+ # LDFLAGS_vmlinux = --verbose
+ endif
+@@ -59,8 +60,8 @@ endif
+ endif
+ ifdef CONFIG_M54455
+-CFLAGS := $(CFLAGS) -march=isac -mcpu=54455 -msoft-float -g 
+-AFLAGS := $(AFLAGS) -march=isac -mcpu=54455 -msoft-float  
++KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
++KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float  
+ endif
+ ifdef CONFIG_KGDB
diff --git a/target/linux/coldfire/patches/040-m5445x_usb_header_move.patch b/target/linux/coldfire/patches/040-m5445x_usb_header_move.patch
new file mode 100644 (file)
index 0000000..a131d56
--- /dev/null
@@ -0,0 +1,22 @@
+From 9d8ff9acf372506a60b2e54964d230e0a5a95eb1 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 15 Feb 2008 15:33:23 -0700
+Subject: [PATCH] Change linux/usb_gadget.h to linux/usb/gadget.h
+
+LTIBName: m5445x-usb-header-move
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/usb/gadget/mcf5445x_udc.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/drivers/usb/gadget/mcf5445x_udc.c
++++ b/drivers/usb/gadget/mcf5445x_udc.c
+@@ -57,7 +57,7 @@
+ #include <linux/moduleparam.h>
+ #include <linux/device.h>
+ #include <linux/usb/ch9.h>
+-#include <linux/usb_gadget.h>
++#include <linux/usb/gadget.h>
+ #include <linux/usb/otg.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/dmapool.h>
diff --git a/target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch b/target/linux/coldfire/patches/041-mcfv4e_bitops_lock_hdr.patch
new file mode 100644 (file)
index 0000000..7117629
--- /dev/null
@@ -0,0 +1,21 @@
+From ff3d02768c1cbfbc1f0f07db4aef3d500101e4a7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 15 Feb 2008 15:34:06 -0700
+Subject: [PATCH] Add generic lock header.
+
+LTIBName: mcfv4e-bitops-lock-hdr
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/bitops.h |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+--- a/include/asm-m68k/bitops.h
++++ b/include/asm-m68k/bitops.h
+@@ -874,6 +874,7 @@ static  __inline__ int fls(int x)
+ #include <asm-generic/bitops/fls64.h>
+ #include <asm-generic/bitops/sched.h>
+ #include <asm-generic/bitops/hweight.h>
++#include <asm-generic/bitops/lock.h>
+ #define minix_find_first_zero_bit(addr, size) find_next_zero_bit((addr), \
+                                                       (size), 0)
diff --git a/target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch b/target/linux/coldfire/patches/042-m5445x_pata_24_cleanup.patch
new file mode 100644 (file)
index 0000000..0229987
--- /dev/null
@@ -0,0 +1,49 @@
+From 329eae71bdbe9e30f76164ba3dd5ef0dba932eef Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 15 Feb 2008 15:34:58 -0700
+Subject: [PATCH] Remove .port_disable and .irq_ack for 2.6.24.
+
+LTIBName: m5445x-pata-24-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/ata/pata_fsl.c |   15 ---------------
+ 1 files changed, 0 insertions(+), 15 deletions(-)
+
+--- a/drivers/ata/pata_fsl.c
++++ b/drivers/ata/pata_fsl.c
+@@ -497,19 +497,6 @@ err_out:
+ }
+ #endif /* CONFIG_FSL_PATA_USE_DMA */
+-static u8 pata_fsl_irq_ack(struct ata_port *ap, unsigned int chk_drq)
+-{
+-      unsigned int bits = chk_drq ? ATA_BUSY | ATA_DRQ : ATA_BUSY;
+-      u8 status;
+-
+-      status = ata_busy_wait(ap, bits, 1000);
+-      if (status & bits)
+-              if (ata_msg_err(ap))
+-                      printk(KERN_ERR "abnormal status 0x%X\n", status);
+-
+-      return status;
+-}
+-
+ static void ata_dummy_noret(struct ata_port *ap) { return; }
+ static struct scsi_host_template pata_fsl_sht = {
+@@ -538,7 +525,6 @@ static struct ata_port_operations pata_f
+       .set_dmamode            = pata_fsl_set_dmamode,
+ #endif
+-      .port_disable           = ata_port_disable,
+       .tf_load                = ata_tf_load,
+       .tf_read                = ata_tf_read,
+       .check_status           = ata_check_status,
+@@ -563,7 +549,6 @@ static struct ata_port_operations pata_f
+       .irq_clear              = ata_dummy_noret,
+       .irq_on                 = ata_irq_on,
+-      .irq_ack                = pata_fsl_irq_ack,
+       .port_start             = pata_fsl_port_start,
diff --git a/target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch b/target/linux/coldfire/patches/043-m5445x_spi_cdev_remove.patch
new file mode 100644 (file)
index 0000000..077f74d
--- /dev/null
@@ -0,0 +1,31 @@
+From 13e26ba450f92bafe7dde67ad68779eeea65a53f Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 15 Feb 2008 15:36:04 -0700
+Subject: [PATCH] Remove cdev as the structure has changed for 2.6.24.
+
+LTIBName: m5445x-spi-cdev-remove
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/spi/spi_coldfire.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/drivers/spi/spi_coldfire.c
++++ b/drivers/spi/spi_coldfire.c
+@@ -1115,7 +1115,7 @@ static int init_queue(struct driver_data
+       INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/);
+       drv_data->workqueue = create_singlethread_workqueue(
+-                                      drv_data->master->cdev.dev->bus_id);
++                                      drv_data->master->dev.parent->bus_id);
+       if (drv_data->workqueue == NULL)
+               return -EBUSY;
+@@ -1223,7 +1223,7 @@ static int coldfire_spi_probe(struct pla
+       if (!master)
+               return -ENOMEM;
+-      drv_data = class_get_devdata(&master->cdev);
++      drv_data = spi_master_get_devdata(master);
+       drv_data->master = master;
+       INIT_LIST_HEAD(&drv_data->queue);
diff --git a/target/linux/coldfire/patches/044-m547x_8x_initial.patch b/target/linux/coldfire/patches/044-m547x_8x_initial.patch
new file mode 100644 (file)
index 0000000..e313a36
--- /dev/null
@@ -0,0 +1,3403 @@
+From 5b8edb0ea5cafb522e21b2973eaff6298062dd81 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 28 Feb 2008 10:56:17 -0700
+Subject: [PATCH] Initial M547x/M548x port.
+
+LTIBName: m547x-8x-initial
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig                    |   84 ++++-
+ arch/m68k/Makefile                   |    4 +
+ arch/m68k/coldfire/config.c          |  112 +++++-
+ arch/m68k/coldfire/head.S            |  153 ++++++-
+ arch/m68k/coldfire/ints.c            |   78 ++++-
+ arch/m68k/configs/m5485evb_defconfig |  777 ++++++++++++++++++++++++++++++++++
+ drivers/serial/mcfserial.c           |   45 ++-
+ include/asm-m68k/cf_pgalloc.h        |    5 +
+ include/asm-m68k/cfcache.h           |   28 ++-
+ include/asm-m68k/coldfire.h          |    7 +
+ include/asm-m68k/m5485gpio.h         |  694 ++++++++++++++++++++++++++++++
+ include/asm-m68k/m5485gpt.h          |   88 ++++
+ include/asm-m68k/m5485psc.h          |  474 +++++++++++++++++++++
+ include/asm-m68k/m5485sim.h          |  219 ++++++++++
+ include/asm-m68k/mcfsim.h            |    5 +
+ include/asm-m68k/mcfuart.h           |   14 +
+ include/asm-m68k/mmu_context.h       |   72 ++++
+ include/asm-m68k/page_offset.h       |    5 +
+ 18 files changed, 2824 insertions(+), 40 deletions(-)
+ create mode 100644 arch/m68k/configs/m5485evb_defconfig
+ create mode 100644 include/asm-m68k/m5485gpio.h
+ create mode 100644 include/asm-m68k/m5485gpt.h
+ create mode 100644 include/asm-m68k/m5485psc.h
+ create mode 100644 include/asm-m68k/m5485sim.h
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -56,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC
+       default y
+ config NO_IOPORT
+-      def_bool !M54455
++      def_bool !(M54455 || M547X_8X)
+ config NO_DMA
+       def_bool SUN3
+@@ -319,20 +319,80 @@ config M68060
+ config M54455
+       bool "MCF54455 support"
+       depends on COLDFIRE
+-      default y
+       help
+           This option will add support for the MCF54455 processor with mmu.
++config M547X_8X
++      bool "MCF547x/MCF548x support"
++      depends on COLDFIRE
++      help
++          This option will add support for the MCF547x/MCF548x processor with mmu.
++
++config M547X
++      bool
++      depends on M547X_8X
++      default n
++
++config M548X
++      bool
++      depends on M547X_8X
++      default n
++
++choice
++      prompt "Model"
++      depends on M547X_8X
++      default M5485CFE
++      config M5475AFE
++              bool "MCF5475AFE"
++              select M547X
++      config M5475BFE
++              bool "MCF5475BFE"
++              select M547X
++      config M5475CFE
++              bool "MCF5475CFE"
++              select M547X
++      config M5475DFE
++              bool "MCF5475DFE"
++              select M547X
++      config M5475EFE
++              bool "MCF5475EFE"
++              select M547X
++      config M5475FFE
++              bool "MCF5475FFE"
++              select M547X
++
++      config M5485AFE
++              bool "MCF5485AFE"
++              select M548X
++      config M5485BFE
++              bool "MCF5485BFE"
++              select M548X
++      config M5485CFE
++              bool "MCF5485CFE"
++              select M548X
++      config M5485DFE
++              bool "MCF5485DFE"
++              select M548X
++      config M5485EFE
++              bool "MCF5485EFE"
++              select M548X
++      config M5485FFE
++              bool "MCF5485FFE"
++              select M548X
++
++endchoice
++
+ config MCFCLK
+-      int "M54455EVB System Clock"
+-      depends on M54455
+-      default 266666666
++      int
++      default 266666666 if M54455
++      default 266000000 if M547X
++      default 200000000 if M548X
+       help
+-        System clock for EVB.  Usually 266MHz for u-boot and 200MHz for dBUG.
++        Coldfire System clock.
+ config MCF_USER_HALT
+       bool "Coldfire User Halt Enable"
+-      depends on M54455
++      depends on M54455 || M547X_8X
+       default n
+       help
+         Enables the HALT instruction in User Mode.
+@@ -350,13 +410,15 @@ config MMU_CFV4E
+ config SDRAM_BASE
+       hex
+-      depends on M54455
+-      default 0x40000000
++      depends on COLDFIRE
++      default 0x40000000 if M54455
++      default 0x00000000 if M547X_8X
+ config SDRAM_SIZE
+       hex
+-      depends on M54455
+-      default 0x0FFFFFFF
++      depends on COLDFIRE
++      default 0x0FFFFFFF if M54455
++      default 0x04000000 if M547X_8X
+ config NOR_FLASH_BASE
+       hex "NOR Flash Base Address"
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -63,6 +63,10 @@ ifdef CONFIG_M54455
+ KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
+ KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float  
+ endif
++ifdef CONFIG_M547X_8X
++KBUILD_CFLAGS += -mcfv4e -g
++KBUILD_AFLAGS += -mcfv4e
++endif
+ ifdef CONFIG_KGDB
+ # If configured for kgdb support, include debugging infos and keep the
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -1,8 +1,9 @@
+ /*
+- *  linux/arch/m68k/coldifre/config.c
++ *  linux/arch/m68k/coldfire/config.c
+  *
++ *  Kurt Mahan kmahan@freescale.com
+  *  Matt Waddel Matt.Waddel@freescale.com
+- *  Copyright Freescale Semiconductor, Inc. 2007
++ *  Copyright Freescale Semiconductor, Inc. 2007, 2008
+  *
+  *  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
+@@ -32,11 +33,16 @@
+ #include <asm/movs.h>
+ #include <asm/page.h>
+ #include <asm/pgalloc.h>
++
++#include <asm/mcfsim.h>
++
++#if 0
+ #include <asm/mcf5445x_intc.h>
+ #include <asm/mcf5445x_sdramc.h>
+ #include <asm/mcf5445x_fbcs.h>
+ #include <asm/mcf5445x_dtim.h>
+ #include <asm/mcf5445x_xbs.h>
++#endif
+ /* JKM -- testing */
+ #include <linux/pfn.h>
+@@ -85,15 +91,21 @@ int __init uboot_commandline(char *boota
+ {
+       int len = 0, cmd_line_len;
+       static struct uboot_record uboot_info;
++      u32 offset = PAGE_OFFSET_RAW - PHYS_OFFSET;
+       extern unsigned long uboot_info_stk;
+-      /* Add 0x80000000 to get post-remapped kernel memory location */
+-      uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + 0x80000000;
+-      uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + 0x80000000;
+-      uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + 0x80000000;
+-      uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + 0x80000000;
+-      uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + 0x80000000;
++      /* validate address */
++      if ((uboot_info_stk < PAGE_OFFSET_RAW) ||
++          (uboot_info_stk >= (PAGE_OFFSET_RAW + CONFIG_SDRAM_SIZE)))
++              return 0;
++
++      /* Add offset to get post-remapped kernel memory location */
++      uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + offset;
++      uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset;
++      uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset;
++      uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset;
++      uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset;
+       cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start;
+       if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1))
+@@ -106,21 +118,36 @@ int __init uboot_commandline(char *boota
+ /*
+  * This routine does things not done in the bootloader.
+  */
++#if defined(CONFIG_M54455)
+ #define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++#elif defined(CONFIG_M547X_8X)
++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
++#endif
+ asmlinkage void __init cf_early_init(void)
+ {
+       struct bi_record *record = (struct bi_record *) &_end;
+       extern char _end;
++#if defined(CONFIG_M54455)
+       SET_VBR((void *)MCF_RAMBAR1);
++#elif defined(CONFIG_M547X_8X)
++      SET_VBR((void *)MCF_RAMBAR0);
++#endif
+       /* Mask all interrupts */
++#if defined(CONFIG_M54455)
+       MCF_INTC0_IMRL = 0xFFFFFFFF;
+       MCF_INTC0_IMRH = 0xFFFFFFFF;
+       MCF_INTC1_IMRL = 0xFFFFFFFF;
+       MCF_INTC1_IMRH = 0xFFFFFFFF;
++#elif defined(CONFIG_M547X_8X)
++/* JKM -- ?? */
++      MCF_IMRL = 0xFFFFFFFF;
++      MCF_IMRH = 0xFFFFFFFF;
++#endif
++#if defined(CONFIG_M54455)
+ #if defined(CONFIG_NOR_FLASH_BASE)
+       MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE;
+ #else
+@@ -131,9 +158,10 @@ asmlinkage void __init cf_early_init(voi
+       /* Init optional SDRAM chip select */
+       MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B;
+ #endif
++#endif /* CONFIG_M54455 */
++#if defined(CONFIG_M54455)
+       /* Setup SDRAM crossbar(XBS) priorities */
+-printk(KERN_INFO "Bumping USB Priority\n");
+       MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) |
+                       MCF_XBS_PRS_M1(MCF_XBS_PRI_3) |
+                       MCF_XBS_PRS_M2(MCF_XBS_PRI_4) |
+@@ -141,6 +169,7 @@ printk(KERN_INFO "Bumping USB Priority\n
+                       MCF_XBS_PRS_M5(MCF_XBS_PRI_6) |
+                       MCF_XBS_PRS_M6(MCF_XBS_PRI_1) |
+                       MCF_XBS_PRS_M7(MCF_XBS_PRI_7));
++#endif
+       
+       m68k_machtype = MACH_CFMMU;
+@@ -152,6 +181,7 @@ printk(KERN_INFO "Bumping USB Priority\n
+       m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
+       m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
++#if defined(CONFIG_M54455)
+       if (!uboot_commandline(m68k_command_line)) {
+ #if defined(CONFIG_BOOTPARAM)
+               strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
+@@ -159,6 +189,10 @@ printk(KERN_INFO "Bumping USB Priority\n
+               strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+ #endif
+       }
++#else
++/* JKM -- hack until mappings get resolved */
++      strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
++#endif
+ #if defined(CONFIG_BLK_DEV_INITRD)
+@@ -185,6 +219,7 @@ printk(KERN_INFO "Bumping USB Priority\n
+       cacr_set(CACHE_INITIAL_MODE);
+ }
++#if defined(CONFIG_M54455)
+ void settimericr(unsigned int timer, unsigned int level)
+ {
+       volatile unsigned char *icrp;
+@@ -202,6 +237,7 @@ void settimericr(unsigned int timer, uns
+               coldfire_enable_irq0(irq);
+       }
+ }
++#endif
+ /* Assembler routines */
+ asmlinkage void buserr(void);
+@@ -214,7 +250,11 @@ void __init coldfire_trap_init(void)
+       int i = 0;
+       e_vector *vectors;
++#if defined(CONFIG_M54455)
+       vectors = (e_vector *)MCF_RAMBAR1;
++#elif defined(CONFIG_M547X_8X)
++      vectors = (e_vector *)MCF_RAMBAR0;
++#endif
+       /*
+        * There is a common trap handler and common interrupt
+        * handler that handle almost every vector. We treat
+@@ -235,6 +275,8 @@ void __init coldfire_trap_init(void)
+       vectors[32] = system_call;
+ }
++#if defined(CONFIG_M54455)
++
+ void coldfire_tick(void)
+ {
+       /* Reset the ColdFire timer */
+@@ -285,13 +327,49 @@ unsigned long coldfire_gettimeoffset(voi
+       return offset;
+ }
++#elif defined(CONFIG_M547X_8X)
++
++void coldfire_tick(void)
++{
++      /* Reset the ColdFire timer */
++      MCF_SSR(0) = MCF_SSR_ST;
++}
++
++void __init coldfire_sched_init(irq_handler_t handler)
++{
++      int irq = ISC_SLTn(0);
++
++      MCF_SCR(0) = 0;
++      MCF_ICR(irq) = ILP_SLT0;
++      request_irq(64 + irq, handler, IRQF_DISABLED, "ColdFire Timer 0", NULL);
++      MCF_SLTCNT(0) = MCF_BUSCLK / HZ;
++      MCF_SCR(0) |=  MCF_SCR_TEN | MCF_SCR_IEN | MCF_SCR_RUN;
++}
++
++unsigned long coldfire_gettimeoffset(void)
++{
++      volatile unsigned long trr, tcn, offset;
++      trr = MCF_SLTCNT(0);
++      tcn = MCF_SCNT(0);
++
++      offset = (trr - tcn) * ((1000000 >> 3) / HZ) / (trr >> 3);
++      if (MCF_SSR(0) & MCF_SSR_ST)
++              offset += 1000000 / HZ;
++
++      return offset;
++}
++
++#endif
++
+ void coldfire_reboot(void)
+ {
++#if defined(CONFIG_M54455)
+       /* disable interrupts and do a software reset */
+       asm("movew #0x2700, %%sr\n\t"
+           "moveb #0x80, %%d0\n\t"
+           "moveb %%d0, 0xfc0a0000\n\t"
+           : : : "%d0");
++#endif
+ }
+ /* int coldfire_hwclk(int i, struct rtc_time *t)
+@@ -305,6 +383,7 @@ static void coldfire_get_model(char *mod
+       sprintf(model, "Version 4 ColdFire");
+ }
++/* JKM -- Why do we need these? */
+ void coldfire_enable_irq(unsigned int vec)
+ {
+       unsigned long flags;
+@@ -318,13 +397,21 @@ void coldfire_enable_irq(unsigned int ve
+       local_irq_save(flags);
+       irq_enable[vec]++;
++#if defined(CONFIG_M54455)
+       if (vec < 32)
+               MCF_INTC0_IMRL &= ~(1 << vec);
+       else
+               MCF_INTC0_IMRH &= ~(1 << (vec - 32));
++#elif defined(CONFIG_M547X_8X)
++      if (vec < 32)
++              MCF_IMRL &= ~(1 << vec);
++      else
++              MCF_IMRH &= ~(1 << (vec - 32));
++#endif
+       local_irq_restore(flags);
+ }
++/* JKM -- Why do we need these? */
+ void coldfire_disable_irq(unsigned int vec)
+ {
+       unsigned long flags;
+@@ -338,10 +425,17 @@ void coldfire_disable_irq(unsigned int v
+       local_irq_save(flags);
+       if (--irq_enable[vec] == 0) {
++#if defined(CONFIG_M54455)
+               if (vec < 32)
+                       MCF_INTC0_IMRL |= (1 << vec);
+               else
+                       MCF_INTC0_IMRH |= (1 << (vec - 32));
++#elif defined(CONFIG_M547X_8X)
++              if (vec < 32)
++                      MCF_IMRL |= (1 << vec);
++              else
++                      MCF_IMRH |= (1 << (vec - 32));
++#endif
+       }
+       local_irq_restore(flags);
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -2,9 +2,9 @@
+  *  head.S is the MMU enabled ColdFire specific initial boot code
+  *
+  *  Ported to ColdFire by
+- *  Matt Waddel Matt.Waddel@freescale.com
+- *  Kurt Mahan kmahan@freescale.com
+- *  Copyright Freescale Semiconductor, Inc. 2007
++ *    Matt Waddel Matt.Waddel@freescale.com
++ *    Kurt Mahan kmahan@freescale.com
++ *  Copyright Freescale Semiconductor, Inc. 2007, 2008
+  *
+  *  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
+@@ -52,6 +52,7 @@
+ #define __FINIT               .previous
+ #endif
++/* JKM -- REVISE DOCS FOR RIGO */
+ /*
+  * Setup ACR mappings to provide the following memory map:
+  *   Data
+@@ -61,13 +62,20 @@
+  *     None currently (mapped via TLBs)
+  */
++#if defined(CONFIG_M54455)
+ #define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
+ #define ACR1_DEFAULT  #0xF00FA040   /* ACR1 default value */
+ #define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+ #define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
+-
+ /* ACR mapping for FPGA (maps 0) */
+ #define ACR0_FPGA     #0x000FA048   /* ACR0 enable FPGA */
++#elif defined(CONFIG_M547X_8X)
++#define ACR0_DEFAULT  #0xE000C040   /* ACR0 default value */
++#define ACR1_DEFAULT  #0x00000000   /* ACR1 default value */
++#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
++#define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
++#endif
++
+ /* Several macros to make the writing of subroutines easier:
+  * - func_start marks the beginning of the routine which setups the frame
+@@ -227,7 +235,7 @@ ENTRY(_stext)
+       .long   BOOTINFOV_MAGIC
+       .long   0
+-1:    jmp     __start-0x80000000
++1:    jmp     __start-(0xc0000000-CONFIG_SDRAM_BASE)
+ .equ  kernel_pg_dir,_stext
+ .equ  .,_stext+0x1000
+@@ -237,19 +245,40 @@ ENTRY(_start)
+ __INIT
+ ENTRY(__start)
++/* JKM -- make sure Rigo handles UBOOT */
+ /* Save the location of u-boot info - cmd line, bd_info, etc. */
+       movel   %a7,%a4         /* Don't use %a4 before cf_early_init */
++/* JKM -- fix to use CONFIG_SDRAM_BASE) */
++#if defined(CONFIG_M54455)
+       addl    #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
++#elif defined(CONFIG_M547X_8X)
++      addl    #0xc0000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
++#endif
++/* JKM -- fix this to work off of CONFIG_SDRAM_BASE */
+ /* Setup initial stack pointer */
++#if defined(CONFIG_M54455)
+       movel   #0x40001000,%sp 
++#elif defined(CONFIG_M547X_8X)
++      movel   #0x00001000,%sp 
++#endif
+ /* Setup usp */
+       subl    %a0,%a0
+       movel   %a0,%usp
++#if defined(CONFIG_M54455)
+       movel  #(MCF_RAMBAR1 + 0x221), %d0
+       movec   %d0, %rambar1
++#elif defined(CONFIG_M547X_8X)
++      movel   #MCF_MBAR, %d0
++      movec   %d0, %mbar
++      move.l  #(MCF_RAMBAR0 + 0x21), %d0
++      movec   %d0, %rambar0
++      move.l  #(MCF_RAMBAR1 + 0x21), %d0
++      movec   %d0, %rambar1
++#endif
++
+       movew   #0x2700,%sr
+ /* reset cache */
+@@ -278,6 +307,7 @@ ENTRY(__start)
+       /* If you change the memory size to another value make a matching 
+          change in paging_init(cf-mmu.c) to zones_size[]. */
++#if defined(CONFIG_M54455)
+       /* Map 256MB as code */
+       mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), \
+               MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
+@@ -383,16 +413,104 @@ ENTRY(__start)
+               MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
+               0, MMUDR_LK, %d0
+-      /* Do unity mapping to enable the MMU.  Map first 16 MB in place as 
+-         code (delete TLBs after MMU is enabled and we are executing in high 
+-         memory). */
++#elif defined(CONFIG_M547X_8X)
++
++      /* Map first 8 MB as code */
++      mmu_map (PAGE_OFFSET+0*1024*1024),  (0*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+1*1024*1024),  (1*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+2*1024*1024),  (2*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+3*1024*1024),  (3*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+4*1024*1024),  (4*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+5*1024*1024),  (5*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+6*1024*1024),  (6*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+7*1024*1024),  (7*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, MMUDR_X, \
++              MMUDR_LK, %d0
++
++      /* Map first 8 MB as data */
++      mmu_map (PAGE_OFFSET+0*1024*1024),  (0*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+1*1024*1024),  (1*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+2*1024*1024),  (2*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+3*1024*1024),  (3*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+4*1024*1024),  (4*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+5*1024*1024),  (5*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+6*1024*1024),  (6*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++      mmu_map (PAGE_OFFSET+7*1024*1024),  (7*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, MMUDR_LK, %d0
++#endif
++      /*
++       * Do unity mapping to enable the MMU.  Map first chunk of memory
++       * in place as code/data.  The TLBs will be deleted after the MMU is
++       * enabled and we are executing in high memory.
++       */
++
++#if defined(CONFIG_M54455)
++      /* Map first 16 MB as code */
+       mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \
+               MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC,  MMUDR_SP, 0, \
+               0, MMUDR_X, 0, %d0
+-      /* Map first 16 MB as data too.  */
++      /* Map first 16 MB as data too  */
+       mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), 0, 0, \
+               MMUTR_SG, MMUDR_SZ16M, MMUDR_DNCP, MMUDR_SP, MMUDR_R, MMUDR_W, \
+               0, 0, %d0
++#elif defined(CONFIG_M547X_8X)
++      /* Map first 4 MB as code */
++      mmu_map (0*1024*1024), (0*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
++              MMUDR_X, 0, %d0
++      mmu_map (1*1024*1024), (1*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
++              MMUDR_X, 0, %d0
++      mmu_map (2*1024*1024), (2*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
++              MMUDR_X, 0, %d0
++      mmu_map (3*1024*1024), (3*1024*1024), MMUOR_ITLB, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_IC,  MMUDR_SP, 0, 0, \
++              MMUDR_X, 0, %d0
++
++      /* Map first 4 MB as data too */
++      mmu_map (0*1024*1024), (0*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, 0, %d0
++      mmu_map (1*1024*1024), (1*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, 0, %d0
++      mmu_map (2*1024*1024), (2*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, 0, %d0
++      mmu_map (3*1024*1024), (3*1024*1024), 0, 0, \
++              MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
++              MMUDR_W, 0, 0, %d0
++#endif
+       /* Turn on MMU */
+       movel   #(MMUCR_EN),%a0
+@@ -412,9 +530,20 @@ ENTRY(__running_high)
+       addl    #PAGE_OFFSET,%a1
+       movel   %a1,%a0@
+-      /* Unmap first 16 MB, code and data.  */
++      /* Unmap unity mappings */
++#if defined(CONFIG_M54455)
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
++#elif defined(CONFIG_M547X_8X)
++      mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
++      mmu_unmap (PHYS_OFFSET+1*0x1000000), MMUOR_ITLB, %d0
++      mmu_unmap (PHYS_OFFSET+2*0x1000000), MMUOR_ITLB, %d0
++      mmu_unmap (PHYS_OFFSET+3*0x1000000), MMUOR_ITLB, %d0
++      mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
++      mmu_unmap (PHYS_OFFSET+1*0x1000000), 0, %d0
++      mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0
++      mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0
++#endif
+ /* Setup initial stack pointer */
+       lea     init_task,%a2 
+@@ -438,8 +567,9 @@ func_start set_context,%d0,(1*4)
+       movec   %d0,%asid
+ func_return   set_context
++#ifdef CONFIG_M54455
+ /*
+- * set_fpga(addr,val)
++ * set_fpga(addr,val) on the M54455EVB
+  *
+  * Map in 0x00000000 -> 0x0fffffff and then do the write.
+  */
+@@ -456,6 +586,7 @@ set_fpga:
+       nop
+       movew   %d1,%sr
+       rts
++#endif
+       .data
+       .align  4
+--- a/arch/m68k/coldfire/ints.c
++++ b/arch/m68k/coldfire/ints.c
+@@ -5,9 +5,10 @@
+  * Copyright (C) 1998  D. Jeff Dionne <jeff@lineo.ca>,
+  *                     Kenneth Albanowski <kjahds@kjahds.com>,
+  * Copyright (C) 2000  Lineo Inc. (www.lineo.com)
+- * Matt Waddel Matt.Waddel@freescale.com
+- * Copyright Freescale Semiconductor, Inc. 2007
+- * Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007, 2008
++ *    Kurt Mahan kmahan@freescale.com
++ *    Matt Waddel Matt.Waddel@freescale.com
+  *
+  * Based on:
+  * linux/arch/m68k/kernel/ints.c &
+@@ -46,7 +47,7 @@ static int irq_depth[SYS_IRQS];
+ /*
+  * IRQ Controller
+  */
+-#ifdef CONFIG_M54455
++#if defined(CONFIG_M54455)
+ void m5445x_irq_enable(unsigned int irq);
+ void m5445x_irq_disable(unsigned int irq);
+ static struct irq_controller m5445x_irq_controller = {
+@@ -55,6 +56,17 @@ static struct irq_controller m5445x_irq_
+       .enable         = m5445x_irq_enable,
+       .disable        = m5445x_irq_disable,
+ };
++#elif defined(CONFIG_M547X_8X)
++void m547x_8x_irq_enable(unsigned int irq);
++void m547x_8x_irq_disable(unsigned int irq);
++static struct irq_controller m547x_8x_irq_controller = {
++      .name           = "M547X_8X",
++      .lock           = SPIN_LOCK_UNLOCKED,
++      .enable         = m547x_8x_irq_enable,
++      .disable        = m547x_8x_irq_disable,
++};
++#else
++# error No IRQ controller defined
+ #endif
+ #define       POOL_SIZE       SYS_IRQS
+@@ -75,9 +87,12 @@ void __init init_IRQ(void)
+ {
+       int i;
+-#ifdef CONFIG_M54455
++#if defined(CONFIG_M54455)
+       for (i = 0; i < SYS_IRQS; i++)
+               irq_controller[i] = &m5445x_irq_controller;
++#elif defined(CONFIG_M547X_8X)
++      for (i = 0; i < SYS_IRQS; i++)
++              irq_controller[i] = &m547x_8x_irq_controller;
+ #endif
+ }
+@@ -381,4 +396,57 @@ void m5445x_irq_disable(unsigned int irq
+               MCF_INTC1_SIMR = irq;
+       }
+ }
++#elif defined(CONFIG_M547X_8X)
++/*
++ * M547X_8X Implementation
++ */
++void m547x_8x_irq_enable(unsigned int irq)
++{
++      /* enable the interrupt hardware */
++      if (irq < 64)
++              return;
++
++      /* adjust past non-hardware ints */
++      irq -= 64;
++
++/* JKM -- re-add EPORT later */
++#if 0
++      /* check for eport */
++      if ((irq > 0) && (irq < 8)) {
++              /* enable eport */
++              MCF_EPORT_EPPAR &= ~(3 << (irq*2));     /* level */
++              MCF_EPORT_EPDDR &= ~(1 << irq);         /* input */
++              MCF_EPORT_EPIER |= 1 << irq;            /* irq enabled */
++      }
++#endif
++
++      if (irq < 32)
++              MCF_IMRL &= ~(1 << irq);
++      else
++              MCF_IMRH &= ~(1 << (irq - 32));
++}
++
++void m547x_8x_irq_disable(unsigned int irq)
++{
++      /* disable the interrupt hardware */
++      if (irq < 64)
++              return;
++
++      /* adjust past non-hardware ints */
++      irq -= 64;
++
++/* JKM -- re-add EPORT later */
++#if 0
++      /* check for eport */
++      if ((irq > 0) && (irq < 8)) {
++              /* disable eport */
++              MCF_EPORT_EPIER &= ~(1 << irq);
++      }
++#endif
++
++      if (irq < 32)
++              MCF_IMRL |= (1 << irq);
++      else
++              MCF_IMRH |= (1 << (irq - 32));
++}
+ #endif
+--- /dev/null
++++ b/arch/m68k/configs/m5485evb_defconfig
+@@ -0,0 +1,777 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.24
++# Thu Feb 21 00:19:01 2008
++#
++CONFIG_M68K=y
++CONFIG_MMU=y
++# CONFIG_GENERIC_TIME is not set
++# CONFIG_GENERIC_CLOCKEVENTS is not set
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_TIME_LOW_RES=y
++CONFIG_GENERIC_IOMAP=y
++# CONFIG_NO_IOPORT is not set
++# CONFIG_NO_DMA is not set
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=17
++# CONFIG_CGROUPS is not set
++CONFIG_FAIR_GROUP_SCHED=y
++CONFIG_FAIR_USER_SCHED=y
++# CONFIG_FAIR_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++# CONFIG_RELAY is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++# CONFIG_EMBEDDED is not set
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++
++#
++# Platform dependent setup
++#
++# CONFIG_SUN3 is not set
++CONFIG_COLDFIRE=y
++CONFIG_CFV4E=y
++# CONFIG_AMIGA is not set
++# CONFIG_ATARI is not set
++# CONFIG_MAC is not set
++# CONFIG_APOLLO is not set
++# CONFIG_VME is not set
++# CONFIG_HP300 is not set
++# CONFIG_SUN3X is not set
++# CONFIG_Q40 is not set
++
++#
++# Processor type
++#
++# CONFIG_M68020 is not set
++# CONFIG_M68030 is not set
++# CONFIG_M68040 is not set
++# CONFIG_M68060 is not set
++# CONFIG_M54455 is not set
++CONFIG_M547X_8X=y
++# CONFIG_M547X is not set
++CONFIG_M548X=y
++# CONFIG_M5475AFE is not set
++# CONFIG_M5475BFE is not set
++# CONFIG_M5475CFE is not set
++# CONFIG_M5475DFE is not set
++# CONFIG_M5475EFE is not set
++# CONFIG_M5475FFE is not set
++# CONFIG_M5485AFE is not set
++# CONFIG_M5485BFE is not set
++CONFIG_M5485CFE=y
++# CONFIG_M5485DFE is not set
++# CONFIG_M5485EFE is not set
++# CONFIG_M5485FFE is not set
++CONFIG_MCFCLK=50000000
++# CONFIG_MCF_USER_HALT is not set
++CONFIG_MMU_CFV4E=y
++CONFIG_SDRAM_BASE=0x00000000
++CONFIG_SDRAM_SIZE=0x04000000
++# CONFIG_M68KFPU_EMU is not set
++CONFIG_ADVANCED=y
++# CONFIG_RMW_INSNS is not set
++CONFIG_SINGLE_MEMORY_CHUNK=y
++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_NEED_MULTIPLE_NODES=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++
++#
++# General setup
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++CONFIG_PROC_HARDWARE=y
++CONFIG_ZONE_DMA=y
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++CONFIG_NET_KEY=y
++# CONFIG_NET_KEY_MIGRATE is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_NET_SCHED is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++# CONFIG_STANDALONE is not set
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_MTD is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=64000
++CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_TGT is not set
++# CONFIG_SCSI_NETLINK is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++CONFIG_SCSI_MULTI_LUN=y
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_SHAPER is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ATKBD is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_COLDFIRE=y
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_COLDFIRE_EDMA is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_SM501 is not set
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++CONFIG_DAB=y
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
++CONFIG_HID_DEBUG=y
++# CONFIG_HIDRAW is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# Character devices
++#
++# CONFIG_SERIAL_CONSOLE is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=y
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++CONFIG_MINIX_FS=y
++# CONFIG_ROMFS_FS is not set
++# CONFIG_INOTIFY is not set
++# CONFIG_QUOTA is not set
++CONFIG_DNOTIFY=y
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=y
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# CONFIG_CONFIGFS_FS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++# CONFIG_NFS_V3 is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++CONFIG_NLS_ISO8859_1=y
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++CONFIG_INSTRUMENTATION=y
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++# CONFIG_ENABLE_MUST_CHECK is not set
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++CONFIG_DEBUG_SLAB=y
++# CONFIG_DEBUG_SLAB_LEAK is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_FRAME_POINTER is not set
++CONFIG_FORCED_INLINING=y
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_BOOTPARAM=y
++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
++
++#
++# CodeTEST Setup
++#
++# CONFIG_CODETEST is not set
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_BLKCIPHER=y
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++# CONFIG_CRYPTO_AUTHENC is not set
++# CONFIG_CRYPTO_HW is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
+--- a/drivers/serial/mcfserial.c
++++ b/drivers/serial/mcfserial.c
+@@ -45,6 +45,11 @@
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+ #include <asm/mcfuart.h>
++#if defined(CONFIG_M547X_8X)
++#include <asm/m5485sim.h>
++#include <asm/m5485psc.h>
++#include <asm/m5485gpio.h>
++#endif
+ #ifdef CONFIG_NETtel
+ #include <asm/nettel.h>
+ #endif
+@@ -64,7 +69,7 @@ struct timer_list mcfrs_timer_struct;
+ #define       DEFAULT_CBAUD           B38400
+ #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \
+       defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \
+-      defined(CONFIG_M54455)
++      defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)
+ #define CONSOLE_BAUD_RATE     115200
+ #define DEFAULT_CBAUD         B115200
+ #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \
+@@ -97,7 +102,8 @@ static struct tty_driver *mcfrs_serial_d
+ #undef SERIAL_DEBUG_FLOW
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) || \
++    defined(CONFIG_M547X_8X)
+ #define       IRQBASE (MCFINT_VECBASE+MCFINT_UART0)
+ #else
+ #define       IRQBASE 73
+@@ -117,7 +123,11 @@ static struct mcf_serial mcfrs_table[] =
+       {  /* ttyS1 */
+               .magic = 0,
+               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE2),
++#if defined(CONFIG_M547X_8X)
++              .irq = IRQBASE-1,
++#else
+               .irq = IRQBASE+1,
++#endif
+               .flags = ASYNC_BOOT_AUTOCONF,
+       },
+ #endif
+@@ -125,7 +135,11 @@ static struct mcf_serial mcfrs_table[] =
+       {  /* ttyS2 */
+               .magic = 0,
+               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE3),
++#if defined(CONFIG_M547X_8X)
++              .irq = IRQBASE-2,
++#else
+               .irq = IRQBASE+2,
++#endif
+               .flags = ASYNC_BOOT_AUTOCONF,
+       },
+ #endif
+@@ -133,7 +147,11 @@ static struct mcf_serial mcfrs_table[] =
+       {  /* ttyS3 */
+               .magic = 0,
+               .addr = (volatile unsigned char *) (MCF_MBAR+MCFUART_BASE4),
++#if defined(CONFIG_M547X_8X)
++              .irq = IRQBASE-3,
++#else
+               .irq = IRQBASE+3,
++#endif
+               .flags = ASYNC_BOOT_AUTOCONF,
+       },
+ #endif
+@@ -412,7 +430,12 @@ irqreturn_t mcfrs_interrupt(int irq, voi
+       struct mcf_serial       *info;
+       unsigned char           isr;
++/* JKM -- revisit! IRQ compute */
++#if defined(CONFIG_M547X_8X)
++      info = &mcfrs_table[(IRQBASE - irq)];
++#else
+       info = &mcfrs_table[(irq - IRQBASE)];
++#endif
+       isr = info->addr[MCFUART_UISR] & info->imr;
+       if (isr & MCFUART_UIR_RXREADY)
+@@ -1621,6 +1644,22 @@ static void mcfrs_irqinit(struct mcf_ser
+               /* GPIOs also must be initalized, depends on board */
+               break;
+       }
++#elif defined(CONFIG_M547X_8X)
++      volatile unsigned char  *uartp;
++      uartp = (volatile unsigned char *)info->addr;
++
++      if (info->line > 3) {
++              printk("SERIAL: don't know how to handle UART %d interrupt?\n",
++                      info->line);
++              return;
++      }
++
++      /* Set GPIO port register to enable PSC(port) signals */
++      MCF_PAR_PSCn(info->line) = (0
++              | MCF_PAR_PSC_TXD
++              | MCF_PAR_PSC_RXD);
++
++      MCF_ICR(info->irq - 64) = ILP_PSCn(info->line);
+ #else
+       volatile unsigned char  *icrp, *uartp;
+@@ -1983,7 +2022,7 @@ struct console mcfrs_console = {
+ static int __init mcfrs_console_init(void)
+ {
+-#ifndef CONFIG_M54455
++#if !(defined(CONFIG_M54455) || defined(CONFIG_M547X_8X))
+       register_console(&mcfrs_console);
+ #endif
+       return 0;
+--- a/include/asm-m68k/cf_pgalloc.h
++++ b/include/asm-m68k/cf_pgalloc.h
+@@ -1,9 +1,14 @@
+ #ifndef M68K_CF_PGALLOC_H
+ #define M68K_CF_PGALLOC_H
++/* JKM -- added -- needed? */
++#include <linux/highmem.h>
++
+ #include <asm/coldfire.h>
+ #include <asm/page.h>
+ #include <asm/cf_tlbflush.h>
++/* JKM -- added -- needed? */
++#include <asm/cf_cacheflush.h>
+ extern inline void pte_free_kernel(pte_t *pte)
+ {
+--- a/include/asm-m68k/cfcache.h
++++ b/include/asm-m68k/cfcache.h
+@@ -70,7 +70,33 @@
+ /* cache disabled for testing */
+ #define CACHE_INITIAL_MODE    (CF_CACR_EUSP)
+ #endif /* CONFIG_M5445X_DISABLE_CACHE */
+-#endif /* CONFIG_M54455 */
++
++#elif defined(CONFIG_M547X_8X)
++/*
++ * M547x/M548x Cache Configuration
++ *    - cache line size is 16 bytes
++ *    - cache is 4-way set associative
++ *    - each cache has 512 sets (128k / 16bytes / 4way)
++ *    - I-Cache size is 32KB
++ *    - D-Cache size is 32KB
++ */
++#define ICACHE_SIZE 0x8000            /* instruction - 32k */
++#define DCACHE_SIZE 0x8000            /* data - 32k */
++
++#define CACHE_LINE_SIZE 0x0010                /* 16 bytes */
++#define CACHE_SETS 0x0200             /* 512 sets */
++#define CACHE_WAYS 0x0004             /* 4 way */
++
++#define CACHE_DISABLE_MODE    (CF_CACR_DCINVA+        \
++                               CF_CACR_BCINVA+        \
++                               CF_CACR_ICINVA)
++
++#define CACHE_INITIAL_MODE    (CF_CACR_DEC+           \
++                               CF_CACR_BEC+           \
++                               CF_CACR_IEC+           \
++                               CF_CACR_DESB+          \
++                               CF_CACR_EUSP)
++#endif /* CONFIG_M547X_8X */
+ #ifndef __ASSEMBLY__
+--- a/include/asm-m68k/coldfire.h
++++ b/include/asm-m68k/coldfire.h
+@@ -1,9 +1,16 @@
+ #ifndef _COLDFIRE_H_
+ #define _COLDFIRE_H_
++#if defined(CONFIG_M54455)
+ #define MCF_MBAR      0x0
+ #define MCF_RAMBAR1   0x40000000
+ #define MCF_SRAM      0x80000000
++#elif defined(CONFIG_M547X_8X)
++#define MCF_MBAR      0xE0000000
++#define MCF_RAMBAR0   0xE3000000
++#define MCF_RAMBAR1   0xE3001000
++#endif
++
+ #define MCF_CLK       CONFIG_MCFCLK
+ #define MCF_BUSCLK    (CONFIG_MCFCLK/2)
+--- /dev/null
++++ b/include/asm-m68k/m5485gpio.h
+@@ -0,0 +1,694 @@
++/*
++ * File:      mcf548x_gpio.h
++ * Purpose:   Register and bit definitions for the MCF548X
++ *
++ * Notes:     
++ *    
++ */
++
++#ifndef _M5485GPIO_H_
++#define _M5485GPIO_H_
++
++/*********************************************************************
++*
++* General Purpose I/O (GPIO)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_GPIO_PODR_FBCTL         MCF_REG08(0x000A00)
++#define MCF_GPIO_PODR_FBCS          MCF_REG08(0x000A01)
++#define MCF_GPIO_PODR_DMA           MCF_REG08(0x000A02)
++#define MCF_GPIO_PODR_FEC0H         MCF_REG08(0x000A04)
++#define MCF_GPIO_PODR_FEC0L         MCF_REG08(0x000A05)
++#define MCF_GPIO_PODR_FEC1H         MCF_REG08(0x000A06)
++#define MCF_GPIO_PODR_FEC1L         MCF_REG08(0x000A07)
++#define MCF_GPIO_PODR_FECI2C        MCF_REG08(0x000A08)
++#define MCF_GPIO_PODR_PCIBG         MCF_REG08(0x000A09)
++#define MCF_GPIO_PODR_PCIBR         MCF_REG08(0x000A0A)
++#define MCF_GPIO_PODR_PSC3PSC2      MCF_REG08(0x000A0C)
++#define MCF_GPIO_PODR_PSC1PSC0      MCF_REG08(0x000A0D)
++#define MCF_GPIO_PODR_DSPI          MCF_REG08(0x000A0E)
++#define MCF_GPIO_PDDR_FBCTL         MCF_REG08(0x000A10)
++#define MCF_GPIO_PDDR_FBCS          MCF_REG08(0x000A11)
++#define MCF_GPIO_PDDR_DMA           MCF_REG08(0x000A12)
++#define MCF_GPIO_PDDR_FEC0H         MCF_REG08(0x000A14)
++#define MCF_GPIO_PDDR_FEC0L         MCF_REG08(0x000A15)
++#define MCF_GPIO_PDDR_FEC1H         MCF_REG08(0x000A16)
++#define MCF_GPIO_PDDR_FEC1L         MCF_REG08(0x000A17)
++#define MCF_GPIO_PDDR_FECI2C        MCF_REG08(0x000A18)
++#define MCF_GPIO_PDDR_PCIBG         MCF_REG08(0x000A19)
++#define MCF_GPIO_PDDR_PCIBR         MCF_REG08(0x000A1A)
++#define MCF_GPIO_PDDR_PSC3PSC2      MCF_REG08(0x000A1C)
++#define MCF_GPIO_PDDR_PSC1PSC0      MCF_REG08(0x000A1D)
++#define MCF_GPIO_PDDR_DSPI          MCF_REG08(0x000A1E)
++#define MCF_GPIO_PPDSDR_FBCTL       MCF_REG08(0x000A20)
++#define MCF_GPIO_PPDSDR_FBCS        MCF_REG08(0x000A21)
++#define MCF_GPIO_PPDSDR_DMA         MCF_REG08(0x000A22)
++#define MCF_GPIO_PPDSDR_FEC0H       MCF_REG08(0x000A24)
++#define MCF_GPIO_PPDSDR_FEC0L       MCF_REG08(0x000A25)
++#define MCF_GPIO_PPDSDR_FEC1H       MCF_REG08(0x000A26)
++#define MCF_GPIO_PPDSDR_FEC1L       MCF_REG08(0x000A27)
++#define MCF_GPIO_PPDSDR_FECI2C      MCF_REG08(0x000A28)
++#define MCF_GPIO_PPDSDR_PCIBG       MCF_REG08(0x000A29)
++#define MCF_GPIO_PPDSDR_PCIBR       MCF_REG08(0x000A2A)
++#define MCF_GPIO_PPDSDR_PSC3PSC2    MCF_REG08(0x000A2C)
++#define MCF_GPIO_PPDSDR_PSC1PSC0    MCF_REG08(0x000A2D)
++#define MCF_GPIO_PPDSDR_DSPI        MCF_REG08(0x000A2E)
++#define MCF_GPIO_PCLRR_FBCTL        MCF_REG08(0x000A30)
++#define MCF_GPIO_PCLRR_FBCS         MCF_REG08(0x000A31)
++#define MCF_GPIO_PCLRR_DMA          MCF_REG08(0x000A32)
++#define MCF_GPIO_PCLRR_FEC0H        MCF_REG08(0x000A34)
++#define MCF_GPIO_PCLRR_FEC0L        MCF_REG08(0x000A35)
++#define MCF_GPIO_PCLRR_FEC1H        MCF_REG08(0x000A36)
++#define MCF_GPIO_PCLRR_FEC1L        MCF_REG08(0x000A37)
++#define MCF_GPIO_PCLRR_FECI2C       MCF_REG08(0x000A38)
++#define MCF_GPIO_PCLRR_PCIBG        MCF_REG08(0x000A39)
++#define MCF_GPIO_PCLRR_PCIBR        MCF_REG08(0x000A3A)
++#define MCF_GPIO_PCLRR_PSC3PSC2     MCF_REG08(0x000A3C)
++#define MCF_GPIO_PCLRR_PSC1PSC0     MCF_REG08(0x000A3D)
++#define MCF_GPIO_PCLRR_DSPI         MCF_REG08(0x000A3E)
++#define MCF_GPIO_PAR_FBCTL          MCF_REG16(0x000A40)
++#define MCF_GPIO_PAR_FBCS           MCF_REG08(0x000A42)
++#define MCF_GPIO_PAR_DMA            MCF_REG08(0x000A43)
++#define MCF_GPIO_PAR_FECI2CIRQ      MCF_REG16(0x000A44)
++#define MCF_GPIO_PAR_PCIBG          MCF_REG16(0x000A48)
++#define MCF_GPIO_PAR_PCIBR          MCF_REG16(0x000A4A)
++#define MCF_GPIO_PAR_PSC3           MCF_REG08(0x000A4C)
++#define MCF_GPIO_PAR_PSC2           MCF_REG08(0x000A4D)
++#define MCF_GPIO_PAR_PSC1           MCF_REG08(0x000A4E)
++#define MCF_GPIO_PAR_PSC0           MCF_REG08(0x000A4F)
++#define MCF_GPIO_PAR_DSPI           MCF_REG16(0x000A50)
++#define MCF_GPIO_PAR_TIMER          MCF_REG08(0x000A52)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FBCTL */
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL0              (0x01)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL1              (0x02)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL2              (0x04)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL3              (0x08)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL4              (0x10)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL5              (0x20)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL6              (0x40)
++#define MCF_GPIO_PODR_FBCTL_PODRFBCTL7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FBCS */
++#define MCF_GPIO_PODR_FBCS_PODRFBCS1                (0x02)
++#define MCF_GPIO_PODR_FBCS_PODRFBCS2                (0x04)
++#define MCF_GPIO_PODR_FBCS_PODRFBCS3                (0x08)
++#define MCF_GPIO_PODR_FBCS_PODRFBCS4                (0x10)
++#define MCF_GPIO_PODR_FBCS_PODRFBCS5                (0x20)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_DMA */
++#define MCF_GPIO_PODR_DMA_PODRDMA0                  (0x01)
++#define MCF_GPIO_PODR_DMA_PODRDMA1                  (0x02)
++#define MCF_GPIO_PODR_DMA_PODRDMA2                  (0x04)
++#define MCF_GPIO_PODR_DMA_PODRDMA3                  (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FEC0H */
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H0              (0x01)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H1              (0x02)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H2              (0x04)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H3              (0x08)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H4              (0x10)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H5              (0x20)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H6              (0x40)
++#define MCF_GPIO_PODR_FEC0H_PODRFEC0H7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FEC0L */
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L0              (0x01)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L1              (0x02)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L2              (0x04)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L3              (0x08)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L4              (0x10)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L5              (0x20)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L6              (0x40)
++#define MCF_GPIO_PODR_FEC0L_PODRFEC0L7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FEC1H */
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H0              (0x01)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H1              (0x02)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H2              (0x04)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H3              (0x08)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H4              (0x10)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H5              (0x20)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H6              (0x40)
++#define MCF_GPIO_PODR_FEC1H_PODRFEC1H7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FEC1L */
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L0              (0x01)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L1              (0x02)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L2              (0x04)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L3              (0x08)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L4              (0x10)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L5              (0x20)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L6              (0x40)
++#define MCF_GPIO_PODR_FEC1L_PODRFEC1L7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_FECI2C */
++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C0            (0x01)
++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C1            (0x02)
++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C2            (0x04)
++#define MCF_GPIO_PODR_FECI2C_PODRFECI2C3            (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_PCIBG */
++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG0              (0x01)
++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG1              (0x02)
++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG2              (0x04)
++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG3              (0x08)
++#define MCF_GPIO_PODR_PCIBG_PODRPCIBG4              (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_PCIBR */
++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR0              (0x01)
++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR1              (0x02)
++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR2              (0x04)
++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR3              (0x08)
++#define MCF_GPIO_PODR_PCIBR_PODRPCIBR4              (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_PSC3PSC2 */
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC20        (0x01)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC21        (0x02)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC22        (0x04)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC23        (0x08)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC24        (0x10)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC25        (0x20)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC26        (0x40)
++#define MCF_GPIO_PODR_PSC3PSC2_PODRPSC3PSC27        (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_PSC1PSC0 */
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC00        (0x01)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC01        (0x02)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC02        (0x04)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC03        (0x08)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC04        (0x10)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC05        (0x20)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC06        (0x40)
++#define MCF_GPIO_PODR_PSC1PSC0_PODRPSC1PSC07        (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PODR_DSPI */
++#define MCF_GPIO_PODR_DSPI_PODRDSPI0                (0x01)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI1                (0x02)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI2                (0x04)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI3                (0x08)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI4                (0x10)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI5                (0x20)
++#define MCF_GPIO_PODR_DSPI_PODRDSPI6                (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FBCTL */
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL0              (0x01)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL1              (0x02)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL2              (0x04)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL3              (0x08)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL4              (0x10)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL5              (0x20)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL6              (0x40)
++#define MCF_GPIO_PDDR_FBCTL_PDDRFBCTL7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FBCS */
++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS1                (0x02)
++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS2                (0x04)
++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS3                (0x08)
++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS4                (0x10)
++#define MCF_GPIO_PDDR_FBCS_PDDRFBCS5                (0x20)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_DMA */
++#define MCF_GPIO_PDDR_DMA_PDDRDMA0                  (0x01)
++#define MCF_GPIO_PDDR_DMA_PDDRDMA1                  (0x02)
++#define MCF_GPIO_PDDR_DMA_PDDRDMA2                  (0x04)
++#define MCF_GPIO_PDDR_DMA_PDDRDMA3                  (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0H */
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H0              (0x01)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H1              (0x02)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H2              (0x04)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H3              (0x08)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H4              (0x10)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H5              (0x20)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H6              (0x40)
++#define MCF_GPIO_PDDR_FEC0H_PDDRFEC0H7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC0L */
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L0              (0x01)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L1              (0x02)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L2              (0x04)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L3              (0x08)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L4              (0x10)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L5              (0x20)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L6              (0x40)
++#define MCF_GPIO_PDDR_FEC0L_PDDRFEC0L7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1H */
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H0              (0x01)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H1              (0x02)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H2              (0x04)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H3              (0x08)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H4              (0x10)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H5              (0x20)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H6              (0x40)
++#define MCF_GPIO_PDDR_FEC1H_PDDRFEC1H7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FEC1L */
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L0              (0x01)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L1              (0x02)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L2              (0x04)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L3              (0x08)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L4              (0x10)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L5              (0x20)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L6              (0x40)
++#define MCF_GPIO_PDDR_FEC1L_PDDRFEC1L7              (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_FECI2C */
++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C0            (0x01)
++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C1            (0x02)
++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C2            (0x04)
++#define MCF_GPIO_PDDR_FECI2C_PDDRFECI2C3            (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBG */
++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG0              (0x01)
++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG1              (0x02)
++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG2              (0x04)
++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG3              (0x08)
++#define MCF_GPIO_PDDR_PCIBG_PDDRPCIBG4              (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_PCIBR */
++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR0              (0x01)
++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR1              (0x02)
++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR2              (0x04)
++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR3              (0x08)
++#define MCF_GPIO_PDDR_PCIBR_PDDRPCIBR4              (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_PSC3PSC2 */
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC20        (0x01)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC21        (0x02)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC22        (0x04)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC23        (0x08)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC24        (0x10)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC25        (0x20)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC26        (0x40)
++#define MCF_GPIO_PDDR_PSC3PSC2_PDDRPSC3PSC27        (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_PSC1PSC0 */
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC00        (0x01)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC01        (0x02)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC02        (0x04)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC03        (0x08)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC04        (0x10)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC05        (0x20)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC06        (0x40)
++#define MCF_GPIO_PDDR_PSC1PSC0_PDDRPSC1PSC07        (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PDDR_DSPI */
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI0                (0x01)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI1                (0x02)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI2                (0x04)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI3                (0x08)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI4                (0x10)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI5                (0x20)
++#define MCF_GPIO_PDDR_DSPI_PDDRDSPI6                (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCTL */
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL0          (0x01)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL1          (0x02)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL2          (0x04)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL3          (0x08)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL4          (0x10)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL5          (0x20)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL6          (0x40)
++#define MCF_GPIO_PPDSDR_FBCTL_PPDSDRFBCTL7          (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FBCS */
++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS1            (0x02)
++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS2            (0x04)
++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS3            (0x08)
++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS4            (0x10)
++#define MCF_GPIO_PPDSDR_FBCS_PPDSDRFBCS5            (0x20)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_DMA */
++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA0              (0x01)
++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA1              (0x02)
++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA2              (0x04)
++#define MCF_GPIO_PPDSDR_DMA_PPDSDRDMA3              (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0H */
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H0          (0x01)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H1          (0x02)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H2          (0x04)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H3          (0x08)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H4          (0x10)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H5          (0x20)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H6          (0x40)
++#define MCF_GPIO_PPDSDR_FEC0H_PPDSDRFEC0H7          (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC0L */
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L0          (0x01)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L1          (0x02)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L2          (0x04)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L3          (0x08)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L4          (0x10)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L5          (0x20)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L6          (0x40)
++#define MCF_GPIO_PPDSDR_FEC0L_PPDSDRFEC0L7          (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1H */
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H0          (0x01)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H1          (0x02)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H2          (0x04)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H3          (0x08)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H4          (0x10)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H5          (0x20)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H6          (0x40)
++#define MCF_GPIO_PPDSDR_FEC1H_PPDSDRFEC1H7          (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FEC1L */
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L0          (0x01)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L1          (0x02)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L2          (0x04)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L3          (0x08)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L4          (0x10)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L5          (0x20)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L6          (0x40)
++#define MCF_GPIO_PPDSDR_FEC1L_PPDSDRFEC1L7          (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_FECI2C */
++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C0        (0x01)
++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C1        (0x02)
++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C2        (0x04)
++#define MCF_GPIO_PPDSDR_FECI2C_PPDSDRFECI2C3        (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBG */
++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG0          (0x01)
++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG1          (0x02)
++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG2          (0x04)
++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG3          (0x08)
++#define MCF_GPIO_PPDSDR_PCIBG_PPDSDRPCIBG4          (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PCIBR */
++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR0          (0x01)
++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR1          (0x02)
++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR2          (0x04)
++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR3          (0x08)
++#define MCF_GPIO_PPDSDR_PCIBR_PPDSDRPCIBR4          (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC3PSC2 */
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC20    (0x01)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC21    (0x02)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC22    (0x04)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC23    (0x08)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC24      (0x10)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PDDRPSC3PSC25      (0x20)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC26    (0x40)
++#define MCF_GPIO_PPDSDR_PSC3PSC2_PPDSDRPSC3PSC27    (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_PSC1PSC0 */
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC00    (0x01)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC01      (0x02)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC02    (0x04)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PDDRPSC1PSC03      (0x08)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC04    (0x10)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC05    (0x20)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC06    (0x40)
++#define MCF_GPIO_PPDSDR_PSC1PSC0_PPDSDRPSC1PSC07    (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PPDSDR_DSPI */
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI0            (0x01)
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI1            (0x02)
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI2            (0x04)
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI3            (0x08)
++#define MCF_GPIO_PPDSDR_DSPI_PDDRDSPI4              (0x10)
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI5            (0x20)
++#define MCF_GPIO_PPDSDR_DSPI_PPDSDRDSPI6            (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCTL */
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL0            (0x01)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL1            (0x02)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL2            (0x04)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL3            (0x08)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL4            (0x10)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL5            (0x20)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL6            (0x40)
++#define MCF_GPIO_PCLRR_FBCTL_PCLRRFBCTL7            (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FBCS */
++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS1              (0x02)
++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS2              (0x04)
++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS3              (0x08)
++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS4              (0x10)
++#define MCF_GPIO_PCLRR_FBCS_PCLRRFBCS5              (0x20)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_DMA */
++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA0                (0x01)
++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA1                (0x02)
++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA2                (0x04)
++#define MCF_GPIO_PCLRR_DMA_PCLRRDMA3                (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0H */
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H0            (0x01)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H1            (0x02)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H2            (0x04)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H3            (0x08)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H4            (0x10)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H5            (0x20)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H6            (0x40)
++#define MCF_GPIO_PCLRR_FEC0H_PCLRRFEC0H7            (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC0L */
++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L0            (0x01)
++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L1             (0x02)
++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L2            (0x04)
++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L3            (0x08)
++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L4             (0x10)
++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L5             (0x20)
++#define MCF_GPIO_PCLRR_FEC0L_PODRFEC0L6             (0x40)
++#define MCF_GPIO_PCLRR_FEC0L_PCLRRFEC0L7            (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1H */
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H0            (0x01)
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H1            (0x02)
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H2            (0x04)
++#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H3             (0x08)
++#define MCF_GPIO_PCLRR_FEC1H_PODRFEC1H4             (0x10)
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H5            (0x20)
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H6            (0x40)
++#define MCF_GPIO_PCLRR_FEC1H_PCLRRFEC1H7            (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FEC1L */
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L0            (0x01)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L1            (0x02)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L2            (0x04)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L3            (0x08)
++#define MCF_GPIO_PCLRR_FEC1L_PODRFEC1L4             (0x10)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L5            (0x20)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L6            (0x40)
++#define MCF_GPIO_PCLRR_FEC1L_PCLRRFEC1L7            (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_FECI2C */
++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C0          (0x01)
++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C1          (0x02)
++#define MCF_GPIO_PCLRR_FECI2C_PODRFECI2C2           (0x04)
++#define MCF_GPIO_PCLRR_FECI2C_PCLRRFECI2C3          (0x08)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBG */
++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG0             (0x01)
++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG1             (0x02)
++#define MCF_GPIO_PCLRR_PCIBG_PODRPCIBG2             (0x04)
++#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG3            (0x08)
++#define MCF_GPIO_PCLRR_PCIBG_PCLRRPCIBG4            (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_PCIBR */
++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR0            (0x01)
++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR1            (0x02)
++#define MCF_GPIO_PCLRR_PCIBR_PCLRRPCIBR2            (0x04)
++#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR3             (0x08)
++#define MCF_GPIO_PCLRR_PCIBR_PODRPCIBR4             (0x10)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC3PSC2 */
++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC20       (0x01)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC21       (0x02)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC22      (0x04)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC23      (0x08)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC24      (0x10)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC25       (0x20)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PODRPSC3PSC26       (0x40)
++#define MCF_GPIO_PCLRR_PSC3PSC2_PCLRRPSC3PSC27      (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_PSC1PSC0 */
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC00      (0x01)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC01      (0x02)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC02      (0x04)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC03      (0x08)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC04      (0x10)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC05      (0x20)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PODRPSC1PSC06       (0x40)
++#define MCF_GPIO_PCLRR_PSC1PSC0_PCLRRPSC1PSC07      (0x80)
++
++/* Bit definitions and macros for MCF_GPIO_PCLRR_DSPI */
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI0              (0x01)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI1              (0x02)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI2              (0x04)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI3              (0x08)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI4              (0x10)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI5              (0x20)
++#define MCF_GPIO_PCLRR_DSPI_PCLRRDSPI6              (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_FBCTL */
++#define MCF_GPIO_PAR_FBCTL_PAR_TS(x)                (((x)&0x0003)<<0)
++#define MCF_GPIO_PAR_FBCTL_PAR_TA                   (0x0004)
++#define MCF_GPIO_PAR_FBCTL_PAR_RWB                  (0x0010)
++#define MCF_GPIO_PAR_FBCTL_PAR_OE                   (0x0040)
++#define MCF_GPIO_PAR_FBCTL_PAR_BWE0                 (0x0100)
++#define MCF_GPIO_PAR_FBCTL_PAR_BWE1                 (0x0400)
++#define MCF_GPIO_PAR_FBCTL_PAR_BWE2                 (0x1000)
++#define MCF_GPIO_PAR_FBCTL_PAR_BWE3                 (0x4000)
++#define MCF_GPIO_PAR_FBCTL_PAR_TS_GPIO              (0)
++#define MCF_GPIO_PAR_FBCTL_PAR_TS_TBST              (2)
++#define MCF_GPIO_PAR_FBCTL_PAR_TS_TS                (3)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_FBCS */
++#define MCF_GPIO_PAR_FBCS_PAR_CS1                   (0x02)
++#define MCF_GPIO_PAR_FBCS_PAR_CS2                   (0x04)
++#define MCF_GPIO_PAR_FBCS_PAR_CS3                   (0x08)
++#define MCF_GPIO_PAR_FBCS_PAR_CS4                   (0x10)
++#define MCF_GPIO_PAR_FBCS_PAR_CS5                   (0x20)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_DMA */
++#define MCF_GPIO_PAR_DMA_PAR_DREQ0(x)               (((x)&0x03)<<0)
++#define MCF_GPIO_PAR_DMA_PAR_DREQ1(x)               (((x)&0x03)<<2)
++#define MCF_GPIO_PAR_DMA_PAR_DACK0(x)               (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_DMA_PAR_DACK1(x)               (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_DMA_PAR_DACKx_GPIO             (0)
++#define MCF_GPIO_PAR_DMA_PAR_DACKx_TOUT             (2)
++#define MCF_GPIO_PAR_DMA_PAR_DACKx_DACK             (3)
++#define MCF_GPIO_PAR_DMA_PAR_DREQx_GPIO             (0)
++#define MCF_GPIO_PAR_DMA_PAR_DREQx_TIN              (2)
++#define MCF_GPIO_PAR_DMA_PAR_DREQx_DREQ             (3)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_FECI2CIRQ */
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ5             (0x0001)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_IRQ6             (0x0002)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SCL              (0x0004)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_SDA              (0x0008)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC(x)         (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO(x)        (((x)&0x0003)<<8)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MII            (0x0400)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E17              (0x0800)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDC            (0x1000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MDIO           (0x2000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E0MII            (0x4000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E07              (0x8000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_CANRX     (0x0000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_SDA       (0x0200)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDIO_EMDIO     (0x0300)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_CANTX      (0x0000)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_SCL        (0x0080)
++#define MCF_GPIO_PAR_FECI2CIRQ_PAR_E1MDC_EMDC       (0x00C0)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PCIBG */
++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG0(x)            (((x)&0x0003)<<0)
++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG1(x)            (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG2(x)            (((x)&0x0003)<<4)
++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG3(x)            (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_PCIBG_PAR_PCIBG4(x)            (((x)&0x0003)<<8)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PCIBR */
++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG0(x)            (((x)&0x0003)<<0)
++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG1(x)            (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG2(x)            (((x)&0x0003)<<4)
++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBG3(x)            (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_PCIBR_PAR_PCIBR4(x)            (((x)&0x0003)<<8)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PSC3 */
++#define MCF_GPIO_PAR_PSC3_PAR_TXD3                  (0x04)
++#define MCF_GPIO_PAR_PSC3_PAR_RXD3                  (0x08)
++#define MCF_GPIO_PAR_PSC3_PAR_RTS3(x)               (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_PSC3_PAR_CTS3(x)               (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_BCLK             (0x80)
++#define MCF_GPIO_PAR_PSC3_PAR_CTS3_CTS              (0xC0)
++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_FSYNC            (0x20)
++#define MCF_GPIO_PAR_PSC3_PAR_RTS3_RTS              (0x30)
++#define MCF_GPIO_PAR_PSC3_PAR_CTS2_CANRX            (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PSC2 */
++#define MCF_GPIO_PAR_PSC2_PAR_TXD2                  (0x04)
++#define MCF_GPIO_PAR_PSC2_PAR_RXD2                  (0x08)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2(x)               (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_PSC2_PAR_CTS2(x)               (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_BCLK             (0x80)
++#define MCF_GPIO_PAR_PSC2_PAR_CTS2_CTS              (0xC0)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANTX            (0x10)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_FSYNC            (0x20)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_RTS              (0x30)
++#define MCF_GPIO_PAR_PSC2_PAR_RTS2_CANRX            (0x40)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PSC1 */
++#define MCF_GPIO_PAR_PSC1_PAR_TXD1                  (0x04)
++#define MCF_GPIO_PAR_PSC1_PAR_RXD1                  (0x08)
++#define MCF_GPIO_PAR_PSC1_PAR_RTS1(x)               (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_PSC1_PAR_CTS1(x)               (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_BCLK             (0x80)
++#define MCF_GPIO_PAR_PSC1_PAR_CTS1_CTS              (0xC0)
++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_FSYNC            (0x20)
++#define MCF_GPIO_PAR_PSC1_PAR_RTS1_RTS              (0x30)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_PSC0 */
++#define MCF_GPIO_PAR_PSC0_PAR_TXD0                  (0x04)
++#define MCF_GPIO_PAR_PSC0_PAR_RXD0                  (0x08)
++#define MCF_GPIO_PAR_PSC0_PAR_RTS0(x)               (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_PSC0_PAR_CTS0(x)               (((x)&0x03)<<6)
++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_BCLK             (0x80)
++#define MCF_GPIO_PAR_PSC0_PAR_CTS0_CTS              (0xC0)
++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_GPIO             (0x00)
++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_FSYNC            (0x20)
++#define MCF_GPIO_PAR_PSC0_PAR_RTS0_RTS              (0x30)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_DSPI */
++#define MCF_GPIO_PAR_DSPI_PAR_SOUT(x)               (((x)&0x0003)<<0)
++#define MCF_GPIO_PAR_DSPI_PAR_SIN(x)                (((x)&0x0003)<<2)
++#define MCF_GPIO_PAR_DSPI_PAR_SCK(x)                (((x)&0x0003)<<4)
++#define MCF_GPIO_PAR_DSPI_PAR_CS0(x)                (((x)&0x0003)<<6)
++#define MCF_GPIO_PAR_DSPI_PAR_CS2(x)                (((x)&0x0003)<<8)
++#define MCF_GPIO_PAR_DSPI_PAR_CS3(x)                (((x)&0x0003)<<10)
++#define MCF_GPIO_PAR_DSPI_PAR_CS5                   (0x1000)
++#define MCF_GPIO_PAR_DSPI_PAR_CS3_GPIO              (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_CS3_CANTX             (0x0400)
++#define MCF_GPIO_PAR_DSPI_PAR_CS3_TOUT              (0x0800)
++#define MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS            (0x0C00)
++#define MCF_GPIO_PAR_DSPI_PAR_CS2_GPIO              (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_CS2_CANTX             (0x0100)
++#define MCF_GPIO_PAR_DSPI_PAR_CS2_TOUT              (0x0200)
++#define MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS            (0x0300)
++#define MCF_GPIO_PAR_DSPI_PAR_CS0_GPIO              (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_CS0_FSYNC             (0x0040)
++#define MCF_GPIO_PAR_DSPI_PAR_CS0_RTS               (0x0080)
++#define MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS            (0x00C0)
++#define MCF_GPIO_PAR_DSPI_PAR_SCK_GPIO              (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_SCK_BCLK              (0x0010)
++#define MCF_GPIO_PAR_DSPI_PAR_SCK_CTS               (0x0020)
++#define MCF_GPIO_PAR_DSPI_PAR_SCK_SCK               (0x0030)
++#define MCF_GPIO_PAR_DSPI_PAR_SIN_GPIO              (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_SIN_RXD               (0x0008)
++#define MCF_GPIO_PAR_DSPI_PAR_SIN_SIN               (0x000C)
++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_GPIO             (0x0000)
++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_TXD              (0x0002)
++#define MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT             (0x0003)
++
++/* Bit definitions and macros for MCF_GPIO_PAR_TIMER */
++#define MCF_GPIO_PAR_TIMER_PAR_TOUT2                (0x01)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN2(x)              (((x)&0x03)<<1)
++#define MCF_GPIO_PAR_TIMER_PAR_TOUT3                (0x08)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN3(x)              (((x)&0x03)<<4)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_CANRX           (0x00)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_IRQ             (0x20)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN3_TIN             (0x30)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_CANRX           (0x00)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_IRQ             (0x04)
++#define MCF_GPIO_PAR_TIMER_PAR_TIN2_TIN             (0x06)
++
++/********************************************************************/
++
++#endif /* _M5485GPIO_H_ */
+--- /dev/null
++++ b/include/asm-m68k/m5485gpt.h
+@@ -0,0 +1,88 @@
++/*
++ * File:      mcf548x_gpt.h
++ * Purpose:   Register and bit definitions for the MCF548X
++ *
++ * Notes:     
++ *    
++ */
++
++#ifndef __MCF548X_GPT_H__
++#define __MCF548X_GPT_H__
++
++/*********************************************************************
++*
++* General Purpose Timers (GPT)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_GPT_GMS0       MCF_REG32(0x000800)
++#define MCF_GPT_GCIR0      MCF_REG32(0x000804)
++#define MCF_GPT_GPWM0      MCF_REG32(0x000808)
++#define MCF_GPT_GSR0       MCF_REG32(0x00080C)
++#define MCF_GPT_GMS1       MCF_REG32(0x000810)
++#define MCF_GPT_GCIR1      MCF_REG32(0x000814)
++#define MCF_GPT_GPWM1      MCF_REG32(0x000818)
++#define MCF_GPT_GSR1       MCF_REG32(0x00081C)
++#define MCF_GPT_GMS2       MCF_REG32(0x000820)
++#define MCF_GPT_GCIR2      MCF_REG32(0x000824)
++#define MCF_GPT_GPWM2      MCF_REG32(0x000828)
++#define MCF_GPT_GSR2       MCF_REG32(0x00082C)
++#define MCF_GPT_GMS3       MCF_REG32(0x000830)
++#define MCF_GPT_GCIR3      MCF_REG32(0x000834)
++#define MCF_GPT_GPWM3      MCF_REG32(0x000838)
++#define MCF_GPT_GSR3       MCF_REG32(0x00083C)
++#define MCF_GPT_GMS(x)     MCF_REG32(0x000800+((x)*0x010))
++#define MCF_GPT_GCIR(x)    MCF_REG32(0x000804+((x)*0x010))
++#define MCF_GPT_GPWM(x)    MCF_REG32(0x000808+((x)*0x010))
++#define MCF_GPT_GSR(x)     MCF_REG32(0x00080C+((x)*0x010))
++
++/* Bit definitions and macros for MCF_GPT_GMS */
++#define MCF_GPT_GMS_TMS(x)         (((x)&0x00000007)<<0)
++#define MCF_GPT_GMS_GPIO(x)        (((x)&0x00000003)<<4)
++#define MCF_GPT_GMS_IEN            (0x00000100)
++#define MCF_GPT_GMS_OD             (0x00000200)
++#define MCF_GPT_GMS_SC             (0x00000400)
++#define MCF_GPT_GMS_CE             (0x00001000)
++#define MCF_GPT_GMS_WDEN           (0x00008000)
++#define MCF_GPT_GMS_ICT(x)         (((x)&0x00000003)<<16)
++#define MCF_GPT_GMS_OCT(x)         (((x)&0x00000003)<<20)
++#define MCF_GPT_GMS_OCPW(x)        (((x)&0x000000FF)<<24)
++#define MCF_GPT_GMS_OCT_FRCLOW     (0x00000000)
++#define MCF_GPT_GMS_OCT_PULSEHI    (0x00100000)
++#define MCF_GPT_GMS_OCT_PULSELO    (0x00200000)
++#define MCF_GPT_GMS_OCT_TOGGLE     (0x00300000)
++#define MCF_GPT_GMS_ICT_ANY        (0x00000000)
++#define MCF_GPT_GMS_ICT_RISE       (0x00010000)
++#define MCF_GPT_GMS_ICT_FALL       (0x00020000)
++#define MCF_GPT_GMS_ICT_PULSE      (0x00030000)
++#define MCF_GPT_GMS_GPIO_INPUT     (0x00000000)
++#define MCF_GPT_GMS_GPIO_OUTLO     (0x00000020)
++#define MCF_GPT_GMS_GPIO_OUTHI     (0x00000030)
++#define MCF_GPT_GMS_TMS_DISABLE    (0x00000000)
++#define MCF_GPT_GMS_TMS_INCAPT     (0x00000001)
++#define MCF_GPT_GMS_TMS_OUTCAPT    (0x00000002)
++#define MCF_GPT_GMS_TMS_PWM        (0x00000003)
++#define MCF_GPT_GMS_TMS_GPIO       (0x00000004)
++
++/* Bit definitions and macros for MCF_GPT_GCIR */
++#define MCF_GPT_GCIR_CNT(x)        (((x)&0x0000FFFF)<<0)
++#define MCF_GPT_GCIR_PRE(x)        (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_GPT_GPWM */
++#define MCF_GPT_GPWM_LOAD          (0x00000001)
++#define MCF_GPT_GPWM_PWMOP         (0x00000100)
++#define MCF_GPT_GPWM_WIDTH(x)      (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_GPT_GSR */
++#define MCF_GPT_GSR_CAPT           (0x00000001)
++#define MCF_GPT_GSR_COMP           (0x00000002)
++#define MCF_GPT_GSR_PWMP           (0x00000004)
++#define MCF_GPT_GSR_TEXP           (0x00000008)
++#define MCF_GPT_GSR_PIN            (0x00000100)
++#define MCF_GPT_GSR_OVF(x)         (((x)&0x00000007)<<12)
++#define MCF_GPT_GSR_CAPTURE(x)     (((x)&0x0000FFFF)<<16)
++
++/********************************************************************/
++
++#endif /* __MCF548X_GPT_H__ */
+--- /dev/null
++++ b/include/asm-m68k/m5485psc.h
+@@ -0,0 +1,474 @@
++/*
++ * File:      mcf548x_psc.h
++ * Purpose:   Register and bit definitions for the MCF548X
++ *
++ * Notes:     
++ *    
++ */
++
++#ifndef __MCF548X_PSC_H__
++#define __MCF548X_PSC_H__
++
++/*********************************************************************
++*
++* Programmable Serial Controller (PSC)
++*
++*********************************************************************/
++
++/* Register read/write macros */
++#define MCF_PSC_MR0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600))
++#define MCF_PSC_SR0            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604))
++#define MCF_PSC_CSR0           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604))
++#define MCF_PSC_CR0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608))
++#define MCF_PSC_RB0            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
++#define MCF_PSC_TB0            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
++#define MCF_PSC_TB_8BIT0       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
++#define MCF_PSC_TB_16BIT0      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
++#define MCF_PSC_TB_AC970       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C))
++#define MCF_PSC_IPCR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610))
++#define MCF_PSC_ACR0           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610))
++#define MCF_PSC_ISR0           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614))
++#define MCF_PSC_IMR0           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614))
++#define MCF_PSC_CTUR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618))
++#define MCF_PSC_CTLR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C))
++#define MCF_PSC_IP0            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634))
++#define MCF_PSC_OPSET0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638))
++#define MCF_PSC_OPRESET0       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C))
++#define MCF_PSC_SICR0          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640))
++#define MCF_PSC_IRCR10         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644))
++#define MCF_PSC_IRCR20         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648))
++#define MCF_PSC_IRSDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C))
++#define MCF_PSC_IRMDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650))
++#define MCF_PSC_IRFDR0         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654))
++#define MCF_PSC_RFCNT0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658))
++#define MCF_PSC_TFCNT0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C))
++#define MCF_PSC_RFSR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664))
++#define MCF_PSC_TFSR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684))
++#define MCF_PSC_RFCR0          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668))
++#define MCF_PSC_TFCR0          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688))
++#define MCF_PSC_RFAR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00866E))
++#define MCF_PSC_TFAR0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00868E))
++#define MCF_PSC_RFRP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672))
++#define MCF_PSC_TFRP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692))
++#define MCF_PSC_RFWP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676))
++#define MCF_PSC_TFWP0          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696))
++#define MCF_PSC_RLRFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A))
++#define MCF_PSC_TLRFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A))
++#define MCF_PSC_RLWFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E))
++#define MCF_PSC_TLWFP0         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E))
++#define MCF_PSC_MR1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008700))
++#define MCF_PSC_SR1            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008704))
++#define MCF_PSC_CSR1           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008704))
++#define MCF_PSC_CR1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008708))
++#define MCF_PSC_RB1            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
++#define MCF_PSC_TB1            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
++#define MCF_PSC_TB_8BIT1       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
++#define MCF_PSC_TB_16BIT1      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
++#define MCF_PSC_TB_AC971       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00870C))
++#define MCF_PSC_IPCR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710))
++#define MCF_PSC_ACR1           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008710))
++#define MCF_PSC_ISR1           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714))
++#define MCF_PSC_IMR1           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008714))
++#define MCF_PSC_CTUR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008718))
++#define MCF_PSC_CTLR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00871C))
++#define MCF_PSC_IP1            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008734))
++#define MCF_PSC_OPSET1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008738))
++#define MCF_PSC_OPRESET1       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00873C))
++#define MCF_PSC_SICR1          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008740))
++#define MCF_PSC_IRCR11         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008744))
++#define MCF_PSC_IRCR21         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008748))
++#define MCF_PSC_IRSDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00874C))
++#define MCF_PSC_IRMDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008750))
++#define MCF_PSC_IRFDR1         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008754))
++#define MCF_PSC_RFCNT1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008758))
++#define MCF_PSC_TFCNT1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00875C))
++#define MCF_PSC_RFSR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008764))
++#define MCF_PSC_TFSR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008784))
++#define MCF_PSC_RFCR1          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008768))
++#define MCF_PSC_TFCR1          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008788))
++#define MCF_PSC_RFAR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00876E))
++#define MCF_PSC_TFAR1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00878E))
++#define MCF_PSC_RFRP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008772))
++#define MCF_PSC_TFRP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008792))
++#define MCF_PSC_RFWP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008776))
++#define MCF_PSC_TFWP1          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008796))
++#define MCF_PSC_RLRFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877A))
++#define MCF_PSC_TLRFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879A))
++#define MCF_PSC_RLWFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00877E))
++#define MCF_PSC_TLWFP1         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00879E))
++#define MCF_PSC_MR2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008800))
++#define MCF_PSC_SR2            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008804))
++#define MCF_PSC_CSR2           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008804))
++#define MCF_PSC_CR2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008808))
++#define MCF_PSC_RB2            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
++#define MCF_PSC_TB2            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
++#define MCF_PSC_TB_8BIT2       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
++#define MCF_PSC_TB_16BIT2      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
++#define MCF_PSC_TB_AC972       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00880C))
++#define MCF_PSC_IPCR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810))
++#define MCF_PSC_ACR2           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008810))
++#define MCF_PSC_ISR2           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814))
++#define MCF_PSC_IMR2           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008814))
++#define MCF_PSC_CTUR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008818))
++#define MCF_PSC_CTLR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00881C))
++#define MCF_PSC_IP2            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008834))
++#define MCF_PSC_OPSET2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008838))
++#define MCF_PSC_OPRESET2       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00883C))
++#define MCF_PSC_SICR2          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008840))
++#define MCF_PSC_IRCR12         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008844))
++#define MCF_PSC_IRCR22         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008848))
++#define MCF_PSC_IRSDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00884C))
++#define MCF_PSC_IRMDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008850))
++#define MCF_PSC_IRFDR2         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008854))
++#define MCF_PSC_RFCNT2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008858))
++#define MCF_PSC_TFCNT2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00885C))
++#define MCF_PSC_RFSR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008864))
++#define MCF_PSC_TFSR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008884))
++#define MCF_PSC_RFCR2          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008868))
++#define MCF_PSC_TFCR2          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008888))
++#define MCF_PSC_RFAR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00886E))
++#define MCF_PSC_TFAR2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00888E))
++#define MCF_PSC_RFRP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008872))
++#define MCF_PSC_TFRP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008892))
++#define MCF_PSC_RFWP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008876))
++#define MCF_PSC_TFWP2          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008896))
++#define MCF_PSC_RLRFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887A))
++#define MCF_PSC_TLRFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889A))
++#define MCF_PSC_RLWFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00887E))
++#define MCF_PSC_TLWFP2         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00889E))
++#define MCF_PSC_MR3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008900))
++#define MCF_PSC_SR3            (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008904))
++#define MCF_PSC_CSR3           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008904))
++#define MCF_PSC_CR3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008908))
++#define MCF_PSC_RB3            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
++#define MCF_PSC_TB3            (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
++#define MCF_PSC_TB_8BIT3       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
++#define MCF_PSC_TB_16BIT3      (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
++#define MCF_PSC_TB_AC973       (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00890C))
++#define MCF_PSC_IPCR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910))
++#define MCF_PSC_ACR3           (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008910))
++#define MCF_PSC_ISR3           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914))
++#define MCF_PSC_IMR3           (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008914))
++#define MCF_PSC_CTUR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008918))
++#define MCF_PSC_CTLR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00891C))
++#define MCF_PSC_IP3            (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008934))
++#define MCF_PSC_OPSET3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008938))
++#define MCF_PSC_OPRESET3       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00893C))
++#define MCF_PSC_SICR3          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008940))
++#define MCF_PSC_IRCR13         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008944))
++#define MCF_PSC_IRCR23         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008948))
++#define MCF_PSC_IRSDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00894C))
++#define MCF_PSC_IRMDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008950))
++#define MCF_PSC_IRFDR3         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008954))
++#define MCF_PSC_RFCNT3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008958))
++#define MCF_PSC_TFCNT3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00895C))
++#define MCF_PSC_RFSR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008964))
++#define MCF_PSC_TFSR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008984))
++#define MCF_PSC_RFCR3          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008968))
++#define MCF_PSC_TFCR3          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008988))
++#define MCF_PSC_RFAR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00896E))
++#define MCF_PSC_TFAR3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00898E))
++#define MCF_PSC_RFRP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008972))
++#define MCF_PSC_TFRP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008992))
++#define MCF_PSC_RFWP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008976))
++#define MCF_PSC_TFWP3          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008996))
++#define MCF_PSC_RLRFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897A))
++#define MCF_PSC_TLRFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899A))
++#define MCF_PSC_RLWFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00897E))
++#define MCF_PSC_TLWFP3         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00899E))
++#define MCF_PSC_MR(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008600+((x)*0x100)))
++#define MCF_PSC_SR(x)          (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008604+((x)*0x100)))
++#define MCF_PSC_CSR(x)         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008604+((x)*0x100)))
++#define MCF_PSC_CR(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008608+((x)*0x100)))
++#define MCF_PSC_RB(x)          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
++#define MCF_PSC_TB(x)          (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
++#define MCF_PSC_TB_8BIT(x)     (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
++#define MCF_PSC_TB_16BIT(x)    (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
++#define MCF_PSC_TB_AC97(x)     (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x00860C+((x)*0x100)))
++#define MCF_PSC_IPCR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100)))
++#define MCF_PSC_ACR(x)         (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008610+((x)*0x100)))
++#define MCF_PSC_ISR(x)         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100)))
++#define MCF_PSC_IMR(x)         (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008614+((x)*0x100)))
++#define MCF_PSC_CTUR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008618+((x)*0x100)))
++#define MCF_PSC_CTLR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00861C+((x)*0x100)))
++#define MCF_PSC_IP(x)          (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008634+((x)*0x100)))
++#define MCF_PSC_OPSET(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008638+((x)*0x100)))
++#define MCF_PSC_OPRESET(x)     (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00863C+((x)*0x100)))
++#define MCF_PSC_SICR(x)        (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008640+((x)*0x100)))
++#define MCF_PSC_IRCR1(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008644+((x)*0x100)))
++#define MCF_PSC_IRCR2(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008648+((x)*0x100)))
++#define MCF_PSC_IRSDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x00864C+((x)*0x100)))
++#define MCF_PSC_IRMDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008650+((x)*0x100)))
++#define MCF_PSC_IRFDR(x)       (*(volatile uint8_t *)(void*)(MCF_MBAR + 0x008654+((x)*0x100)))
++#define MCF_PSC_RFCNT(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008658+((x)*0x100)))
++#define MCF_PSC_TFCNT(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00865C+((x)*0x100)))
++#define MCF_PSC_RFSR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008664+((x)*0x100)))
++#define MCF_PSC_TFSR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008684+((x)*0x100)))
++#define MCF_PSC_RFCR(x)        (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008668+((x)*0x100)))
++#define MCF_PSC_TFCR(x)        (*(volatile uint32_t*)(void*)(MCF_MBAR + 0x008688+((x)*0x100)))
++#define MCF_PSC_RFAR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00866E)+((x)*0x100)))
++#define MCF_PSC_TFAR(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + (0x00868E)+((x)*0x100)))
++#define MCF_PSC_RFRP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008672+((x)*0x100)))
++#define MCF_PSC_TFRP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008692+((x)*0x100)))
++#define MCF_PSC_RFWP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008676+((x)*0x100)))
++#define MCF_PSC_TFWP(x)        (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x008696+((x)*0x100)))
++#define MCF_PSC_RLRFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867A+((x)*0x100)))
++#define MCF_PSC_TLRFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869A+((x)*0x100)))
++#define MCF_PSC_RLWFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00867E+((x)*0x100)))
++#define MCF_PSC_TLWFP(x)       (*(volatile uint16_t*)(void*)(MCF_MBAR + 0x00869E+((x)*0x100)))
++
++/* Bit definitions and macros for MCF_PSC_MR */
++#define MCF_PSC_MR_BC(x)              (((x)&0x03)<<0)
++#define MCF_PSC_MR_PT                 (0x04)
++#define MCF_PSC_MR_PM(x)              (((x)&0x03)<<3)
++#define MCF_PSC_MR_ERR                (0x20)
++#define MCF_PSC_MR_RXIRQ              (0x40)
++#define MCF_PSC_MR_RXRTS              (0x80)
++#define MCF_PSC_MR_SB(x)              (((x)&0x0F)<<0)
++#define MCF_PSC_MR_TXCTS              (0x10)
++#define MCF_PSC_MR_TXRTS              (0x20)
++#define MCF_PSC_MR_CM(x)              (((x)&0x03)<<6)
++#define MCF_PSC_MR_PM_MULTI_ADDR      (0x1C)
++#define MCF_PSC_MR_PM_MULTI_DATA      (0x18)
++#define MCF_PSC_MR_PM_NONE            (0x10)
++#define MCF_PSC_MR_PM_FORCE_HI        (0x0C)
++#define MCF_PSC_MR_PM_FORCE_LO        (0x08)
++#define MCF_PSC_MR_PM_ODD             (0x04)
++#define MCF_PSC_MR_PM_EVEN            (0x00)
++#define MCF_PSC_MR_BC_5               (0x00)
++#define MCF_PSC_MR_BC_6               (0x01)
++#define MCF_PSC_MR_BC_7               (0x02)
++#define MCF_PSC_MR_BC_8               (0x03)
++#define MCF_PSC_MR_CM_NORMAL          (0x00)
++#define MCF_PSC_MR_CM_ECHO            (0x40)
++#define MCF_PSC_MR_CM_LOCAL_LOOP      (0x80)
++#define MCF_PSC_MR_CM_REMOTE_LOOP     (0xC0)
++#define MCF_PSC_MR_SB_STOP_BITS_1     (0x07)
++#define MCF_PSC_MR_SB_STOP_BITS_15    (0x08)
++#define MCF_PSC_MR_SB_STOP_BITS_2     (0x0F)
++
++/* Bit definitions and macros for MCF_PSC_SR */
++#define MCF_PSC_SR_ERR                (0x0040)
++#define MCF_PSC_SR_CDE_DEOF           (0x0080)
++#define MCF_PSC_SR_RXRDY              (0x0100)
++#define MCF_PSC_SR_FU                 (0x0200)
++#define MCF_PSC_SR_TXRDY              (0x0400)
++#define MCF_PSC_SR_TXEMP_URERR        (0x0800)
++#define MCF_PSC_SR_OE                 (0x1000)
++#define MCF_PSC_SR_PE_CRCERR          (0x2000)
++#define MCF_PSC_SR_FE_PHYERR          (0x4000)
++#define MCF_PSC_SR_RB_NEOF            (0x8000)
++
++/* Bit definitions and macros for MCF_PSC_CSR */
++#define MCF_PSC_CSR_TCSEL(x)          (((x)&0x0F)<<0)
++#define MCF_PSC_CSR_RCSEL(x)          (((x)&0x0F)<<4)
++#define MCF_PSC_CSR_RCSEL_SYS_CLK     (0xD0)
++#define MCF_PSC_CSR_RCSEL_CTM16       (0xE0)
++#define MCF_PSC_CSR_RCSEL_CTM         (0xF0)
++#define MCF_PSC_CSR_TCSEL_SYS_CLK     (0x0D)
++#define MCF_PSC_CSR_TCSEL_CTM16       (0x0E)
++#define MCF_PSC_CSR_TCSEL_CTM         (0x0F)
++
++/* Bit definitions and macros for MCF_PSC_CR */
++#define MCF_PSC_CR_RXC(x)             (((x)&0x03)<<0)
++#define MCF_PSC_CR_TXC(x)             (((x)&0x03)<<2)
++#define MCF_PSC_CR_MISC(x)            (((x)&0x07)<<4)
++#define MCF_PSC_CR_NONE               (0x00)
++#define MCF_PSC_CR_STOP_BREAK         (0x70)
++#define MCF_PSC_CR_START_BREAK        (0x60)
++#define MCF_PSC_CR_BKCHGINT           (0x50)
++#define MCF_PSC_CR_RESET_ERROR        (0x40)
++#define MCF_PSC_CR_RESET_TX           (0x30)
++#define MCF_PSC_CR_RESET_RX           (0x20)
++#define MCF_PSC_CR_RESET_MR           (0x10)
++#define MCF_PSC_CR_TX_DISABLED        (0x08)
++#define MCF_PSC_CR_TX_ENABLED         (0x04)
++#define MCF_PSC_CR_RX_DISABLED        (0x02)
++#define MCF_PSC_CR_RX_ENABLED         (0x01)
++
++/* Bit definitions and macros for MCF_PSC_TB_8BIT */
++#define MCF_PSC_TB_8BIT_TB3(x)        (((x)&0x000000FF)<<0)
++#define MCF_PSC_TB_8BIT_TB2(x)        (((x)&0x000000FF)<<8)
++#define MCF_PSC_TB_8BIT_TB1(x)        (((x)&0x000000FF)<<16)
++#define MCF_PSC_TB_8BIT_TB0(x)        (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PSC_TB_16BIT */
++#define MCF_PSC_TB_16BIT_TB1(x)       (((x)&0x0000FFFF)<<0)
++#define MCF_PSC_TB_16BIT_TB0(x)       (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PSC_TB_AC97 */
++#define MCF_PSC_TB_AC97_SOF           (0x00000800)
++#define MCF_PSC_TB_AC97_TB(x)         (((x)&0x000FFFFF)<<12)
++
++/* Bit definitions and macros for MCF_PSC_IPCR */
++#define MCF_PSC_IPCR_RESERVED         (0x0C)
++#define MCF_PSC_IPCR_CTS              (0x0D)
++#define MCF_PSC_IPCR_D_CTS            (0x1C)
++#define MCF_PSC_IPCR_SYNC             (0x8C)
++
++/* Bit definitions and macros for MCF_PSC_ACR */
++#define MCF_PSC_ACR_IEC0              (0x01)
++#define MCF_PSC_ACR_CTMS(x)           (((x)&0x07)<<4)
++#define MCF_PSC_ACR_BRG               (0x80)
++
++/* Bit definitions and macros for MCF_PSC_ISR */
++#define MCF_PSC_ISR_ERR               (0x0040)
++#define MCF_PSC_ISR_DEOF              (0x0080)
++#define MCF_PSC_ISR_TXRDY             (0x0100)
++#define MCF_PSC_ISR_RXRDY_FU          (0x0200)
++#define MCF_PSC_ISR_DB                (0x0400)
++#define MCF_PSC_ISR_IPC               (0x8000)
++
++/* Bit definitions and macros for MCF_PSC_IMR */
++#define MCF_PSC_IMR_ERR               (0x0040)
++#define MCF_PSC_IMR_DEOF              (0x0080)
++#define MCF_PSC_IMR_TXRDY             (0x0100)
++#define MCF_PSC_IMR_RXRDY_FU          (0x0200)
++#define MCF_PSC_IMR_DB                (0x0400)
++#define MCF_PSC_IMR_IPC               (0x8000)
++
++/* Bit definitions and macros for MCF_PSC_IP */
++#define MCF_PSC_IP_CTS                (0x01)
++#define MCF_PSC_IP_TGL                (0x40)
++#define MCF_PSC_IP_LWPR_B             (0x80)
++
++/* Bit definitions and macros for MCF_PSC_OPSET */
++#define MCF_PSC_OPSET_RTS             (0x01)
++
++/* Bit definitions and macros for MCF_PSC_OPRESET */
++#define MCF_PSC_OPRESET_RTS           (0x01)
++
++/* Bit definitions and macros for MCF_PSC_SICR */
++#define MCF_PSC_SICR_SIM(x)           (((x)&0x07)<<0)
++#define MCF_PSC_SICR_SHDIR            (0x10)
++#define MCF_PSC_SICR_DTS              (0x20)
++#define MCF_PSC_SICR_AWR              (0x40)
++#define MCF_PSC_SICR_ACRB             (0x80)
++#define MCF_PSC_SICR_SIM_UART         (0x00)
++#define MCF_PSC_SICR_SIM_MODEM8       (0x01)
++#define MCF_PSC_SICR_SIM_MODEM16      (0x02)
++#define MCF_PSC_SICR_SIM_AC97         (0x03)
++#define MCF_PSC_SICR_SIM_SIR          (0x04)
++#define MCF_PSC_SICR_SIM_MIR          (0x05)
++#define MCF_PSC_SICR_SIM_FIR          (0x06)
++
++/* Bit definitions and macros for MCF_PSC_IRCR1 */
++#define MCF_PSC_IRCR1_SPUL            (0x01)
++#define MCF_PSC_IRCR1_SIPEN           (0x02)
++#define MCF_PSC_IRCR1_FD              (0x04)
++
++/* Bit definitions and macros for MCF_PSC_IRCR2 */
++#define MCF_PSC_IRCR2_NXTEOF          (0x01)
++#define MCF_PSC_IRCR2_ABORT           (0x02)
++#define MCF_PSC_IRCR2_SIPREQ          (0x04)
++
++/* Bit definitions and macros for MCF_PSC_IRMDR */
++#define MCF_PSC_IRMDR_M_FDIV(x)       (((x)&0x7F)<<0)
++#define MCF_PSC_IRMDR_FREQ            (0x80)
++
++/* Bit definitions and macros for MCF_PSC_IRFDR */
++#define MCF_PSC_IRFDR_F_FDIV(x)       (((x)&0x0F)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RFCNT */
++#define MCF_PSC_RFCNT_CNT(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TFCNT */
++#define MCF_PSC_TFCNT_CNT(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RFSR */
++#define MCF_PSC_RFSR_EMT              (0x0001)
++#define MCF_PSC_RFSR_ALARM            (0x0002)
++#define MCF_PSC_RFSR_FU               (0x0004)
++#define MCF_PSC_RFSR_FRMRY            (0x0008)
++#define MCF_PSC_RFSR_OF               (0x0010)
++#define MCF_PSC_RFSR_UF               (0x0020)
++#define MCF_PSC_RFSR_RXW              (0x0040)
++#define MCF_PSC_RFSR_FAE              (0x0080)
++#define MCF_PSC_RFSR_FRM(x)           (((x)&0x000F)<<8)
++#define MCF_PSC_RFSR_TAG              (0x1000)
++#define MCF_PSC_RFSR_TXW              (0x4000)
++#define MCF_PSC_RFSR_IP               (0x8000)
++#define MCF_PSC_RFSR_FRM_BYTE0        (0x0800)
++#define MCF_PSC_RFSR_FRM_BYTE1        (0x0400)
++#define MCF_PSC_RFSR_FRM_BYTE2        (0x0200)
++#define MCF_PSC_RFSR_FRM_BYTE3        (0x0100)
++
++/* Bit definitions and macros for MCF_PSC_TFSR */
++#define MCF_PSC_TFSR_EMT              (0x0001)
++#define MCF_PSC_TFSR_ALARM            (0x0002)
++#define MCF_PSC_TFSR_FU               (0x0004)
++#define MCF_PSC_TFSR_FRMRY            (0x0008)
++#define MCF_PSC_TFSR_OF               (0x0010)
++#define MCF_PSC_TFSR_UF               (0x0020)
++#define MCF_PSC_TFSR_RXW              (0x0040)
++#define MCF_PSC_TFSR_FAE              (0x0080)
++#define MCF_PSC_TFSR_FRM(x)           (((x)&0x000F)<<8)
++#define MCF_PSC_TFSR_TAG              (0x1000)
++#define MCF_PSC_TFSR_TXW              (0x4000)
++#define MCF_PSC_TFSR_IP               (0x8000)
++#define MCF_PSC_TFSR_FRM_BYTE0        (0x0800)
++#define MCF_PSC_TFSR_FRM_BYTE1        (0x0400)
++#define MCF_PSC_TFSR_FRM_BYTE2        (0x0200)
++#define MCF_PSC_TFSR_FRM_BYTE3        (0x0100)
++
++/* Bit definitions and macros for MCF_PSC_RFCR */
++#define MCF_PSC_RFCR_CNTR(x)          (((x)&0x0000FFFF)<<0)
++#define MCF_PSC_RFCR_TXW_MSK          (0x00040000)
++#define MCF_PSC_RFCR_OF_MSK           (0x00080000)
++#define MCF_PSC_RFCR_UF_MSK           (0x00100000)
++#define MCF_PSC_RFCR_RXW_MSK          (0x00200000)
++#define MCF_PSC_RFCR_FAE_MSK          (0x00400000)
++#define MCF_PSC_RFCR_IP_MSK           (0x00800000)
++#define MCF_PSC_RFCR_GR(x)            (((x)&0x00000007)<<24)
++#define MCF_PSC_RFCR_FRMEN            (0x08000000)
++#define MCF_PSC_RFCR_TIMER            (0x10000000)
++#define MCF_PSC_RFCR_WRITETAG         (0x20000000)
++#define MCF_PSC_RFCR_SHADOW           (0x80000000)
++
++/* Bit definitions and macros for MCF_PSC_TFCR */
++#define MCF_PSC_TFCR_CNTR(x)          (((x)&0x0000FFFF)<<0)
++#define MCF_PSC_TFCR_TXW_MSK          (0x00040000)
++#define MCF_PSC_TFCR_OF_MSK           (0x00080000)
++#define MCF_PSC_TFCR_UF_MSK           (0x00100000)
++#define MCF_PSC_TFCR_RXW_MSK          (0x00200000)
++#define MCF_PSC_TFCR_FAE_MSK          (0x00400000)
++#define MCF_PSC_TFCR_IP_MSK           (0x00800000)
++#define MCF_PSC_TFCR_GR(x)            (((x)&0x00000007)<<24)
++#define MCF_PSC_TFCR_FRMEN            (0x08000000)
++#define MCF_PSC_TFCR_TIMER            (0x10000000)
++#define MCF_PSC_TFCR_WRITETAG         (0x20000000)
++#define MCF_PSC_TFCR_SHADOW           (0x80000000)
++
++/* Bit definitions and macros for MCF_PSC_RFAR */
++#define MCF_PSC_RFAR_ALARM(x)         (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TFAR */
++#define MCF_PSC_TFAR_ALARM(x)         (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RFRP */
++#define MCF_PSC_RFRP_READ(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TFRP */
++#define MCF_PSC_TFRP_READ(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RFWP */
++#define MCF_PSC_RFWP_WRITE(x)         (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TFWP */
++#define MCF_PSC_TFWP_WRITE(x)         (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RLRFP */
++#define MCF_PSC_RLRFP_LFP(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TLRFP */
++#define MCF_PSC_TLRFP_LFP(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_RLWFP */
++#define MCF_PSC_RLWFP_LFP(x)          (((x)&0x01FF)<<0)
++
++/* Bit definitions and macros for MCF_PSC_TLWFP */
++#define MCF_PSC_TLWFP_LFP(x)          (((x)&0x01FF)<<0)
++
++/********************************************************************/
++
++#endif /* __MCF548X_PSC_H__ */
+--- /dev/null
++++ b/include/asm-m68k/m5485sim.h
+@@ -0,0 +1,219 @@
++/*
++ *    m5485sim.h -- ColdFire 547x/548x System Integration Unit support.
++ */
++ 
++#ifndef       m5485sim_h
++#define       m5485sim_h
++
++
++/*
++ *      System Integration Unit Registers
++ */
++#define MCF_SDRAMDS   MCF_REG32(0x000004)     /* SDRAM Drive Strength         */
++#define MCF_SBCR              MCF_REG32(0x000010)     /* System Breakpoint Control    */
++#define MCF_CSnCFG(x) MCF_REG32(0x000020+(x*4))/* SDRAM Chip Select X         */
++#define MCF_SECSACR     MCF_REG32(0x000038)   /* Sequential Access Control    */      
++#define MCF_RSR         MCF_REG32(0x000044)   /* Reset Status                 */
++#define MCF_JTAGID      MCF_REG32(0x000050)   /* JTAG Device Identification   */
++
++/*
++ *      FlexBus Chip Selects Registers
++ */
++#define MCF_CSARn(x)    MCF_REG32(0x000500+(x*0xC))
++#define MCF_CSMRn(x)    MCF_REG32(0x000504+(x*0xC))
++#define MCF_CSCRn(x)    MCF_REG32(0x000508+(x*0xC))
++
++/*
++ *      Interrupt Controller Registers
++ */
++#define MCF_IPRH              MCF_REG32(0x000700)
++#define MCF_IPRL              MCF_REG32(0x000704)
++#define MCF_IMRH              MCF_REG32(0x000708)
++#define MCF_IMRL              MCF_REG32(0x00070C)
++#define MCF_INTFRCH           MCF_REG32(0x000710)
++#define MCF_INTFRCL           MCF_REG32(0x000714)
++#define MCF_IRLR              MCF_REG08(0x000718)
++#define MCF_IACKLPR           MCF_REG08(0x000719)
++#define MCF_SWIACK            MCF_REG08(0x0007E0)
++#define MCF_LnIACK(x)         MCF_REG08(0x0007E4+((x)*0x004))
++#define MCF_ICR(x)            MCF_REG08(0x000740+((x)*0x001))
++
++/*
++ *    Slice Timers Registers
++ */
++#define MCF_SLTCNT(x)   MCF_REG32(0x000900+((x)*0x010))
++#define MCF_SCR(x)      MCF_REG32(0x000904+((x)*0x010))
++#define MCF_SCNT(x)     MCF_REG32(0x000908+((x)*0x010))
++#define MCF_SSR(x)      MCF_REG32(0x00090C+((x)*0x010))
++
++/*
++ *    Interrupt sources
++ */
++#define ISC_EPORT_Fn(x)               (x)             /* EPORT Interrupts     */
++#define ISC_USB_EPn(x)                (15+(x))        /* USB Endopint         */
++#define ISC_USB_ISR           (22)            /* USB General source   */
++#define ISC_USB_AISR          (22)            /* USB core source      */
++#define ISC_DSPI_OVRFW                (25)            /* DSPI overflow        */
++#define ISC_DSPI_RFOF         (26)            
++#define ISC_DSPI_RFDF         (27)            
++#define ISC_DSPI_TFUF         (28)            
++#define ISC_DSPI_TCF          (29)            
++#define ISC_DSPI_TFFF         (30)            
++#define ISC_DSPI_EOQF         (31)            
++#define ISC_PSCn(x)           (35-(x))                
++#define ISC_COMM_TIM          (36)            
++#define ISC_SEC                       (37)            
++#define ISC_FEC1              (38)            
++#define ISC_FEC0              (39)            
++#define ISC_I2C                       (40)            
++#define ISC_PCI_ARB           (41)            
++#define ISC_PCI_CB            (42)            
++#define ISC_PCI_XLB           (43)            
++#define ISC_DMA                       (48)            
++#define ISC_CANn_ERR(x)               (49+(6*(x)))            
++#define ISC_CANn_BUSOFF(x)    (50+(6*(x)))            
++#define ISC_CANn_MBOR(x)      (51+(6*(x)))            
++#define ISC_CAN0_WAKEIN               (52)            
++#define ISC_SLTn(x)           (54-(x))                
++#define ISC_GPTn(x)           (62-(x))                
++
++/*
++ *    Interrupt level and priorities
++ */
++#define ILP_TOP                       (MCF_ICR_IL(5) | MCF_ICR_IP(3))
++#define ILP_SLT0              (MCF_ICR_IL(5) | MCF_ICR_IP(2))
++#define ILP_SLT1              (MCF_ICR_IL(5) | MCF_ICR_IP(1))
++#define ILP_DMA                       (MCF_ICR_IL(5) | MCF_ICR_IP(0))
++#define ILP_SEC                       (MCF_ICR_IL(4) | MCF_ICR_IP(7))
++#define ILP_FEC0              (MCF_ICR_IL(4) | MCF_ICR_IP(6))
++#define ILP_FEC1              (MCF_ICR_IL(4) | MCF_ICR_IP(5))
++#define ILP_PCI_XLB           (MCF_ICR_IL(4) | MCF_ICR_IP(4))
++#define ILP_PCI_ARB           (MCF_ICR_IL(4) | MCF_ICR_IP(3))
++#define ILP_PCI_CB            (MCF_ICR_IL(4) | MCF_ICR_IP(2))
++#define ILP_I2C                       (MCF_ICR_IL(4) | MCF_ICR_IP(1))
++
++#define ILP_USB_EPn(x)                (MCF_ICR_IL(3) | MCF_ICR_IP(7-(x)))
++#define ILP_USB_EP0           (MCF_ICR_IL(3) | MCF_ICR_IP(7))
++#define ILP_USB_EP1           (MCF_ICR_IL(3) | MCF_ICR_IP(6))
++#define ILP_USB_EP2           (MCF_ICR_IL(3) | MCF_ICR_IP(5))
++#define ILP_USB_EP3           (MCF_ICR_IL(3) | MCF_ICR_IP(4))
++#define ILP_USB_EP4           (MCF_ICR_IL(3) | MCF_ICR_IP(3))
++#define ILP_USB_EP5           (MCF_ICR_IL(3) | MCF_ICR_IP(2))
++#define ILP_USB_EP6           (MCF_ICR_IL(3) | MCF_ICR_IP(1))
++#define ILP_USB_ISR           (MCF_ICR_IL(3) | MCF_ICR_IP(0))
++
++#define ILP_USB_AISR          (MCF_ICR_IL(2) | MCF_ICR_IP(7))
++#define ILP_DSPI_OVRFW                (MCF_ICR_IL(2) | MCF_ICR_IP(6))
++#define ILP_DSPI_RFOF         (MCF_ICR_IL(2) | MCF_ICR_IP(5))
++#define ILP_DSPI_RFDF         (MCF_ICR_IL(2) | MCF_ICR_IP(4))
++#define ILP_DSPI_TFUF         (MCF_ICR_IL(2) | MCF_ICR_IP(3))
++#define ILP_DSPI_TCF          (MCF_ICR_IL(2) | MCF_ICR_IP(2))
++#define ILP_DSPI_TFFF         (MCF_ICR_IL(2) | MCF_ICR_IP(1))
++#define ILP_DSPI_EOQF         (MCF_ICR_IL(2) | MCF_ICR_IP(0))
++
++#define ILP_COMM_TIM          (MCF_ICR_IL(1) | MCF_ICR_IP(7))
++#define ILP_PSCn(x)           (MCF_ICR_IL(1) | MCF_ICR_IP(3-((x)&3)))
++#define ILP_PSC0              (MCF_ICR_IL(1) | MCF_ICR_IP(3))
++#define ILP_PSC1              (MCF_ICR_IL(1) | MCF_ICR_IP(2))
++#define ILP_PSC2              (MCF_ICR_IL(1) | MCF_ICR_IP(1))
++#define ILP_PSC3              (MCF_ICR_IL(1) | MCF_ICR_IP(0))
++
++
++
++
++
++/********************************************************************/
++
++/*
++ *      System Integration Unit Bitfields
++ */
++ 
++/* SBCR */
++#define MCF_SBCR_PIN2DSPI       (0x08000000)
++#define MCF_SBCR_DMA2CPU        (0x10000000)
++#define MCF_SBCR_CPU2DMA        (0x20000000)
++#define MCF_SBCR_PIN2DMA        (0x40000000)
++#define MCF_SBCR_PIN2CPU        (0x80000000)
++
++/* SECSACR */
++#define MCF_SECSACR_SEQEN       (0x00000001)
++
++/* RSR */
++#define MCF_RSR_RST             (0x00000001)
++#define MCF_RSR_RSTWD           (0x00000002)
++#define MCF_RSR_RSTJTG          (0x00000008)
++
++/* JTAGID */
++#define MCF_JTAGID_REV          (0xF0000000)
++#define MCF_JTAGID_PROCESSOR    (0x0FFFFFFF)
++#define MCF_JTAGID_MCF5485      (0x0800C01D)
++#define MCF_JTAGID_MCF5484      (0x0800D01D)
++#define MCF_JTAGID_MCF5483      (0x0800E01D)
++#define MCF_JTAGID_MCF5482      (0x0800F01D)
++#define MCF_JTAGID_MCF5481      (0x0801001D)
++#define MCF_JTAGID_MCF5480      (0x0801101D)
++#define MCF_JTAGID_MCF5475      (0x0801201D)
++#define MCF_JTAGID_MCF5474      (0x0801301D)
++#define MCF_JTAGID_MCF5473      (0x0801401D)
++#define MCF_JTAGID_MCF5472      (0x0801501D)
++#define MCF_JTAGID_MCF5471      (0x0801601D)
++#define MCF_JTAGID_MCF5470      (0x0801701D)
++
++
++/*
++ *      Interrupt Controller Bitfields
++ */
++#define MCF_IRLR_IRQ(x)         (((x)&0x7F)<<1)
++#define MCF_IACKLPR_PRI(x)      (((x)&0x0F)<<0)
++#define MCF_IACKLPR_LEVEL(x)    (((x)&0x07)<<4)
++#define MCF_ICR_IP(x)           (((x)&0x07)<<0)
++#define MCF_ICR_IL(x)           (((x)&0x07)<<3)
++
++/*
++ *      Slice Timers Bitfields
++ */
++#define MCF_SCR_TEN                   (0x01000000)
++#define MCF_SCR_IEN                   (0x02000000)
++#define MCF_SCR_RUN                   (0x04000000)
++#define MCF_SSR_ST                    (0x01000000)
++#define MCF_SSR_BE                    (0x02000000)
++
++
++/*
++ * Some needed coldfire registers
++ */
++#define MCF_PAR_PCIBG                    MCF_REG16(0x000A48)
++#define MCF_PAR_PCIBR            MCF_REG16(0x000A4A)
++#define MCF_PAR_PSCn(x)            MCF_REG08(0x000A4F-((x)&0x3))
++#define MCF_PAR_FECI2CIRQ        MCF_REG16(0x000A44)
++#define MCF_EPPAR                MCF_REG16(0x000F00)
++#define MCF_EPIER                MCF_REG08(0x000F05)
++#define MCF_EPFR                         MCF_REG08(0x000F0C)
++
++/*
++ * Some GPIO bitfields
++ */
++#define MCF_PAR_SDA                   (0x0008)
++#define MCF_PAR_SCL                   (0x0004)
++#define MCF_PAR_PSC_TXD               (0x04)
++#define MCF_PAR_PSC_RXD               (0x08)
++#define MCF_PAR_PSC_RTS(x)            (((x)&0x03)<<4)
++#define MCF_PAR_PSC_CTS(x)            (((x)&0x03)<<6)
++#define MCF_PAR_PSC_CTS_GPIO          (0x00)
++#define MCF_PAR_PSC_CTS_BCLK          (0x80)
++#define MCF_PAR_PSC_CTS_CTS           (0xC0)
++#define MCF_PAR_PSC_RTS_GPIO          (0x00)
++#define MCF_PAR_PSC_RTS_FSYNC         (0x20)
++#define MCF_PAR_PSC_RTS_RTS           (0x30)
++#define MCF_PAR_PSC_CANRX             (0x40)
++
++
++/*
++ * Some used coldfire values
++ */
++#define MCF_EPIER_EPIE(x)          (0x01 << (x))
++#define MCF_EPPAR_EPPAx_FALLING    (2)
++#define MCF_EPPAR_EPPA(n,x)        (((x)&0x0003) << (2*n))
++
++
++#endif        /* m5485sim_h */
+--- a/include/asm-m68k/mcfsim.h
++++ b/include/asm-m68k/mcfsim.h
+@@ -20,6 +20,11 @@
+ #include <asm/mcf5445x_pci.h>
+ #include <asm/mcf5445x_pciarb.h>
+ #include <asm/mcf5445x_eport.h>
++#include <asm/mcf5445x_fbcs.h>
++#include <asm/mcf5445x_xbs.h>
++#include <asm/mcf5445x_dtim.h>
++#elif defined(CONFIG_M547X_8X)
++#include <asm/m5485sim.h>
+ #endif
+ /*
+--- a/include/asm-m68k/mcfuart.h
++++ b/include/asm-m68k/mcfuart.h
+@@ -22,6 +22,15 @@
+ #define MCFUART_BASE3         0xfc068000      /* Base address of UART3 */
+ #define MCFINT_VECBASE                64
+ #define MCFINT_UART0          26
++
++#elif defined(CONFIG_M547X_8X)
++
++#define MCFUART_BASE1         0x8600          /* Base address of UART1 */
++#define MCFUART_BASE2         0x8700          /* Base address of UART2 */
++#define MCFUART_BASE3         0x8800          /* Base address of UART3 */
++#define MCFUART_BASE4         0x8900          /* Base address of UART4 */
++#define MCFINT_VECBASE                64
++#define MCFINT_UART0          35
+ #endif
+@@ -97,6 +106,11 @@
+ #define       MCFUART_USR_RXFULL      0x02            /* Receiver full */
+ #define       MCFUART_USR_RXREADY     0x01            /* Receiver ready */
++#if defined(CONFIG_M547X_8X)
++#define       MCFUART_USR_TXREADY_BN  0x0a
++#define       MCFUART_USR_TXEMPTY_BN  0x0b
++#endif
++
+ #define       MCFUART_USR_RXERR       (MCFUART_USR_RXBREAK | MCFUART_USR_RXFRAMING | \
+                               MCFUART_USR_RXPARITY | MCFUART_USR_RXOVERRUN)
+--- a/include/asm-m68k/mmu_context.h
++++ b/include/asm-m68k/mmu_context.h
+@@ -152,6 +152,7 @@ static inline void activate_mm(struct mm
+ #else /* CONFIG_COLDFIRE */
++#include <asm/coldfire.h>
+ #include <asm/atomic.h>
+ #include <asm/bitops.h>
+ #include <asm/mmu.h>
+@@ -227,6 +228,77 @@ static inline void activate_mm(struct mm
+ #define deactivate_mm(tsk, mm) do { } while (0)
+ extern void mmu_context_init(void);
++#if defined(CONFIG_M547X_8X)
++#define prepare_arch_switch(next) load_ksp_mmu(next)
++
++static inline void load_ksp_mmu(struct task_struct *task)
++{
++      int flags;
++      struct mm_struct *mm;
++      int asid;
++      pgd_t *pgd;
++      pmd_t *pmd;
++      pte_t *pte;
++      unsigned long mmuar;
++
++      local_irq_save(flags);
++      mmuar = task->thread.ksp;
++
++      /* Search for a valid TLB entry, if one is found, don't remap */
++      *MMUAR = mmuar;
++      *MMUOR = MMUOR_STLB | MMUOR_ADR;
++      if ((*MMUSR) & MMUSR_HIT)
++              goto end;
++
++      if (mmuar >= PAGE_OFFSET) {
++              mm = &init_mm;
++      } else {
++              printk ("load_ksp_mmu: non-kernel mm found: 0x%08x\n", (unsigned int) task->mm);
++              mm = task->mm;
++      }
++
++        if (!mm)
++          goto bug;
++
++        pgd = pgd_offset(mm, mmuar);
++        if (pgd_none(*pgd))
++          goto bug;
++          
++      pmd = pmd_offset(pgd, mmuar);
++      if (pmd_none(*pmd))
++          goto bug;
++      
++      pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
++                                   : pte_offset_map(pmd, mmuar);
++      if (pte_none(*pte) || !pte_present(*pte))
++          goto bug;
++
++        set_pte(pte, pte_mkyoung(*pte));
++        asid = mm->context & 0xff;
++        if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET)
++          set_pte(pte, pte_wrprotect(*pte));
++
++        *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
++               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK ) >> CF_PAGE_MMUTR_SHIFT)
++               | MMUTR_V;
++
++        *MMUDR = (pte_val(*pte) & PAGE_MASK) 
++             | ((pte->pte) & CF_PAGE_MMUDR_MASK)
++               | MMUDR_SZ8K | MMUDR_X;
++          
++      *MMUOR = MMUOR_ACC | MMUOR_UAA;
++      asm ("nop");
++
++      goto end;
++
++bug:
++      printk ("ksp load failed: mm=0x%08x ksp=0x%08x\n", (unsigned int) mm, (unsigned int) mmuar);
++
++end:
++      local_irq_restore(flags);
++}
++
++#endif /* CONFIG_M547X_8X */
+ #endif /* CONFIG_COLDFIRE */
+ #endif
+--- a/include/asm-m68k/page_offset.h
++++ b/include/asm-m68k/page_offset.h
+@@ -5,7 +5,12 @@
+ #elif defined(CONFIG_SUN3)
+ #define PAGE_OFFSET_RAW               0x0E000000
+ #else /* CONFIG_COLDFIRE */
++#if defined(CONFIG_M54455)
+ #define PAGE_OFFSET_RAW               0xC0000000
+ #define       PHYS_OFFSET             0x40000000
++#elif defined(CONFIG_M547X_8X)
++#define PAGE_OFFSET_RAW               0xC0000000
++#define       PHYS_OFFSET             0x00000000
++#endif
+ #endif
diff --git a/target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch b/target/linux/coldfire/patches/045-m547x_8x_fec_dma.patch
new file mode 100644 (file)
index 0000000..ed54cbc
--- /dev/null
@@ -0,0 +1,7283 @@
+From b778a60aba67d29857fc7016c8c2f2d87a23de1f Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Sun, 9 Mar 2008 22:14:05 -0600
+Subject: [PATCH] Add DMA and FEC.
+
+LTIBName: m547x-8x-fec-dma
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig            |    9 +
+ arch/m68k/coldfire/Makefile  |    2 +
+ arch/m68k/coldfire/dma.c     |  537 +++++++++
+ drivers/Makefile             |    2 +
+ drivers/dma/MCD_dma.h        |  408 +++++++
+ drivers/dma/MCD_dmaApi.c     |  968 +++++++++++++++++
+ drivers/dma/MCD_progCheck.h  |   33 +
+ drivers/dma/MCD_tasks.c      | 2452 ++++++++++++++++++++++++++++++++++++++++++
+ drivers/dma/MCD_tasksInit.c  |  284 +++++
+ drivers/dma/MCD_tasksInit.h  |   73 ++
+ drivers/dma/Makefile         |    2 +
+ drivers/net/Kconfig          |    2 +
+ drivers/net/Makefile         |    2 +
+ drivers/net/fec/Kconfig      |   25 +
+ drivers/net/fec/Makefile     |    7 +
+ drivers/net/fec/fec.c        | 1375 +++++++++++++++++++++++
+ drivers/net/fec/fec.h        |  162 +++
+ drivers/net/fec/ks8721.c     |  125 +++
+ drivers/net/fec/ks8721.h     |   21 +
+ include/asm-m68k/MCD_dma.h   |  408 +++++++
+ include/asm-m68k/coldfire.h  |    1 +
+ include/asm-m68k/dma.h       |  106 ++-
+ include/asm-m68k/m5485dma.h  |   97 ++
+ include/asm-m68k/m5485sram.h |   12 +
+ 24 files changed, 7112 insertions(+), 1 deletions(-)
+ create mode 100644 arch/m68k/coldfire/dma.c
+ create mode 100644 drivers/dma/MCD_dma.h
+ create mode 100644 drivers/dma/MCD_dmaApi.c
+ create mode 100644 drivers/dma/MCD_progCheck.h
+ create mode 100644 drivers/dma/MCD_tasks.c
+ create mode 100644 drivers/dma/MCD_tasksInit.c
+ create mode 100644 drivers/dma/MCD_tasksInit.h
+ create mode 100644 drivers/net/fec/Kconfig
+ create mode 100644 drivers/net/fec/Makefile
+ create mode 100755 drivers/net/fec/fec.c
+ create mode 100755 drivers/net/fec/fec.h
+ create mode 100644 drivers/net/fec/ks8721.c
+ create mode 100644 drivers/net/fec/ks8721.h
+ create mode 100644 include/asm-m68k/MCD_dma.h
+ create mode 100644 include/asm-m68k/m5485dma.h
+ create mode 100644 include/asm-m68k/m5485sram.h
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -141,6 +141,15 @@ config CFV4E
+       select MMU_CFV4E if MMU
+       default y
++config MCD_DMA
++      bool "ColdFire MCD DMA support"
++      depends on CFV4E
++      default y
++      help
++        This enables support for the ColdFire 547x/548x family
++        multichannel DMA support.  Many drivers need it.
++        If you want it, say Y
++
+ config AMIGA
+       bool "Amiga support"
+       depends on !MMU_SUN3
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -10,3 +10,5 @@ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+ obj-$(CONFIG_M54455)  += mcf5445x-devices.o
++
++obj-$(CONFIG_MCD_DMA) += dma.o
+--- /dev/null
++++ b/arch/m68k/coldfire/dma.c
+@@ -0,0 +1,537 @@
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/dma.h>
++#include <asm/coldfire.h>
++#include <asm/m5485sram.h>
++#include <asm/mcfsim.h>
++
++
++
++void dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs);
++
++/* 
++ * This global keeps track of which initiators have been
++ * used of the available assignments.  Initiators 0-15 are
++ * hardwired.  Initiators 16-31 are multiplexed and controlled
++ * via the Initiatior Mux Control Registe (IMCR).  The
++ * assigned requestor is stored with the associated initiator
++ * number.
++ */
++static int used_reqs[32] = {
++      DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0,
++      DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1,
++      DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX,
++      DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX,
++      0, 0, 0, 0,
++      0, 0, 0, 0,
++      0, 0, 0, 0,
++      0, 0, 0, 0
++};
++
++/*
++ * This global keeps track of which channels have been assigned
++ * to tasks.  This methology assumes that no single initiator
++ * will be tied to more than one task/channel
++ */
++static char used_channel[16] = {
++      -1, -1, -1, -1, -1, -1, -1, -1,
++      -1, -1, -1, -1, -1, -1, -1, -1
++};
++
++unsigned int connected_channel[16] = {
++      0, 0, 0, 0, 0, 0, 0, 0,
++      0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/********************************************************************/
++/*
++ * Attempt to enable the provided Initiator in the Initiator
++ * Mux Control Register
++ *
++ * Parameters:
++ *  initiator   Initiator identifier
++ *
++ * Return Value:
++ *  1   if unable to make the assignment
++ *  0   successful
++ */
++int
++dma_set_initiator(int initiator)
++{
++      switch (initiator) {    /*
++                               * These initiators are always active 
++                               */
++      case DMA_ALWAYS:
++      case DMA_DSPI_RX:
++      case DMA_DSPI_TX:
++      case DMA_DREQ0:
++      case DMA_PSC0_RX:
++      case DMA_PSC0_TX:
++      case DMA_USBEP0:
++      case DMA_USBEP1:
++      case DMA_USBEP2:
++      case DMA_USBEP3:
++      case DMA_PCI_TX:
++      case DMA_PCI_RX:
++      case DMA_PSC1_RX:
++      case DMA_PSC1_TX:
++      case DMA_I2C_RX:
++      case DMA_I2C_TX:
++              break;
++
++      case DMA_FEC0_RX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3))
++                  | MCF_DMA_IMCR_SRC16_FEC0RX;
++              used_reqs[16] = DMA_FEC0_RX;
++              break;
++
++      case DMA_FEC0_TX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3))
++                  | MCF_DMA_IMCR_SRC17_FEC0TX;
++              used_reqs[17] = DMA_FEC0_TX;
++              break;
++
++      case DMA_FEC1_RX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3))
++                  | MCF_DMA_IMCR_SRC20_FEC1RX;
++              used_reqs[20] = DMA_FEC1_RX;
++              break;
++
++      case DMA_FEC1_TX:
++              if (used_reqs[21] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
++                          | MCF_DMA_IMCR_SRC21_FEC1TX;
++                      used_reqs[21] = DMA_FEC1_TX;
++              } else if (used_reqs[25] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
++                          | MCF_DMA_IMCR_SRC25_FEC1TX;
++                      used_reqs[25] = DMA_FEC1_TX;
++              } else if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_FEC1TX;
++                      used_reqs[31] = DMA_FEC1_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_DREQ1:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_DREQ1;
++                      used_reqs[29] = DMA_DREQ1;
++              } else if (used_reqs[21] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
++                          | MCF_DMA_IMCR_SRC21_DREQ1;
++                      used_reqs[21] = DMA_DREQ1;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM0:
++              if (used_reqs[24] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3))
++                          | MCF_DMA_IMCR_SRC24_CTM0;
++                      used_reqs[24] = DMA_CTM0;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM1:
++              if (used_reqs[25] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
++                          | MCF_DMA_IMCR_SRC25_CTM1;
++                      used_reqs[25] = DMA_CTM1;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM2:
++              if (used_reqs[26] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
++                          | MCF_DMA_IMCR_SRC26_CTM2;
++                      used_reqs[26] = DMA_CTM2;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM3:
++              if (used_reqs[27] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
++                          | MCF_DMA_IMCR_SRC27_CTM3;
++                      used_reqs[27] = DMA_CTM3;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM4:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_CTM4;
++                      used_reqs[28] = DMA_CTM4;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM5:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_CTM5;
++                      used_reqs[29] = DMA_CTM5;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM6:
++              if (used_reqs[30] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
++                          | MCF_DMA_IMCR_SRC30_CTM6;
++                      used_reqs[30] = DMA_CTM6;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM7:
++              if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_CTM7;
++                      used_reqs[31] = DMA_CTM7;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP4:
++              if (used_reqs[26] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
++                          | MCF_DMA_IMCR_SRC26_USBEP4;
++                      used_reqs[26] = DMA_USBEP4;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP5:
++              if (used_reqs[27] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
++                          | MCF_DMA_IMCR_SRC27_USBEP5;
++                      used_reqs[27] = DMA_USBEP5;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP6:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_USBEP6;
++                      used_reqs[28] = DMA_USBEP6;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC2_RX:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_PSC2RX;
++                      used_reqs[28] = DMA_PSC2_RX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC2_TX:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_PSC2TX;
++                      used_reqs[29] = DMA_PSC2_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC3_RX:
++              if (used_reqs[30] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
++                          | MCF_DMA_IMCR_SRC30_PSC3RX;
++                      used_reqs[30] = DMA_PSC3_RX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC3_TX:
++              if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_PSC3TX;
++                      used_reqs[31] = DMA_PSC3_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      default:
++              return 1;
++      }
++      return 0;
++}
++
++/********************************************************************/
++/*
++ * Return the initiator number for the given requestor
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ *
++ * Return Value:
++ *  The initiator number (0-31) if initiator has been assigned
++ *  0 (always initiator) otherwise
++ */
++unsigned int
++dma_get_initiator(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof (used_reqs); ++i) {
++              if (used_reqs[i] == requestor)
++                      return i;
++      }
++      return 0;
++}
++
++/********************************************************************/
++/*
++ * Remove the given initiator from the active list
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ */
++void
++dma_remove_initiator(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof (used_reqs); ++i) {
++              if (used_reqs[i] == requestor) {
++                      used_reqs[i] = -1;
++                      break;
++              }
++      }
++}
++
++/********************************************************************/
++/*
++ * Attempt to find an available channel for FEC and mark is as used
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ *
++ * Return Value:
++ *  First available channel (from 0 to 5) or -1 if they are all occupied
++ */
++int
++dma_set_channel_fec(int requestor)
++{
++      u32 i, t;
++
++#ifdef CONFIG_FEC_548x_ENABLE_FEC2
++      t = 4;
++#else
++      t = 2;
++#endif
++
++
++
++      for (i = 0; i < t ; ++i)
++              if (used_channel[i] == -1) {
++                      used_channel[i] = requestor;
++                      return i;
++              }
++      /* All channels taken */
++      return -1;
++}
++
++/********************************************************************/
++/*
++ * Attempt to find an available channel and mark is as used
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ *
++ * Return Value:
++ *  First available channel (from 6 to 15) or -1 if they are all occupied
++ */
++int
++dma_set_channel(int requestor)
++{
++      u32 i;
++#ifdef CONFIG_NET_FEC2
++      i = 4;
++#else
++      i = 2;
++#endif                                
++
++      for (; i < 16; ++i)
++              if (used_channel[i] == -1) {
++                      used_channel[i] = requestor;
++                      return i;
++              }
++
++      /* All channels taken */
++      return -1;
++}
++
++/********************************************************************/
++/*
++ * Return the channel being initiated by the given requestor
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ */
++int
++dma_get_channel(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof (used_channel); ++i) {
++              if (used_channel[i] == requestor)
++                      return i;
++      }
++      return -1;
++}
++
++/********************************************************************/
++/*
++ * Connects a channel with reference on your data 
++ *
++ * Parameters:
++ *  channel   channel number
++ *  reference addres of your data
++  */
++int
++dma_connect(int channel, int address)
++{
++      if ((channel < 16) && (channel >= 0))
++              connected_channel[channel] = address;
++      else
++              return -1;
++      return 0;
++}
++
++/********************************************************************/
++/*
++ * Disconnects a channel with reference on your data 
++ *
++ * Parameters:
++ *  channel   channel number
++*/
++int
++dma_disconnect(int channel)
++{
++      if ((channel < 16) && (channel >= 0))
++              connected_channel[channel] = 0;
++      else
++              return -1;
++      return 0;
++}
++
++/********************************************************************/
++/*
++ * Remove the channel being initiated by the given requestor from 
++ * the active list
++ *
++ * Parameters:
++ *  requestor   Initiator/Requestor identifier
++ */
++void
++dma_remove_channel(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof (used_channel); ++i) {
++              if (used_channel[i] == requestor) {
++                      used_channel[i] = -1;
++                      break;
++              }
++      }
++}
++
++/********************************************************************/
++/* 
++ * This is the catch-all interrupt handler for the mult-channel DMA 
++ */
++volatile u8 dma_iflag[16];
++u32 tx = 0;
++
++void
++dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
++{
++      u32 i, interrupts/*, mask, temp*/;
++
++      /*
++       * Determine which interrupt(s) triggered by AND'ing the 
++       * pending interrupts with those that aren't masked.            
++       */
++/*    mask = MCF_DMA_DIMR;
++      MCF_DMA_DIMR = 0xffffffff;
++*/
++      interrupts = MCF_DMA_DIPR;
++      MCF_DMA_DIPR |= interrupts;
++//    temp = interrupts;
++
++      //MCF_DMA_DIPR = interrupts;
++      for (i = 0; i < 16; ++i, interrupts >>= 1)
++              if (interrupts & 0x1)
++                      if (connected_channel[i] != 0)
++                              ((void (*)(void)) (connected_channel[i])) ();
++
++/*    MCF_DMA_DIPR |= temp;
++      MCF_DMA_DIMR = mask;*/
++}
++
++void
++dma_remove_channel_by_number(int channel)
++{
++      if (channel < sizeof (used_channel) && channel >= 0)
++              used_channel[channel] = -1;
++}
++
++int __devinit
++dma_init()
++{
++      int result;
++      char *dma_version_str;
++
++      MCD_getVersion(&dma_version_str);
++      printk("Initialize %s\n", dma_version_str);
++
++      if (request_irq
++          (64 + ISC_DMA, 
++           dma_interrupt_handler, 
++           IRQF_DISABLED, 
++           "MCD-DMA", 
++           NULL)) {
++              printk("Cannot allocate the DMA IRQ(48)\n");
++              return 1;
++      }
++
++      MCF_DMA_DIMR = 0;
++      MCF_DMA_DIPR = 0xFFFFFFFF;
++
++      MCF_ICR(ISC_DMA) = ILP_DMA;
++#if 0
++// JKM
++      enable_irq( 64 + ISC_DMA );
++#endif
++
++      result =
++          MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
++                      (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
++      if (result != MCD_OK) {
++              printk("Cannot perform DMA initialization\n");
++              free_irq(64 + ISC_DMA, NULL);
++              return 1;
++      }
++
++      return 0;
++}
++
++device_initcall(dma_init);
++
+--- a/drivers/Makefile
++++ b/drivers/Makefile
+@@ -93,3 +93,5 @@ obj-$(CONFIG_PPC_PS3)                += ps3/
+ obj-$(CONFIG_OF)              += of/
+ obj-$(CONFIG_SSB)             += ssb/
+ obj-$(CONFIG_VIRTIO)          += virtio/
++
++obj-$(CONFIG_MCD_DMA)         += dma/
+--- /dev/null
++++ b/drivers/dma/MCD_dma.h
+@@ -0,0 +1,408 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++
++/*
++ * File:        MCD_dma.h
++ * Purpose:     Main header file for multi-channel DMA API.
++ *
++ * Notes:
++ *
++ * Modifications:
++ */
++#ifndef _MCD_API_H
++#define _MCD_API_H
++
++#include <asm/types.h>
++
++/*
++ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
++ */
++#undef MCD_INCLUDE_EU
++
++/*
++ * Number of DMA channels
++ */
++#define NCHANNELS 16
++
++/*
++ * Total number of variants
++ */
++#ifdef MCD_INCLUDE_EU
++#define NUMOFVARIANTS   6
++#else
++#define NUMOFVARIANTS   4
++#endif
++
++/*
++ * Define sizes of the various tables
++ */
++#define TASK_TABLE_SIZE     (NCHANNELS*32)
++#define VAR_TAB_SIZE        (128)
++#define CONTEXT_SAVE_SIZE   (128)
++#define FUNCDESC_TAB_SIZE   (256)
++
++#ifdef MCD_INCLUDE_EU
++#define FUNCDESC_TAB_NUM    16
++#else
++#define FUNCDESC_TAB_NUM    1
++#endif
++
++
++#ifndef DEFINESONLY
++
++/*
++ * Portability typedefs
++ */
++ /*
++#ifndef s32
++typedef int s32;
++#endif
++#ifndef u32
++typedef unsigned int u32;
++#endif
++#ifndef s16
++typedef short s16;
++#endif
++#ifndef u16
++typedef unsigned short u16;
++#endif
++#ifndef s8
++typedef char s8;
++#endif
++#ifndef u8
++typedef unsigned char u8;
++#endif
++*/
++/*
++ * These structures represent the internal registers of the
++ * multi-channel DMA
++ */
++struct dmaRegs_s {
++   u32 taskbar;         /* task table base address register */
++   u32 currPtr;
++   u32 endPtr;
++   u32 varTablePtr;
++   u16 dma_rsvd0;
++   u16 ptdControl;      /* ptd control */
++   u32 intPending;      /* interrupt pending register */
++   u32 intMask;         /* interrupt mask register */
++   u16 taskControl[16]; /* task control registers */
++   u8  priority[32];    /* priority registers */
++   u32 initiatorMux;    /* initiator mux control */
++   u32 taskSize0;       /* task size control register 0. */
++   u32 taskSize1;       /* task size control register 1. */
++   u32 dma_rsvd1;       /* reserved */
++   u32 dma_rsvd2;       /* reserved */
++   u32 debugComp1;      /* debug comparator 1 */
++   u32 debugComp2;      /* debug comparator 2 */
++   u32 debugControl;    /* debug control */
++   u32 debugStatus;     /* debug status */
++   u32 ptdDebug;        /* priority task decode debug */
++   u32 dma_rsvd3[31];   /* reserved */
++};
++typedef volatile struct dmaRegs_s dmaRegs;
++
++#endif
++
++/*
++ * PTD contrl reg bits
++ */
++#define PTD_CTL_TSK_PRI         0x8000
++#define PTD_CTL_COMM_PREFETCH   0x0001
++
++/*
++ * Task Control reg bits and field masks
++ */
++#define TASK_CTL_EN             0x8000
++#define TASK_CTL_VALID          0x4000
++#define TASK_CTL_ALWAYS         0x2000
++#define TASK_CTL_INIT_MASK      0x1f00
++#define TASK_CTL_ASTRT          0x0080
++#define TASK_CTL_HIPRITSKEN     0x0040
++#define TASK_CTL_HLDINITNUM     0x0020
++#define TASK_CTL_ASTSKNUM_MASK  0x000f
++
++/*
++ * Priority reg bits and field masks
++ */
++#define PRIORITY_HLD            0x80
++#define PRIORITY_PRI_MASK       0x07
++
++/*
++ * Debug Control reg bits and field masks
++ */
++#define DBG_CTL_BLOCK_TASKS_MASK    0xffff0000
++#define DBG_CTL_AUTO_ARM            0x00008000
++#define DBG_CTL_BREAK               0x00004000
++#define DBG_CTL_COMP1_TYP_MASK      0x00003800
++#define DBG_CTL_COMP2_TYP_MASK      0x00000070
++#define DBG_CTL_EXT_BREAK           0x00000004
++#define DBG_CTL_INT_BREAK           0x00000002
++
++/*
++ * PTD Debug reg selector addresses
++ * This reg must be written with a value to show the contents of
++ * one of the desired internal register.
++ */
++#define PTD_DBG_REQ             0x00 /* shows the state of 31 initiators */
++#define PTD_DBG_TSK_VLD_INIT    0x01 /* shows which 16 tasks are valid and
++                                        have initiators asserted */
++
++
++/*
++ * General return values
++ */
++#define MCD_OK                   0
++#define MCD_ERROR               -1
++#define MCD_TABLE_UNALIGNED     -2
++#define MCD_CHANNEL_INVALID     -3
++
++/*
++ * MCD_initDma input flags
++ */
++#define MCD_RELOC_TASKS         0x00000001
++#define MCD_NO_RELOC_TASKS      0x00000000
++#define MCD_COMM_PREFETCH_EN    0x00000002  /* Commbus Prefetching - MCF547x/548x ONLY */
++
++/*
++ * MCD_dmaStatus Status Values for each channel
++ */
++#define MCD_NO_DMA  1 /* No DMA has been requested since reset */
++#define MCD_IDLE    2 /* DMA active, but the initiator is currently inactive */
++#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
++#define MCD_PAUSED  4 /* DMA active but it is currently paused */
++#define MCD_HALTED  5 /* the most recent DMA has been killed with MCD_killTask() */
++#define MCD_DONE    6 /* the most recent DMA has completed. */
++
++
++/*
++ * MCD_startDma parameter defines
++ */
++
++/*
++ * Constants for the funcDesc parameter
++ */
++/* Byte swapping: */
++#define MCD_NO_BYTE_SWAP    0x00045670  /* to disable byte swapping. */
++#define MCD_BYTE_REVERSE    0x00076540  /* to reverse the bytes of each u32 of the DMAed data. */
++#define MCD_U16_REVERSE     0x00067450  /* to reverse the 16-bit halves of
++                                           each 32-bit data value being DMAed.*/
++#define MCD_U16_BYTE_REVERSE    0x00054760 /* to reverse the byte halves of each
++                                            16-bit half of each 32-bit data value DMAed */
++#define MCD_NO_BIT_REV  0x00000000  /* do not reverse the bits of each byte DMAed. */
++#define MCD_BIT_REV     0x00088880  /* reverse the bits of each byte DMAed */
++/* CRCing: */
++#define MCD_CRC16       0xc0100000  /* to perform CRC-16 on DMAed data. */
++#define MCD_CRCCCITT    0xc0200000  /* to perform CRC-CCITT on DMAed data. */
++#define MCD_CRC32       0xc0300000  /* to perform CRC-32 on DMAed data. */
++#define MCD_CSUMINET    0xc0400000  /* to perform internet checksums on DMAed data.*/
++#define MCD_NO_CSUM     0xa0000000  /* to perform no checksumming. */
++
++#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
++#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
++
++/*
++ * Constants for the flags parameter
++ */
++#define MCD_TT_FLAGS_RL   0x00000001 /* Read line */
++#define MCD_TT_FLAGS_CW   0x00000002 /* Combine Writes */
++#define MCD_TT_FLAGS_SP   0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY  */
++#define MCD_TT_FLAGS_MASK 0x000000ff
++#define MCD_TT_FLAGS_DEF  (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
++
++#define MCD_SINGLE_DMA  0x00000100 /* Unchained DMA */
++#define MCD_CHAIN_DMA              /* TBD */
++#define MCD_EU_DMA                 /* TBD */
++#define MCD_FECTX_DMA   0x00001000 /* FEC TX ring DMA */
++#define MCD_FECRX_DMA   0x00002000 /* FEC RX ring DMA */
++
++
++/* these flags are valid for MCD_startDma and the chained buffer descriptors */
++#define MCD_BUF_READY   0x80000000 /* indicates that this buffer is now under the DMA's control */
++#define MCD_WRAP        0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
++#define MCD_INTERRUPT   0x10000000 /* to generate an interrupt after completion of the DMA. */
++#define MCD_END_FRAME   0x08000000 /* tell the DMA to end the frame when transferring
++                                      last byte of data in buffer */
++#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
++                                      prior to performing the DMA. */
++
++/* Defines for the FEC buffer descriptor control/status word*/
++#define MCD_FEC_BUF_READY   0x8000
++#define MCD_FEC_WRAP        0x2000
++#define MCD_FEC_INTERRUPT   0x1000
++#define MCD_FEC_END_FRAME   0x0800
++
++
++/*
++ * Defines for general intuitiveness
++ */
++
++#define MCD_TRUE  1
++#define MCD_FALSE 0
++
++/*
++ * Three different cases for destination and source.
++ */
++#define MINUS1          -1
++#define ZERO            0
++#define PLUS1           1
++
++#ifndef DEFINESONLY
++
++/* Task Table Entry struct*/
++typedef struct {
++    u32 TDTstart;   /* task descriptor table start */
++    u32 TDTend;     /* task descriptor table end */
++    u32 varTab;     /* variable table start */
++    u32 FDTandFlags;    /* function descriptor table start and flags */
++    volatile u32 descAddrAndStatus;
++    volatile u32 modifiedVarTab;
++    u32 contextSaveSpace;   /* context save space start */
++    u32 literalBases;
++} TaskTableEntry;
++
++
++/* Chained buffer descriptor */
++typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
++struct MCD_bufDesc_struct {
++   u32 flags;         /* flags describing the DMA */
++   u32 csumResult;    /* checksum from checksumming performed since last checksum reset */
++   s8  *srcAddr;      /* the address to move data from */
++   s8  *destAddr;     /* the address to move data to */
++   s8  *lastDestAddr; /* the last address written to */
++   u32 dmaSize;       /* the number of bytes to transfer independent of the transfer size */
++   MCD_bufDesc *next; /* next buffer descriptor in chain */
++   u32 info;          /* private information about this descriptor;  DMA does not affect it */
++};
++
++/* Progress Query struct */
++typedef volatile struct MCD_XferProg_struct {
++   s8 *lastSrcAddr;         /* the most-recent or last, post-increment source address */
++   s8 *lastDestAddr;        /* the most-recent or last, post-increment destination address */
++   u32  dmaSize;            /* the amount of data transferred for the current buffer */
++   MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
++} MCD_XferProg;
++
++
++/* FEC buffer descriptor */
++typedef volatile struct MCD_bufDescFec_struct {
++    u16 statCtrl;
++    u16 length;
++    u32 dataPointer;
++} MCD_bufDescFec;
++
++
++/*************************************************************************/
++/*
++ * API function Prototypes  - see MCD_dmaApi.c for further notes
++ */
++
++/*
++ * MCD_startDma starts a particular kind of DMA .
++ */
++int MCD_startDma (
++   int channel,   /* the channel on which to run the DMA */
++   s8  *srcAddr,  /* the address to move data from, or buffer-descriptor address */
++   s16 srcIncr,   /* the amount to increment the source address per transfer */
++   s8  *destAddr, /* the address to move data to */
++   s16 destIncr,  /* the amount to increment the destination address per transfer */
++   u32 dmaSize,   /* the number of bytes to transfer independent of the transfer size */
++   u32 xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
++   u32 initiator, /* what device initiates the DMA */
++   int priority,  /* priority of the DMA */
++   u32 flags,     /* flags describing the DMA */
++   u32 funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
++);
++
++/* 
++ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA 
++ * registers, relocating and creating the appropriate task structures, and 
++ * setting up some global settings
++ */
++int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
++
++/* 
++ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
++ */
++int MCD_dmaStatus (int channel);
++
++/* 
++ * MCD_XferProgrQuery() returns progress of DMA on requested channel
++ */
++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
++
++/* 
++ * MCD_killDma() halts the DMA on the requested channel, without any
++ * intention of resuming the DMA.
++ */
++int MCD_killDma (int channel);
++
++/* 
++ * MCD_continDma() continues a DMA which as stopped due to encountering an
++ * unready buffer descriptor.
++ */
++int MCD_continDma (int channel);
++
++/* 
++ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
++ * running on that channel). 
++ */
++int MCD_pauseDma (int channel);
++
++/* 
++ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
++ * running on that channel).
++ */
++int MCD_resumeDma (int channel);
++
++/* 
++ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
++ */
++int MCD_csumQuery (int channel, u32 *csum);
++
++/* 
++ * MCD_getCodeSize provides the packed size required by the microcoded task
++ * and structures.
++ */
++int MCD_getCodeSize(void);
++
++/*
++ * MCD_getVersion provides a pointer to a version string and returns a
++ * version number.
++ */
++int MCD_getVersion(char **longVersion);
++
++/* macro for setting a location in the variable table */
++#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
++   /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
++      so I'm avoiding surrounding it with "do {} while(0)" */
++
++#endif  /* DEFINESONLY */
++
++#endif /* _MCD_API_H */
+--- /dev/null
++++ b/drivers/dma/MCD_dmaApi.c
+@@ -0,0 +1,968 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++
++/*
++ * File:        MCD_dmaApi.c
++ * Purpose:     Main C file for multi-channel DMA API.
++ *
++ * Notes:
++ *
++ *
++ * Modifications:
++ *
++ *
++ */
++#include <asm/types.h>
++#include <asm/MCD_dma.h>
++#include <asm/virtconvert.h>
++#include "MCD_tasksInit.h"
++#include "MCD_progCheck.h"
++
++/********************************************************************/
++/*
++ * This is an API-internal pointer to the DMA's registers
++ */
++dmaRegs *MCD_dmaBar;
++
++/*
++ * These are the real and model task tables as generated by the
++ * build process
++ */
++extern TaskTableEntry MCD_realTaskTableSrc[NCHANNELS];
++extern TaskTableEntry MCD_modelTaskTableSrc[NUMOFVARIANTS];
++
++/*
++ * However, this (usually) gets relocated to on-chip SRAM, at which
++ * point we access them as these tables
++ */
++volatile TaskTableEntry *MCD_taskTable;
++TaskTableEntry *MCD_modelTaskTable;
++
++
++/*
++ * MCD_chStatus[] is an array of status indicators for remembering
++ * whether a DMA has ever been attempted on each channel, pausing
++ * status, etc.
++ */
++static int MCD_chStatus[NCHANNELS] =
++{
++    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
++    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
++    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA,
++    MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA, MCD_NO_DMA
++};
++
++/*
++ * Prototypes for local functions
++ */
++static void MCD_memcpy (int *dest, int *src, u32 size);
++static void MCD_resmActions (int channel);
++
++/*
++ * Buffer descriptors used for storage of progress info for single Dmas
++ * Also used as storage for the DMA for CRCs for single DMAs
++ * Otherwise, the DMA does not parse these buffer descriptors
++ */
++#ifdef MCD_INCLUDE_EU
++extern MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
++#else
++MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
++#endif
++MCD_bufDesc *MCD_relocBuffDesc;
++
++
++/*
++ * Defines for the debug control register's functions
++ */
++#define DBG_CTL_COMP1_TASK  (0x00002000) /* have comparator 1 look for a task # */
++#define DBG_CTL_ENABLE      (DBG_CTL_AUTO_ARM    | \
++                             DBG_CTL_BREAK       | \
++                             DBG_CTL_INT_BREAK   | \
++                             DBG_CTL_COMP1_TASK)
++#define DBG_CTL_DISABLE     (DBG_CTL_AUTO_ARM    | \
++                             DBG_CTL_INT_BREAK   | \
++                             DBG_CTL_COMP1_TASK)
++#define DBG_KILL_ALL_STAT   (0xFFFFFFFF)
++
++/*
++ * Offset to context save area where progress info is stored
++ */
++#define CSAVE_OFFSET        10
++
++/*
++ * Defines for Byte Swapping
++ */
++#define MCD_BYTE_SWAP_KILLER    0xFFF8888F
++#define MCD_NO_BYTE_SWAP_ATALL  0x00040000
++
++/*
++ * Execution Unit Identifiers
++ */
++#define MAC  0  /* legacy - not used */
++#define LUAC 1  /* legacy - not used */
++#define CRC  2  /* legacy - not used */
++#define LURC 3  /* Logic Unit with CRC */
++
++/*
++ * Task Identifiers
++ */
++#define TASK_CHAINNOEU  0
++#define TASK_SINGLENOEU 1
++#ifdef MCD_INCLUDE_EU
++#define TASK_CHAINEU    2
++#define TASK_SINGLEEU   3
++#define TASK_FECRX      4
++#define TASK_FECTX      5
++#else
++#define TASK_CHAINEU    0
++#define TASK_SINGLEEU   1
++#define TASK_FECRX      2
++#define TASK_FECTX      3
++#endif
++
++/*
++ * Structure to remember which variant is on which channel
++ * TBD- need this?
++ */
++typedef struct MCD_remVariants_struct MCD_remVariant;
++struct MCD_remVariants_struct
++{
++   int remDestRsdIncr[NCHANNELS];  /* -1,0,1 */
++   int remSrcRsdIncr[NCHANNELS];   /* -1,0,1 */
++   s16 remDestIncr[NCHANNELS];     /* DestIncr */
++   s16 remSrcIncr[NCHANNELS];      /* srcIncr */
++   u32 remXferSize[NCHANNELS];     /* xferSize */
++};
++
++/*
++ * Structure to remember the startDma parameters for each channel
++ */
++MCD_remVariant MCD_remVariants;
++/********************************************************************/
++/*
++ * Function: MCD_initDma
++ * Purpose:  Initializes the DMA API by setting up a pointer to the DMA
++ *           registers, relocating and creating the appropriate task
++ *           structures, and setting up some global settings
++ * Arguments:
++ *  dmaBarAddr    - pointer to the multichannel DMA registers
++ *  taskTableDest - location to move DMA task code and structs to
++ *  flags         - operational parameters
++ * Return Value:
++ *  MCD_TABLE_UNALIGNED if taskTableDest is not 512-byte aligned
++ *  MCD_OK otherwise
++ */
++extern u32 MCD_funcDescTab0[];
++
++int MCD_initDma (dmaRegs *dmaBarAddr, void *taskTableDest, u32 flags)
++{
++    int i;
++    TaskTableEntry *entryPtr;
++
++    /* setup the local pointer to register set */
++    MCD_dmaBar = dmaBarAddr;
++
++    /* do we need to move/create a task table */
++    if ((flags & MCD_RELOC_TASKS) != 0)
++    {
++        int fixedSize;
++        u32 *fixedPtr;
++        /*int *tablePtr = taskTableDest;TBD*/
++        int varTabsOffset, funcDescTabsOffset, contextSavesOffset;
++        int taskDescTabsOffset;
++        int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize;
++        int taskDescTabSize;
++
++        int i;
++
++        /* check if physical address is aligned on 512 byte boundary */
++        if (((u32)taskTableDest & 0x000001ff) != 0)
++            return(MCD_TABLE_UNALIGNED);
++
++        MCD_taskTable = taskTableDest; /* set up local pointer to task Table */
++
++        /*
++         * Create a task table:
++         * - compute aligned base offsets for variable tables and
++         *   function descriptor tables, then
++         * - loop through the task table and setup the pointers
++         * - copy over model task table with the the actual task descriptor
++         *   tables
++         */
++
++        taskTableSize = NCHANNELS * sizeof(TaskTableEntry);
++        /* align variable tables to size */
++        varTabsOffset = taskTableSize + (u32)taskTableDest;
++        if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0)
++            varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE);
++        /* align function descriptor tables */
++        varTabsSize = NCHANNELS * VAR_TAB_SIZE;
++        funcDescTabsOffset = varTabsOffset + varTabsSize;
++
++        if ((funcDescTabsOffset & (FUNCDESC_TAB_SIZE - 1)) != 0)
++            funcDescTabsOffset = (funcDescTabsOffset + FUNCDESC_TAB_SIZE) &
++            (~FUNCDESC_TAB_SIZE);
++
++        funcDescTabsSize = FUNCDESC_TAB_NUM * FUNCDESC_TAB_SIZE;
++        contextSavesOffset = funcDescTabsOffset + funcDescTabsSize;
++        contextSavesSize = (NCHANNELS * CONTEXT_SAVE_SIZE);
++        fixedSize = taskTableSize + varTabsSize + funcDescTabsSize +
++                    contextSavesSize;
++
++        /* zero the thing out */
++        fixedPtr = (u32 *)taskTableDest;
++        for (i = 0;i<(fixedSize/4);i++)
++            fixedPtr[i] = 0;
++
++        entryPtr = (TaskTableEntry*)MCD_taskTable;
++        /* set up fixed pointers */
++        for (i = 0; i < NCHANNELS; i++)
++        {
++            entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */
++            entryPtr[i].FDTandFlags = (u32)funcDescTabsOffset | MCD_TT_FLAGS_DEF;
++            entryPtr[i].contextSaveSpace = (u32)contextSavesOffset;
++            varTabsOffset += VAR_TAB_SIZE;
++#ifdef MCD_INCLUDE_EU /* if not there is only one, just point to the same one */
++            funcDescTabsOffset += FUNCDESC_TAB_SIZE;
++#endif
++            contextSavesOffset += CONTEXT_SAVE_SIZE;
++        }
++        /* copy over the function descriptor table */
++        for ( i = 0; i < FUNCDESC_TAB_NUM; i++)
++        {
++            MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK),
++                       (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE);
++        }
++
++        /* copy model task table to where the context saves stuff leaves off*/
++        MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset;
++
++        MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc,
++                    NUMOFVARIANTS * sizeof(TaskTableEntry));
++
++        entryPtr = MCD_modelTaskTable; /* point to local version of
++                                                            model task table */
++        taskDescTabsOffset = (u32)MCD_modelTaskTable +
++                            (NUMOFVARIANTS * sizeof(TaskTableEntry));
++
++        /* copy actual task code and update TDT ptrs in local model task table */
++        for (i = 0; i < NUMOFVARIANTS; i++)
++        {
++            taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4;
++            MCD_memcpy ((void*)taskDescTabsOffset, (void*)entryPtr[i].TDTstart, taskDescTabSize);
++            entryPtr[i].TDTstart = (u32)taskDescTabsOffset;
++            taskDescTabsOffset += taskDescTabSize;
++            entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4;
++        }
++#ifdef MCD_INCLUDE_EU /* Tack single DMA BDs onto end of code so API controls
++                         where they are since DMA might write to them */        
++        MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4);
++#else /* DMA does not touch them so they can be wherever and we don't need to 
++         waste SRAM on them */
++        MCD_relocBuffDesc = MCD_singleBufDescs;
++#endif
++    }
++    else
++    {
++        /* point the would-be relocated task tables and the
++        buffer descriptors to the ones the linker generated */
++
++        if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0)
++            return(MCD_TABLE_UNALIGNED);
++
++        /* need to add code to make sure that every thing else is aligned properly TBD*/
++        /* this is problematic if we init more than once or after running tasks,
++            need to add variable to see if we have aleady init'd */
++        entryPtr = MCD_realTaskTableSrc;
++        for (i = 0; i < NCHANNELS; i++)
++        {
++            if (((entryPtr[i].varTab & (VAR_TAB_SIZE - 1)) != 0) ||
++                ((entryPtr[i].FDTandFlags & (FUNCDESC_TAB_SIZE - 1)) != 0))
++                return(MCD_TABLE_UNALIGNED);
++        }
++
++        MCD_taskTable = MCD_realTaskTableSrc;
++        MCD_modelTaskTable = MCD_modelTaskTableSrc;
++        MCD_relocBuffDesc = MCD_singleBufDescs;
++    }
++
++
++    /* Make all channels as totally inactive, and remember them as such: */
++
++    MCD_dmaBar->taskbar = (u32) MCD_taskTable;
++    for (i = 0;  i < NCHANNELS;  i++)
++    {
++        MCD_dmaBar->taskControl[i] = 0x0;
++        MCD_chStatus[i] = MCD_NO_DMA;
++    }
++
++   /* Set up pausing mechanism to inactive state: */
++    MCD_dmaBar->debugComp1 = 0;  /* no particular values yet for either comparator registers */
++    MCD_dmaBar->debugComp2 = 0;
++    MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
++    MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT;
++
++    /* enable or disable commbus prefetch, really need an ifdef or
++       something to keep from trying to set this in the 8220 */
++    if ((flags & MCD_COMM_PREFETCH_EN) != 0)
++        MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH;
++    else
++        MCD_dmaBar->ptdControl |= PTD_CTL_COMM_PREFETCH;
++
++    return(MCD_OK);
++}
++/*********************** End of MCD_initDma() ***********************/
++
++/********************************************************************/
++/* Function:   MCD_dmaStatus
++ * Purpose:    Returns the status of the DMA on the requested channel
++ * Arguments:  channel - channel number
++ * Returns:    Predefined status indicators
++ */
++int MCD_dmaStatus (int channel)
++{
++    u16 tcrValue;
++
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    tcrValue = MCD_dmaBar->taskControl[channel];
++    if ((tcrValue & TASK_CTL_EN) == 0)
++    {  /* nothing running */
++        /* if last reported with task enabled */
++        if (   MCD_chStatus[channel] == MCD_RUNNING
++            || MCD_chStatus[channel] == MCD_IDLE)
++            MCD_chStatus[channel] = MCD_DONE;
++    }
++    else /* something is running */
++    {
++        /* There are three possibilities: paused, running or idle. */
++        if (   MCD_chStatus[channel] == MCD_RUNNING
++            || MCD_chStatus[channel] == MCD_IDLE)
++        {
++            MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT;
++            /* This register is selected to know which initiator is
++            actually asserted. */
++            if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 )
++                MCD_chStatus[channel] = MCD_RUNNING;
++            else
++                MCD_chStatus[channel] = MCD_IDLE;
++        /* do not change the status if it is already paused. */
++        }
++    }
++    return MCD_chStatus[channel];
++}
++/******************** End of MCD_dmaStatus() ************************/
++
++/********************************************************************/
++/* Function:    MCD_startDma
++ * Ppurpose:    Starts a particular kind of DMA
++ * Arguments:   see below
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ */
++
++int MCD_startDma (
++    int  channel,   /* the channel on which to run the DMA */
++    s8   *srcAddr,  /* the address to move data from, or physical buffer-descriptor address */
++    s16  srcIncr,   /* the amount to increment the source address per transfer */
++    s8   *destAddr, /* the address to move data to */
++    s16  destIncr,  /* the amount to increment the destination address per transfer */
++    u32  dmaSize,   /* the number of bytes to transfer independent of the transfer size */
++    u32  xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
++    u32  initiator, /* what device initiates the DMA */
++    int  priority,  /* priority of the DMA */
++    u32  flags,     /* flags describing the DMA */
++    u32  funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
++#ifdef MCD_NEED_ADDR_TRANS
++    s8   *srcAddrVirt /* virtual buffer descriptor address TBD*/
++#endif
++)
++{
++    int srcRsdIncr, destRsdIncr;
++    int *cSave;
++    short xferSizeIncr;
++    int tcrCount = 0;
++#ifdef MCD_INCLUDE_EU
++    u32 *realFuncArray;
++#endif
++
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++        
++    /* tbd - need to determine the proper response to a bad funcDesc when not 
++       including EU functions, for now, assign a benign funcDesc, but maybe
++       should return an error */
++#ifndef MCD_INCLUDE_EU
++    funcDesc = MCD_FUNC_NOEU1;
++#endif
++        
++#ifdef MCD_DEBUG
++printf("startDma:Setting up params\n");
++#endif
++   /* Set us up for task-wise priority.  We don't technically need to do this on every start, but
++      since the register involved is in the same longword as other registers that users are in control
++      of, setting it more than once is probably preferable.  That since the documentation doesn't seem
++      to be completely consistent about the nature of the PTD control register. */
++    MCD_dmaBar->ptdControl |= (u16) 0x8000;
++#if 1 /* Not sure what we need to keep here rtm TBD */
++    /* Calculate additional parameters to the regular DMA calls. */
++    srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0);
++    destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0);
++
++    xferSizeIncr = (xferSize & 0xffff) | 0x20000000;
++
++    /* Remember for each channel which variant is running. */
++    MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr;
++    MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr;
++    MCD_remVariants.remDestIncr[channel] = destIncr;
++    MCD_remVariants.remSrcIncr[channel] = srcIncr;
++    MCD_remVariants.remXferSize[channel] = xferSize;
++#endif
++
++    cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) + CSAVE_OFFSET + CURRBD;
++
++#ifdef MCD_INCLUDE_EU /* may move this to EU specific calls */
++    realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00);
++    /* Modify the LURC's normal and byte-residue-loop functions according to parameter. */
++    realFuncArray[(LURC*16)] = xferSize == 4 ?
++                                 funcDesc : xferSize == 2 ?
++                                     funcDesc & 0xfffff00f : funcDesc & 0xffff000f;
++    realFuncArray[(LURC*16+1)] = (funcDesc & MCD_BYTE_SWAP_KILLER) | MCD_NO_BYTE_SWAP_ATALL;
++#endif
++   /* Write the initiator field in the TCR, and also set the initiator-hold
++      bit.  Note that,due to a hardware quirk, this could collide with an
++      MDE access to the initiator-register file, so we have to verify that the write
++      reads back correctly. */
++
++    MCD_dmaBar->taskControl[channel] =
++        (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
++
++    while(((MCD_dmaBar->taskControl[channel] & 0x1fff) !=
++          ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) &&
++            (tcrCount < 1000))
++    {
++        tcrCount++;
++        /*MCD_dmaBar->ptd_tcr[channel] = (initiator << 8) | 0x0020;*/
++        MCD_dmaBar->taskControl[channel] =
++            (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
++    }
++
++    MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK;
++    /* should be albe to handle this stuff with only one write to ts reg - tbd */
++    if (channel < 8 && channel >= 0)
++    {
++        MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4);
++        MCD_dmaBar->taskSize0 |= (xferSize & 3) << (((7 - channel)*4) + 2);
++        MCD_dmaBar->taskSize0 |= (xferSize & 3) << ((7 - channel)*4);
++    }
++    else
++    {
++        MCD_dmaBar->taskSize1 &= ~(0xf << (15-channel)*4);
++        MCD_dmaBar->taskSize1 |= (xferSize & 3) << (((15 - channel)*4) + 2);
++        MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4);
++    }
++
++    /* setup task table flags/options which mostly control the line buffers */
++    MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK;
++    MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags);
++
++    if (flags & MCD_FECTX_DMA)
++    {
++        /* TDTStart and TDTEnd */
++        MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECTX].TDTstart;
++        MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECTX].TDTend;
++        MCD_startDmaENetXmit(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
++    }
++    else if (flags & MCD_FECRX_DMA)
++    {
++        /* TDTStart and TDTEnd */
++        MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_FECRX].TDTstart;
++        MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_FECRX].TDTend;
++        MCD_startDmaENetRcv(srcAddr, srcAddr, destAddr, MCD_taskTable, channel);
++    }
++    else if(flags & MCD_SINGLE_DMA)
++    {
++        /* this buffer descriptor is used for storing off initial parameters for later
++           progress query calculation and for the DMA to write the resulting checksum
++           The DMA does not use this to determine how to operate, that info is passed
++           with the init routine*/
++        MCD_relocBuffDesc[channel].srcAddr = srcAddr;
++        MCD_relocBuffDesc[channel].destAddr = destAddr;
++        MCD_relocBuffDesc[channel].lastDestAddr = destAddr;  /* definitely not its final value */
++        MCD_relocBuffDesc[channel].dmaSize = dmaSize;
++        MCD_relocBuffDesc[channel].flags = 0;       /* not used */
++        MCD_relocBuffDesc[channel].csumResult = 0;  /* not used */
++        MCD_relocBuffDesc[channel].next = 0;        /* not used */
++
++        /* Initialize the progress-querying stuff to show no progress:*/
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] = (int)srcAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] = (int)destAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] =
++                                             (u32) &(MCD_relocBuffDesc[channel]);
++        /* tbd - need to keep the user from trying to call the EU routine
++           when MCD_INCLUDE_EU is not defined */
++        if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
++        {
++           /* TDTStart and TDTEnd */
++           MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart;
++           MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend;
++           MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
++                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
++                                MCD_taskTable, channel);
++        }
++        else
++        {
++           /* TDTStart and TDTEnd */
++           MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart;
++           MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend;
++           MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
++                              xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
++                              MCD_taskTable, channel);
++        }
++    }
++    else
++    { /* chained DMAS */
++        /* Initialize the progress-querying stuff to show no progress:*/
++#if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
++          = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->srcAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
++          = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->destAddr;
++#else /* if using address translation, need the virtual addr of the first buffdesc */
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
++          = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
++          = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr;
++#endif
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = (u32) srcAddr;
++
++        if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
++        {
++          /*TDTStart and TDTEnd*/
++          MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart;
++          MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend;
++          MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize,
++                                    xferSizeIncr, cSave, MCD_taskTable, channel);
++        }
++        else
++        {
++          /*TDTStart and TDTEnd*/
++          MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart;
++          MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend;
++          MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize,
++                                 xferSizeIncr, cSave, MCD_taskTable, channel);
++        }
++    }
++    MCD_chStatus[channel] = MCD_IDLE;
++    return(MCD_OK);
++}
++
++/************************ End of MCD_startDma() *********************/
++
++/********************************************************************/
++/* Function:    MCD_XferProgrQuery
++ * Purpose:     Returns progress of DMA on requested channel
++ * Arguments:   channel - channel to retrieve progress for
++ *              progRep - pointer to user supplied MCD_XferProg struct
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ *
++ * Notes:
++ *  MCD_XferProgrQuery() upon completing or after aborting a DMA, or
++ *  while the DMA is in progress, this function returns the first
++ *  DMA-destination address not (or not yet) used in the DMA. When 
++ *  encountering a non-ready buffer descriptor, the information for
++ *  the last completed descriptor is returned.
++ *
++ *  MCD_XferProgQuery() has to avoid the possibility of getting
++ *  partially-updated information in the event that we should happen
++ *  to query DMA progress just as the DMA is updating it. It does that
++ *  by taking advantage of the fact context is not saved frequently for
++ *  the most part. We therefore read it at least twice until we get the
++ *  same information twice in a row.
++ *
++ *  Because a small, but not insignificant, amount of time is required
++ *  to write out the progress-query information, especially upon
++ *  completion of the DMA, it would be wise to guarantee some time lag
++ *  between successive readings of the progress-query information.
++ */
++
++/*
++ * How many iterations of the loop below to execute to stabilize values
++ */
++#define STABTIME 0
++
++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep)
++{
++    MCD_XferProg prevRep;
++    int again;  /* true if we are to try again to get consistent results */
++    int i;  /* used as a time-waste counter */
++    int destDiffBytes; /* Total number of bytes that we think actually got xfered. */
++    int numIterations; /* number of iterations */
++    int bytesNotXfered; /* bytes that did not get xfered. */
++    s8 *LWAlignedInitDestAddr, *LWAlignedCurrDestAddr;
++    int subModVal, addModVal; /* Mode values to added and subtracted from the
++                                final destAddr */
++
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    /* Read a trial value for the progress-reporting values*/
++    prevRep.lastSrcAddr =
++          (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
++    prevRep.lastDestAddr =
++          (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
++    prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
++    prevRep.currBufDesc =
++          (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
++    /* Repeatedly reread those values until they match previous values: */
++    do {
++        /* Waste a little bit of time to ensure stability: */
++        for (i = 0;  i < STABTIME;  i++)
++            i += i >> 2;  /* make sure this loop does something so that it doesn't get optimized out */
++        /* Check them again: */
++        progRep->lastSrcAddr =
++            (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
++        progRep->lastDestAddr =
++            (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET];
++        progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
++        progRep->currBufDesc =
++            (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
++       /* See if they match: */
++       if (   prevRep.lastSrcAddr != progRep->lastSrcAddr
++           || prevRep.lastDestAddr != progRep->lastDestAddr
++           || prevRep.dmaSize != progRep->dmaSize
++           || prevRep.currBufDesc != progRep->currBufDesc)
++       {
++          /* If they don't match, remember previous values and try again:*/
++          prevRep.lastSrcAddr = progRep->lastSrcAddr;
++          prevRep.lastDestAddr = progRep->lastDestAddr;
++          prevRep.dmaSize = progRep->dmaSize;
++          prevRep.currBufDesc = progRep->currBufDesc;
++          again = MCD_TRUE;
++       }
++       else
++          again = MCD_FALSE;
++    } while (again == MCD_TRUE);
++
++
++    /* Update the dCount, srcAddr and destAddr */
++    /* To calculate dmaCount, we consider destination address. C
++       overs M1,P1,Z for destination */
++    switch(MCD_remVariants.remDestRsdIncr[channel]) {
++        case MINUS1:
++           subModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++           addModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++           LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal;
++           LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal;
++           destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr;
++           bytesNotXfered = (destDiffBytes/MCD_remVariants.remDestIncr[channel]) *
++                            ( MCD_remVariants.remDestIncr[channel]
++                            + MCD_remVariants.remXferSize[channel]);
++           progRep->dmaSize = destDiffBytes - bytesNotXfered + addModVal - subModVal;
++           break;
++        case ZERO:
++           progRep->lastDestAddr = progRep->currBufDesc->destAddr;
++           break;
++        case PLUS1:
++           /* This value has to be subtracted from the final calculated dCount. */
++           subModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++           /* These bytes are already in lastDestAddr. */
++            addModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++            LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal;
++            LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal;
++            destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr);
++            numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel];
++            bytesNotXfered =  numIterations *
++                ( MCD_remVariants.remDestIncr[channel]
++                  - MCD_remVariants.remXferSize[channel]);
++           progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal;
++           break;
++        default:
++           break;
++    }
++
++    /* This covers M1,P1,Z for source */
++    switch(MCD_remVariants.remSrcRsdIncr[channel]) {
++        case MINUS1:
++            progRep->lastSrcAddr =
++                progRep->currBufDesc->srcAddr +
++                 ( MCD_remVariants.remSrcIncr[channel] *
++                   (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
++            break;
++        case ZERO:
++            progRep->lastSrcAddr = progRep->currBufDesc->srcAddr;
++            break;
++       case PLUS1:
++            progRep->lastSrcAddr =
++                progRep->currBufDesc->srcAddr +
++                 ( MCD_remVariants.remSrcIncr[channel] *
++                   (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
++          break;
++       default: break;
++    }
++
++    return(MCD_OK);
++}
++/******************* End of MCD_XferProgrQuery() ********************/
++
++/********************************************************************/
++/* MCD_resmActions() does the majority of the actions of a DMA resume.
++ * It is called from MCD_killDma() and MCD_resumeDma().  It has to be
++ * a separate function because the kill function has to negate the task
++ * enable before resuming it, but the resume function has to do nothing
++ * if there is no DMA on that channel (i.e., if the enable bit is 0).
++ */
++static void MCD_resmActions (int channel)
++{
++   MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
++   MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;
++   MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; /* This register is selected to know
++                                        which initiator is actually asserted. */
++   if((MCD_dmaBar->ptdDebug >> channel ) & 0x1)
++       MCD_chStatus[channel] = MCD_RUNNING;
++   else
++       MCD_chStatus[channel] = MCD_IDLE;
++}
++/********************* End of MCD_resmActions() *********************/
++
++/********************************************************************/
++/* Function:    MCD_killDma
++ * Purpose:     Halt the DMA on the requested channel, without any
++ *              intention of resuming the DMA.
++ * Arguments:   channel - requested channel
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ *
++ * Notes:
++ *  A DMA may be killed from any state, including paused state, and it
++ *  always goes to the MCD_HALTED state even if it is killed while in
++ *  the MCD_NO_DMA or MCD_IDLE states.
++ */
++int MCD_killDma (int channel)
++{
++   /* MCD_XferProg progRep; */
++
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    MCD_dmaBar->taskControl[channel] = 0x0;
++    MCD_resumeDma (channel);
++    /*
++     * This must be after the write to the TCR so that the task doesn't
++     * start up again momentarily, and before the status assignment so
++     * as to override whatever MCD_resumeDma() may do to the channel
++     * status.
++     */
++    MCD_chStatus[channel] = MCD_HALTED;
++
++    /*
++     * Update the current buffer descriptor's lastDestAddr field
++     *
++     * MCD_XferProgrQuery (channel, &progRep);
++     * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
++     */
++    return(MCD_OK);
++}
++/************************ End of MCD_killDma() **********************/
++
++/********************************************************************/
++/* Function:    MCD_continDma
++ * Purpose:     Continue a DMA which as stopped due to encountering an
++ *              unready buffer descriptor.
++ * Arguments:   channel - channel to continue the DMA on
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ *
++ * Notes:
++ *  This routine does not check to see if there is a task which can
++ *  be continued. Also this routine should not be used with single DMAs.
++ */
++int MCD_continDma (int channel)
++{
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    MCD_dmaBar->taskControl[channel] |= TASK_CTL_EN;
++    MCD_chStatus[channel] = MCD_RUNNING;
++
++    return(MCD_OK);
++}
++/********************** End of MCD_continDma() **********************/
++
++/*********************************************************************
++ * MCD_pauseDma() and MCD_resumeDma() below use the DMA's debug unit
++ * to freeze a task and resume it.  We freeze a task by breakpointing
++ * on the stated task.  That is, not any specific place in the task,
++ * but any time that task executes.  In particular, when that task
++ * executes, we want to freeze that task and only that task.
++ *
++ * The bits of the debug control register influence interrupts vs.
++ * breakpoints as follows:
++ * - Bits 14 and 0 enable or disable debug functions.  If enabled, you
++ *   will get the interrupt but you may or may not get a breakpoint.
++ * - Bits 2 and 1 decide whether you also get a breakpoint in addition
++ *   to an interrupt.
++ *
++ * The debug unit can do these actions in response to either internally
++ * detected breakpoint conditions from the comparators, or in response
++ * to the external breakpoint pin, or both.
++ * - Bits 14 and 1 perform the above-described functions for
++ *   internally-generated conditions, i.e., the debug comparators.
++ * - Bits 0 and 2 perform the above-described functions for external
++ *   conditions, i.e., the breakpoint external pin.
++ *
++ * Note that, although you "always" get the interrupt when you turn
++ * the debug functions, the interrupt can nevertheless, if desired, be
++ * masked by the corresponding bit in the PTD's IMR. Note also that
++ * this means that bits 14 and 0 must enable debug functions before
++ * bits 1 and 2, respectively, have any effect.
++ *
++ * NOTE: It's extremely important to not pause more than one DMA channel 
++ *  at a time.
++ ********************************************************************/
++
++/********************************************************************/
++/* Function:    MCD_pauseDma
++ * Purpose:     Pauses the DMA on a given channel (if any DMA is running
++ *              on that channel).
++ * Arguments:   channel
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ */
++int MCD_pauseDma (int channel)
++{
++    /* MCD_XferProg progRep; */
++
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
++    {
++        MCD_dmaBar->debugComp1 = channel;
++        MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16));
++        MCD_chStatus[channel] = MCD_PAUSED;
++
++        /*
++         * Update the current buffer descriptor's lastDestAddr field
++         *
++         * MCD_XferProgrQuery (channel, &progRep);
++         * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
++         */
++    }
++    return(MCD_OK);
++}
++/************************* End of MCD_pauseDma() ********************/
++
++/********************************************************************/
++/* Function:    MCD_resumeDma
++ * Purpose:     Resumes the DMA on a given channel (if any DMA is
++ *              running on that channel).
++ * Arguments:   channel - channel on which to resume DMA
++ * Returns:     MCD_CHANNEL_INVALID if channel is invalid, else MCD_OK
++ */
++int MCD_resumeDma (int channel)
++{
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    if (MCD_dmaBar->taskControl[channel] & TASK_CTL_EN)
++        MCD_resmActions (channel);
++
++    return(MCD_OK);
++}
++/************************ End of MCD_resumeDma() ********************/
++
++/********************************************************************/
++/* Function:    MCD_csumQuery
++ * Purpose:     Provide the checksum after performing a non-chained DMA
++ * Arguments:   channel - channel to report on
++ *              csum - pointer to where to write the checksum/CRC
++ * Returns:     MCD_ERROR if the channel is invalid, else MCD_OK
++ *
++ * Notes:
++ *
++ */
++int MCD_csumQuery (int channel, u32 *csum)
++{
++#ifdef MCD_INCLUDE_EU
++    if((channel < 0) || (channel >= NCHANNELS))
++        return(MCD_CHANNEL_INVALID);
++
++    *csum = MCD_relocBuffDesc[channel].csumResult;
++    return(MCD_OK);
++#else
++    return(MCD_ERROR);
++#endif
++}
++/*********************** End of MCD_resumeDma() *********************/
++
++/********************************************************************/
++/* Function:    MCD_getCodeSize
++ * Purpose:     Provide the size requirements of the microcoded tasks
++ * Returns:     Size in bytes
++ */
++int MCD_getCodeSize(void)
++{
++#ifdef MCD_INCLUDE_EU
++    return(0x2b5c);
++#else
++    return(0x173c);
++#endif
++}
++/********************** End of MCD_getCodeSize() ********************/
++
++/********************************************************************/
++/* Function:    MCD_getVersion
++ * Purpose:     Provide the version string and number
++ * Arguments:   longVersion - user supplied pointer to a pointer to a char
++ *                    which points to the version string
++ * Returns:     Version number and version string (by reference)
++ */
++char MCD_versionString[] = "Multi-channel DMA API Alpha v0.3 (2004-04-26)";
++#define MCD_REV_MAJOR   0x00
++#define MCD_REV_MINOR   0x03
++
++int MCD_getVersion(char **longVersion)
++{
++    *longVersion = MCD_versionString;
++    return((MCD_REV_MAJOR << 8) | MCD_REV_MINOR);
++}
++/********************** End of MCD_getVersion() *********************/
++
++/********************************************************************/
++/* Private version of memcpy()
++ * Note that everything this is used for is longword-aligned.
++ */
++static void MCD_memcpy (int *dest, int *src, u32 size)
++{
++    u32 i;
++
++    for (i = 0;  i < size;  i += sizeof(int), dest++, src++)
++        *dest = *src;
++}
++/********************************************************************/
+--- /dev/null
++++ b/drivers/dma/MCD_progCheck.h
+@@ -0,0 +1,33 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++ /* This file is autogenerated. Do not change */
++#define CURRBD 4
++#define DCOUNT 6
++#define DESTPTR 5
++#define SRCPTR 7
+--- /dev/null
++++ b/drivers/dma/MCD_tasks.c
+@@ -0,0 +1,2452 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++/*
++ * File:        MCD_tasks.c
++ * Purpose:     Contains task code and structures for Multi-channel DMA
++ *
++ * Notes:
++ *
++ *
++ * Modifications:
++ *
++ *
++ */
++
++#include <asm/MCD_dma.h>
++
++u32 MCD_varTab0[];
++u32 MCD_varTab1[];
++u32 MCD_varTab2[];
++u32 MCD_varTab3[];
++u32 MCD_varTab4[];
++u32 MCD_varTab5[];
++u32 MCD_varTab6[];
++u32 MCD_varTab7[];
++u32 MCD_varTab8[];
++u32 MCD_varTab9[];
++u32 MCD_varTab10[];
++u32 MCD_varTab11[];
++u32 MCD_varTab12[];
++u32 MCD_varTab13[];
++u32 MCD_varTab14[];
++u32 MCD_varTab15[];
++
++u32 MCD_funcDescTab0[];
++#ifdef MCD_INCLUDE_EU
++u32 MCD_funcDescTab1[];
++u32 MCD_funcDescTab2[];
++u32 MCD_funcDescTab3[];
++u32 MCD_funcDescTab4[];
++u32 MCD_funcDescTab5[];
++u32 MCD_funcDescTab6[];
++u32 MCD_funcDescTab7[];
++u32 MCD_funcDescTab8[];
++u32 MCD_funcDescTab9[];
++u32 MCD_funcDescTab10[];
++u32 MCD_funcDescTab11[];
++u32 MCD_funcDescTab12[];
++u32 MCD_funcDescTab13[];
++u32 MCD_funcDescTab14[];
++u32 MCD_funcDescTab15[];
++#endif
++
++u32 MCD_contextSave0[];
++u32 MCD_contextSave1[];
++u32 MCD_contextSave2[];
++u32 MCD_contextSave3[];
++u32 MCD_contextSave4[];
++u32 MCD_contextSave5[];
++u32 MCD_contextSave6[];
++u32 MCD_contextSave7[];
++u32 MCD_contextSave8[];
++u32 MCD_contextSave9[];
++u32 MCD_contextSave10[];
++u32 MCD_contextSave11[];
++u32 MCD_contextSave12[];
++u32 MCD_contextSave13[];
++u32 MCD_contextSave14[];
++u32 MCD_contextSave15[];
++
++u32 MCD_realTaskTableSrc[] =
++{
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab0,   /* Task 0 Variable Table */
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave0,  /* Task 0 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab1,   /* Task 1 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab1,  /* Task 1 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave1,  /* Task 1 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab2,   /* Task 2 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab2,  /* Task 2 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave2,  /* Task 2 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab3,   /* Task 3 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab3,  /* Task 3 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave3,  /* Task 3 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab4,   /* Task 4 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab4,  /* Task 4 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave4,  /* Task 4 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab5,   /* Task 5 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab5,  /* Task 5 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave5,  /* Task 5 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab6,   /* Task 6 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab6,  /* Task 6 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave6,  /* Task 6 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab7,   /* Task 7 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab7,  /* Task 7 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave7,  /* Task 7 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab8,   /* Task 8 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab8,  /* Task 8 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave8,  /* Task 8 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab9,   /* Task 9 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab9,  /* Task 9 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave9,  /* Task 9 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab10,  /* Task 10 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab10, /* Task 10 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave10, /* Task 10 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab11,  /* Task 11 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab11, /* Task 11 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave11, /* Task 11 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab12,  /* Task 12 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab12, /* Task 12 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave12, /* Task 12 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab13,  /* Task 13 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab13, /* Task 13 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave13, /* Task 13 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab14,  /* Task 14 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab14, /* Task 14 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave14, /* Task 14 context save space */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_varTab15,  /* Task 15 Variable Table */
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_funcDescTab15, /* Task 15 Function Descriptor Table & Flags */
++#else
++    (u32)MCD_funcDescTab0,  /* Task 0 Function Descriptor Table & Flags */
++#endif
++    0x00000000,
++    0x00000000,
++    (u32)MCD_contextSave15, /* Task 15 context save space */
++    0x00000000,
++};
++
++
++u32 MCD_varTab0[] =
++{   /* Task 0 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++
++u32 MCD_varTab1[] =
++{   /* Task 1 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab2[]=
++{   /* Task 2 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab3[]=
++{   /* Task 3 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab4[]=
++{   /* Task 4 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab5[]=
++{   /* Task 5 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab6[]=
++{   /* Task 6 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab7[]=
++{   /* Task 7 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab8[]=
++{   /* Task 8 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab9[]=
++{   /* Task 9 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab10[]=
++{   /* Task 10 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab11[]=
++{   /* Task 11 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab12[]=
++{   /* Task 12 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab13[]=
++{   /* Task 13 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab14[]=
++{   /* Task 14 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_varTab15[]=
++{   /* Task 15 Variable Table */
++    0x00000000, /* var[0] */
++    0x00000000, /* var[1] */
++    0x00000000, /* var[2] */
++    0x00000000, /* var[3] */
++    0x00000000, /* var[4] */
++    0x00000000, /* var[5] */
++    0x00000000, /* var[6] */
++    0x00000000, /* var[7] */
++    0x00000000, /* var[8] */
++    0x00000000, /* var[9] */
++    0x00000000, /* var[10] */
++    0x00000000, /* var[11] */
++    0x00000000, /* var[12] */
++    0x00000000, /* var[13] */
++    0x00000000, /* var[14] */
++    0x00000000, /* var[15] */
++    0x00000000, /* var[16] */
++    0x00000000, /* var[17] */
++    0x00000000, /* var[18] */
++    0x00000000, /* var[19] */
++    0x00000000, /* var[20] */
++    0x00000000, /* var[21] */
++    0x00000000, /* var[22] */
++    0x00000000, /* var[23] */
++    0xe0000000, /* inc[0] */
++    0x20000000, /* inc[1] */
++    0x2000ffff, /* inc[2] */
++    0x00000000, /* inc[3] */
++    0x00000000, /* inc[4] */
++    0x00000000, /* inc[5] */
++    0x00000000, /* inc[6] */
++    0x00000000, /* inc[7] */
++};
++
++u32 MCD_funcDescTab0[]=
++{   /* Task 0 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++#ifdef MCD_INCLUDE_EU
++u32 MCD_funcDescTab1[]=
++{   /* Task 1 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab2[]=
++{   /* Task 2 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab3[]=
++{   /* Task 3 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab4[]=
++{   /* Task 4 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab5[]=
++{   /* Task 5 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab6[]=
++{   /* Task 6 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab7[]=
++{   /* Task 7 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab8[]=
++{   /* Task 8 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab9[]=
++{   /* Task 9 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab10[]=
++{   /* Task 10 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab11[]=
++{   /* Task 11 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab12[]=
++{   /* Task 12 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab13[]=
++{   /* Task 13 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab14[]=
++{   /* Task 14 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++
++u32 MCD_funcDescTab15[]=
++{   /* Task 15 Function Descriptor Table */
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0xa0045670, /* mainFunc(), EU# 3 */
++    0xa0000000, /* rsduFunc(), EU# 3 */
++    0xa0000000, /* crcAccumVal(), EU# 3 */
++    0x20000000, /* setCrcAccum(), EU# 3 */
++    0x21800000, /* and(), EU# 3 */
++    0x21e00000, /* or(), EU# 3 */
++    0x20400000, /* add(), EU# 3 */
++    0x20500000, /* sub(), EU# 3 */
++    0x205a0000, /* andNot(), EU# 3 */
++    0x202fa000, /* andReadyBit(), EU# 3 */
++    0x202f9000, /* andNotReadyBit(), EU# 3 */
++    0x202ea000, /* andWrapBit(), EU# 3 */
++    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202e2000, /* andInterruptBit(), EU# 3 */
++    0x202f2000, /* andLoopBit(), EU# 3 */
++    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++};
++#endif /*MCD_INCLUDE_EU*/
++
++u32 MCD_contextSave0[128];  /* Task 0 context save space */
++u32 MCD_contextSave1[128];  /* Task 1 context save space */
++u32 MCD_contextSave2[128];  /* Task 2 context save space */
++u32 MCD_contextSave3[128];  /* Task 3 context save space */
++u32 MCD_contextSave4[128];  /* Task 4 context save space */
++u32 MCD_contextSave5[128];  /* Task 5 context save space */
++u32 MCD_contextSave6[128];  /* Task 6 context save space */
++u32 MCD_contextSave7[128];  /* Task 7 context save space */
++u32 MCD_contextSave8[128];  /* Task 8 context save space */
++u32 MCD_contextSave9[128];  /* Task 9 context save space */
++u32 MCD_contextSave10[128]; /* Task 10 context save space */
++u32 MCD_contextSave11[128]; /* Task 11 context save space */
++u32 MCD_contextSave12[128]; /* Task 12 context save space */
++u32 MCD_contextSave13[128]; /* Task 13 context save space */
++u32 MCD_contextSave14[128]; /* Task 14 context save space */
++u32 MCD_contextSave15[128]; /* Task 15 context save space */
++
++/* Task Descriptor Tables - the guts */
++u32 MCD_ChainNoEu_TDT[];
++u32 MCD_SingleNoEu_TDT[];
++#ifdef MCD_INCLUDE_EU
++u32 MCD_ChainEu_TDT[];
++u32 MCD_SingleEu_TDT[];
++#endif
++u32 MCD_ENetRcv_TDT[];
++u32 MCD_ENetXmit_TDT[];
++
++u32 MCD_modelTaskTableSrc[]=
++{
++    (u32)MCD_ChainNoEu_TDT,
++    (u32)&((u8*)MCD_ChainNoEu_TDT)[0x00000178],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_SingleNoEu_TDT,
++    (u32)&((u8*)MCD_SingleNoEu_TDT)[0x000000d4],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++#ifdef MCD_INCLUDE_EU
++    (u32)MCD_ChainEu_TDT,
++    (u32)&((u8*)MCD_ChainEu_TDT)[0x00000180],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_SingleEu_TDT,
++    (u32)&((u8*)MCD_SingleEu_TDT)[0x000000dc],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++#endif
++    (u32)MCD_ENetRcv_TDT,
++    (u32)&((u8*)MCD_ENetRcv_TDT)[0x0000009C],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    (u32)MCD_ENetXmit_TDT,
++    (u32)&((u8*)MCD_ENetXmit_TDT)[0x000000d0],
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++    0x00000000,
++};
++
++u32 MCD_ChainNoEu_TDT[]=
++{
++    0x80004000, /* 0000(:370):  LCDEXT: idx0 = 0x00000000; ; */
++    0x8118801b, /* 0004(:370):  LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0xb8ca0018, /* 0008(:371):    LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
++    0x10004b10, /* 000C(:372):      DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000c, /* 0010(:373):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x024cf89f, /* 0014(:373):      DRD2B1: var9 = EU3(); EU3(idx2)  */
++    0x60000009, /* 0018(:374):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf89f, /* 001C(:374):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 0020(:0):    NOP */
++    0x98180524, /* 0024(:378):  LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
++    0x8118801b, /* 0028(:380):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0xf8ca001a, /* 002C(:381):      LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
++    0xb8ca601b, /* 0030(:382):      LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
++    0x10004310, /* 0034(:384):        DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x00001718, /* 0038(:385):        DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
++    0xb8ca001d, /* 003C(:387):      LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
++    0x10001f10, /* 0040(:388):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000007, /* 0044(:389):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
++    0x020cf893, /* 0048(:389):        DRD2B1: var8 = EU3(); EU3(idx2,var19)  */
++    0x98ca001c, /* 004C(:391):      LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
++    0x00000710, /* 0050(:392):        DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
++    0x98ca8018, /* 0054(:393):      LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
++    0x10002b10, /* 0058(:394):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c828, /* 005C(:395):        DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0060(:0):      NOP */
++    0xc14ae018, /* 0064(:399):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
++    0xc004a51d, /* 0068(:399):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
++    0x811a601b, /* 006C(:400):    LCD: idx4 = var2; ; idx4 += inc3 */
++    0xc28a21c2, /* 0070(:403):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
++    0x881be009, /* 0074(:403):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0x03fed7b8, /* 0078(:406):        DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
++    0xda9b001b, /* 007C(:408):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0080(:408):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x1000cb20, /* 0084(:409):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0088(:410):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 008C(:410):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb28, /* 0090(:411):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0094(:412):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 0098(:412):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb30, /* 009C(:413):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00A0(:414):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00A4(:414):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb38, /* 00A8(:415):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 00AC(:416):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00B0(:0):      NOP */
++    0xc14ae018, /* 00B4(:420):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
++    0xc004a5dd, /* 00B8(:420):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
++    0x811a601b, /* 00BC(:421):    LCD: idx4 = var2; ; idx4 += inc3 */
++    0xda9b001b, /* 00C0(:424):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00C4(:424):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 00C8(:425):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc28a21c2, /* 00CC(:427):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
++    0x881be009, /* 00D0(:427):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0x0bfed7b8, /* 00D4(:430):        DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
++    0xda9b001b, /* 00D8(:432):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00DC(:432):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x1000cb20, /* 00E0(:433):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00E4(:434):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00E8(:434):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb28, /* 00EC(:435):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00F0(:436):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00F4(:436):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb30, /* 00F8(:437):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00FC(:438):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 0100(:438):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb38, /* 0104(:439):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 0108(:440):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 010C(:0):      NOP */
++    0x8118801b, /* 0110(:444):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0x8a19001b, /* 0114(:446):      LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
++    0x6000000e, /* 0118(:447):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x088cf49f, /* 011C(:447):        DRD2B1: idx2 = EU3(); EU3(var18)  */
++    0xd9190536, /* 0120(:448):      LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
++    0x98ca0018, /* 0124(:448):      LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
++    0x6000000a, /* 0128(:450):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x0cccfcdf, /* 012C(:450):        DRD2B1: *idx3 = EU3(); EU3(*idx3)  */
++    0x000001f8, /* 0130(:0):      NOP */
++    0xa14a001e, /* 0134(:453):    LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
++    0x10000b08, /* 0138(:454):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x10002c90, /* 013C(:455):      DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
++    0xb8ca0018, /* 0140(:456):      LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
++    0x10004b10, /* 0144(:457):        DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000009, /* 0148(:458):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf89f, /* 014C(:458):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x6000000c, /* 0150(:459):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
++    0x024cf89f, /* 0154(:459):        DRD2B1: var9 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 0158(:0):      NOP */
++    0x8a18801b, /* 015C(:465):    LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
++    0x7000000d, /* 0160(:466):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x084cf2df, /* 0164(:466):      DRD2B1: idx1 = EU3(); EU3(var11)  */
++    0xd899053f, /* 0168(:467):      LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
++    0x8019801b, /* 016C(:467):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x040001f8, /* 0170(:468):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 0174(:0):      NOP */
++    0x000001f8, /* 0178(:0):    NOP */
++};
++u32 MCD_SingleNoEu_TDT[]=
++{
++    0x8318001b, /* 0000(:646):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
++    0x7000000c, /* 0004(:647):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf81f, /* 0008(:647):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
++    0x8318801b, /* 000C(:648):    LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
++    0x6000000d, /* 0010(:649):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x084cf85f, /* 0014(:649):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
++    0x000001f8, /* 0018(:0):    NOP */
++    0x8498001b, /* 001C(:653):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
++    0x7000000c, /* 0020(:654):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x020cf81f, /* 0024(:654):    DRD2B1: var8 = EU3(); EU3(idx0)  */
++    0x6000000d, /* 0028(:655):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x028cf81f, /* 002C(:655):    DRD2B1: var10 = EU3(); EU3(idx0)  */
++    0xc404601b, /* 0030(:658):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
++    0xc00423dc, /* 0034(:658):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0038(:659):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xc207a182, /* 003C(:662):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
++    0x869be009, /* 0040(:662):    LCD: idx7 = var13; ; idx7 += inc1 */
++    0x03fed7b8, /* 0044(:665):      DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
++    0xda9b001b, /* 0048(:667):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 004C(:667):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 0050(:669):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 0054(:669):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb28, /* 0058(:670):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 005C(:671):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 0060(:671):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb30, /* 0064(:672):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0068(:673):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 006C(:673):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x0000cb38, /* 0070(:674):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0074(:0):    NOP */
++    0xc404601b, /* 0078(:678):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
++    0xc004245c, /* 007C(:678):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0080(:679):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xda9b001b, /* 0084(:682):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0088(:682):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 008C(:683):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc207a182, /* 0090(:685):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
++    0x869be009, /* 0094(:685):    LCD: idx7 = var13; ; idx7 += inc1 */
++    0x0bfed7b8, /* 0098(:688):      DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
++    0xda9b001b, /* 009C(:690):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00A0(:690):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 00A4(:692):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00A8(:692):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb28, /* 00AC(:693):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00B0(:694):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00B4(:694):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb30, /* 00B8(:695):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00BC(:696):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00C0(:696):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x0000cb38, /* 00C4(:697):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00C8(:0):    NOP */
++    0xc51803ed, /* 00CC(:701):  LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
++    0x8018801b, /* 00D0(:701):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
++    0x040001f8, /* 00D4(:702):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++};
++#ifdef MCD_INCLUDE_EU
++u32 MCD_ChainEu_TDT[]=
++{
++    0x80004000, /* 0000(:928):  LCDEXT: idx0 = 0x00000000; ; */
++    0x8118801b, /* 0004(:928):  LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0xb8ca0018, /* 0008(:929):    LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
++    0x10004b10, /* 000C(:930):      DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000c, /* 0010(:931):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x024cf89f, /* 0014(:931):      DRD2B1: var9 = EU3(); EU3(idx2)  */
++    0x60000009, /* 0018(:932):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf89f, /* 001C(:932):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 0020(:0):    NOP */
++    0x98180524, /* 0024(:936):  LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
++    0x8118801b, /* 0028(:938):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0xf8ca001a, /* 002C(:939):      LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
++    0xb8ca601b, /* 0030(:940):      LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
++    0x10004310, /* 0034(:942):        DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x00001718, /* 0038(:943):        DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
++    0xb8ca001d, /* 003C(:945):      LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
++    0x10001f10, /* 0040(:946):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000007, /* 0044(:947):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
++    0x020cf893, /* 0048(:947):        DRD2B1: var8 = EU3(); EU3(idx2,var19)  */
++    0x98ca001c, /* 004C(:949):      LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
++    0x00000710, /* 0050(:950):        DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
++    0x98ca8018, /* 0054(:951):      LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
++    0x10002b10, /* 0058(:952):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c828, /* 005C(:953):        DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0060(:0):      NOP */
++    0xc14ae018, /* 0064(:957):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
++    0xc004a51d, /* 0068(:957):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
++    0x811a601b, /* 006C(:958):    LCD: idx4 = var2; ; idx4 += inc3 */
++    0xc28a21c2, /* 0070(:961):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
++    0x881be009, /* 0074(:961):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0x63fe0000, /* 0078(:964):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 007C(:964):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 0080(:966):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0084(:966):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x1000cb20, /* 0088(:967):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 008C(:968):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 0090(:968):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb28, /* 0094(:969):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0098(:970):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 009C(:970):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb30, /* 00A0(:971):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00A4(:972):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00A8(:972):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb38, /* 00AC(:973):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 00B0(:974):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00B4(:0):      NOP */
++    0xc14ae018, /* 00B8(:978):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
++    0xc004a5dd, /* 00BC(:978):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
++    0x811a601b, /* 00C0(:979):    LCD: idx4 = var2; ; idx4 += inc3 */
++    0xda9b001b, /* 00C4(:982):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00C8(:982):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 00CC(:983):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc28a21c2, /* 00D0(:985):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
++    0x881be009, /* 00D4(:985):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0x6bfe0000, /* 00D8(:988):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 00DC(:988):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 00E0(:990):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00E4(:990):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x1000cb20, /* 00E8(:991):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00EC(:992):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00F0(:992):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb28, /* 00F4(:993):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00F8(:994):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 00FC(:994):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb30, /* 0100(:995):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0104(:996):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf896, /* 0108(:996):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x1000cb38, /* 010C(:997):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 0110(:998):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0114(:0):      NOP */
++    0x8118801b, /* 0118(:1002):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
++    0x8a19001b, /* 011C(:1004):      LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
++    0x6000000e, /* 0120(:1005):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x088cf49f, /* 0124(:1005):        DRD2B1: idx2 = EU3(); EU3(var18)  */
++    0xd9190536, /* 0128(:1006):      LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
++    0x98ca0018, /* 012C(:1006):      LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
++    0x6000000a, /* 0130(:1008):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x0cccfcdf, /* 0134(:1008):        DRD2B1: *idx3 = EU3(); EU3(*idx3)  */
++    0x000001f8, /* 0138(:0):      NOP */
++    0xa14a001e, /* 013C(:1011):    LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
++    0x10000b08, /* 0140(:1012):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x10002c90, /* 0144(:1013):      DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
++    0xb8ca0018, /* 0148(:1014):      LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
++    0x10004b10, /* 014C(:1015):        DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000009, /* 0150(:1016):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf89f, /* 0154(:1016):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x6000000c, /* 0158(:1017):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
++    0x024cf89f, /* 015C(:1017):        DRD2B1: var9 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 0160(:0):      NOP */
++    0x8a18801b, /* 0164(:1023):    LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
++    0x7000000d, /* 0168(:1024):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x084cf2df, /* 016C(:1024):      DRD2B1: idx1 = EU3(); EU3(var11)  */
++    0xd899053f, /* 0170(:1025):      LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
++    0x8019801b, /* 0174(:1025):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x040001f8, /* 0178(:1026):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 017C(:0):      NOP */
++    0x000001f8, /* 0180(:0):    NOP */
++};
++u32 MCD_SingleEu_TDT[]=
++{
++    0x8318001b, /* 0000(:1204):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
++    0x7000000c, /* 0004(:1205):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf81f, /* 0008(:1205):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
++    0x8318801b, /* 000C(:1206):    LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
++    0x6000000d, /* 0010(:1207):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x084cf85f, /* 0014(:1207):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
++    0x000001f8, /* 0018(:0):    NOP */
++    0x8498001b, /* 001C(:1211):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
++    0x7000000c, /* 0020(:1212):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x020cf81f, /* 0024(:1212):    DRD2B1: var8 = EU3(); EU3(idx0)  */
++    0x6000000d, /* 0028(:1213):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x028cf81f, /* 002C(:1213):    DRD2B1: var10 = EU3(); EU3(idx0)  */
++    0xc404601b, /* 0030(:1216):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
++    0xc00423dc, /* 0034(:1216):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0038(:1217):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xc207a182, /* 003C(:1220):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
++    0x869be009, /* 0040(:1220):    LCD: idx7 = var13; ; idx7 += inc1 */
++    0x63fe0000, /* 0044(:1223):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 0048(:1223):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 004C(:1225):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0050(:1225):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 0054(:1227):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 0058(:1227):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb28, /* 005C(:1228):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0060(:1229):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 0064(:1229):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb30, /* 0068(:1230):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 006C(:1231):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 0070(:1231):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x0000cb38, /* 0074(:1232):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0078(:0):    NOP */
++    0xc404601b, /* 007C(:1236):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
++    0xc004245c, /* 0080(:1236):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0084(:1237):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xda9b001b, /* 0088(:1240):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 008C(:1240):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 0090(:1241):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc207a182, /* 0094(:1243):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
++    0x869be009, /* 0098(:1243):    LCD: idx7 = var13; ; idx7 += inc1 */
++    0x6bfe0000, /* 009C(:1246):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 00A0(:1246):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 00A4(:1248):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00A8(:1248):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 00AC(:1250):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00B0(:1250):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb28, /* 00B4(:1251):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00B8(:1252):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00BC(:1252):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x1000cb30, /* 00C0(:1253):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00C4(:1254):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf890, /* 00C8(:1254):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
++    0x0000cb38, /* 00CC(:1255):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00D0(:0):    NOP */
++    0xc51803ed, /* 00D4(:1259):  LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
++    0x8018801b, /* 00D8(:1259):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
++    0x040001f8, /* 00DC(:1260):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++};
++#endif
++u32 MCD_ENetRcv_TDT[]=
++{
++    0x80004000, /* 0000(:1334):  LCDEXT: idx0 = 0x00000000; ; */
++    0x82188000, /* 0004(:1334):  LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 0008(:1335):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000009, /* 000C(:1336):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 0010(:1336):    DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0x98180249, /* 0014(:1339):  LCD: idx0 = idx0; idx0 != var9; idx0 += inc1 */
++    0x82448004, /* 0018(:1341):    LCD: idx1 = var4 + var9 + 4; idx1 once var0; idx1 += inc0 */
++    0x7000000d, /* 001C(:1342):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x014cf05f, /* 0020(:1342):      DRD2B1: var5 = EU3(); EU3(var1)  */
++    0x7000000b, /* 0024(:1343):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
++    0x020cf05f, /* 0028(:1343):      DRD2B1: var8 = EU3(); EU3(var1)  */
++    0x70000004, /* 002C(:1344):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x018cf04a, /* 0030(:1344):      DRD2B1: var6 = EU3(); EU3(var1,var10)  */
++    0x70000004, /* 0034(:1345):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf04b, /* 0038(:1345):      DRD2B1: var1 = EU3(); EU3(var1,var11)  */
++    0x00000b88, /* 003C(:1348):      DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */
++    0xc4838190, /* 0040(:1351):    LCDEXT: idx1 = var9, idx2 = var7; idx1 < var6; idx1 += inc2, idx2 += inc0 */
++    0x8119e012, /* 0044(:1351):    LCD: idx3 = var2; ; idx3 += inc2 */
++    0x03e0cf90, /* 0048(:1354):      DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */
++    0x81188000, /* 004C(:1357):    LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */
++    0x000ac788, /* 0050(:1358):      DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */
++    0xc4838000, /* 0054(:1360):    LCDEXT: idx1 = var9, idx2 = var7; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x8219e000, /* 0058(:1360):    LCD: idx3 = var4; ; idx3 += inc0 */
++    0x70000004, /* 005C(:1368):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x084cfc8c, /* 0060(:1368):      DRD2B1: idx1 = EU3(); EU3(*idx2,var12)  */
++    0x60000005, /* 0064(:1371):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
++    0x0cccf841, /* 0068(:1371):      DRD2B1: *idx3 = EU3(); EU3(idx1,var1)  */
++    0x82468000, /* 006C(:1377):    LCD: idx1 = var4 + var13; idx1 once var0; idx1 += inc0 */
++    0xc419025b, /* 0070(:1379):      LCDEXT: idx2 = var8; idx2 > var9; idx2 += inc3 */
++    0x80198000, /* 0074(:1379):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
++    0x00008400, /* 0078(:1380):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
++    0x00001308, /* 007C(:1381):      DRD1A: var4 = idx1; FN=0 init=0 WS=0 RS=0 */
++    0x82188000, /* 0080(:1384):    LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 0084(:1385):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000009, /* 0088(:1386):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 008C(:1386):      DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0xc2988249, /* 0090(:1389):    LCDEXT: idx1 = var5; idx1 != var9; idx1 += inc1 */
++    0x80190000, /* 0094(:1389):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
++    0x040001f8, /* 0098(:1390):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 009C(:0):    NOP */
++};
++u32 MCD_ENetXmit_TDT[]=
++{
++    0x80004000, /* 0000(:1465):  LCDEXT: idx0 = 0x00000000; ; */
++    0x81988000, /* 0004(:1465):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 0008(:1466):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000009, /* 000C(:1467):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 0010(:1467):    DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0x98180309, /* 0014(:1470):  LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */
++    0x80004003, /* 0018(:1472):    LCDEXT: idx1 = 0x00000003; ; */
++    0x81c60004, /* 001C(:1472):    LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */
++    0x7000000d, /* 0020(:1473):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x014cf05f, /* 0024(:1473):      DRD2B1: var5 = EU3(); EU3(var1)  */
++    0x7000000b, /* 0028(:1474):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
++    0x028cf05f, /* 002C(:1474):      DRD2B1: var10 = EU3(); EU3(var1)  */
++    0x7000000c, /* 0030(:1475):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x018cf05f, /* 0034(:1475):      DRD2B1: var6 = EU3(); EU3(var1)  */
++    0x70000004, /* 0038(:1476):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x01ccf04d, /* 003C(:1476):      DRD2B1: var7 = EU3(); EU3(var1,var13)  */
++    0x10000b90, /* 0040(:1477):      DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000004, /* 0044(:1478):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */
++    0x020cf0a1, /* 0048(:1478):      DRD2B1: var8 = EU3(); EU3(var2,idx1)  */
++    0xc3188312, /* 004C(:1481):    LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */
++    0x83c70000, /* 0050(:1481):    LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */
++    0x00001f10, /* 0054(:1482):      DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */
++    0xc583a3c3, /* 0058(:1484):    LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */
++    0x81042325, /* 005C(:1484):    LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */
++    0x03e0c798, /* 0060(:1489):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */
++    0xd8990000, /* 0064(:1492):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x9999e000, /* 0068(:1492):    LCD: idx3 = idx3; ; idx3 += inc0 */
++    0x000acf98, /* 006C(:1493):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
++    0xd8992306, /* 0070(:1495):    LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */
++    0x9999e03f, /* 0074(:1495):    LCD: idx3 = idx3; ; idx3 += inc7 */
++    0x03eac798, /* 0078(:1498):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */
++    0xd8990000, /* 007C(:1501):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x9999e000, /* 0080(:1501):    LCD: idx3 = idx3; ; idx3 += inc0 */
++    0x000acf98, /* 0084(:1502):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
++    0xd8990000, /* 0088(:1504):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x99832302, /* 008C(:1504):    LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */
++    0x0beac798, /* 0090(:1507):      DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */
++    0x81988000, /* 0094(:1509):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x6000000a, /* 0098(:1510):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x0c4cfc5f, /* 009C(:1510):      DRD2B1: *idx1 = EU3(); EU3(*idx1)  */
++    0x81c80000, /* 00A0(:1512):    LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */
++    0xc5190312, /* 00A4(:1514):      LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */
++    0x80198000, /* 00A8(:1514):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
++    0x00008400, /* 00AC(:1515):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
++    0x00000f08, /* 00B0(:1516):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
++    0x81988000, /* 00B4(:1519):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 00B8(:1520):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000009, /* 00BC(:1521):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 00C0(:1521):      DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0xc2988309, /* 00C4(:1524):    LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */
++    0x80190000, /* 00C8(:1524):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
++    0x040001f8, /* 00CC(:1525):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 00D0(:0):    NOP */
++};
++
+--- /dev/null
++++ b/drivers/dma/MCD_tasksInit.c
+@@ -0,0 +1,284 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *    MOTOROLA, INC. All Rights Reserved.  
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This 
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA 
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING 
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE 
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY 
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ * 
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING 
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS 
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.   
++ * 
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++/*
++ * Do not edit!
++ */
++ /*
++ * File:              MCD_tasksInit.c
++ * Purpose:           Function for initialize variable tables of different
++ *              types of tasks.
++ *
++ * Notes:
++ *
++ *
++ * Modifications:
++ *    
++ *
++ */ 
++
++#include <asm/MCD_dma.h>
++
++extern dmaRegs *MCD_dmaBar;
++
++/*
++ * Task 0
++ */
++
++void  MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++{
++
++      MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize);      /* var[19] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
++      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
++      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000);    /* var[16] */
++      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000);    /* var[17] */
++      MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000);    /* var[18] */
++      MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000);    /* var[20] */
++      MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010);    /* var[21] */
++      MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004);    /* var[22] */
++      MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080);    /* var[23] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++      MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000);    /* inc[4] */
++      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
++      MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000);    /* inc[6] */
++      MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
++
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++      
++
++}
++
++
++/*
++ * Task 1
++ */
++ 
++void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++{
++      
++      MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr);       /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr);       /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize);        /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize);       /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)flags);  /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
++      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
++      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004);    /* var[16] */
++      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080);    /* var[17] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++      MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
++      MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
++
++
++    /* enable the task */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++}
++
++
++/*
++ * Task 2
++ */
++ 
++void  MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++{
++      
++      MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize);      /* var[19] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
++      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
++      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000);    /* var[16] */
++      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000);    /* var[17] */
++      MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000);    /* var[18] */
++      MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000);    /* var[20] */
++      MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010);    /* var[21] */
++      MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004);    /* var[22] */
++      MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080);    /* var[23] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++      MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000);    /* inc[4] */
++      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
++      MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000);    /* inc[6] */
++      MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
++
++    /*enable the task*/
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++}
++
++
++/*
++ * Task 3
++ */
++ 
++void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++{
++      
++      MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr);       /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr);       /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize);        /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize);       /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)flags);  /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
++      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
++      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004);    /* var[16] */
++      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080);    /* var[17] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++      MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
++      MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
++
++    /*enable the task*/
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++
++}
++
++
++/*
++ * Task 4
++ */
++ 
++void  MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel)
++{
++      
++      MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)currBD); /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)rcvFifoPtr);     /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x0000ffff);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)0x30000000);    /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x0fffffff);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000008);    /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004);    /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000);    /* inc[3] */
++    /*enable the task*/
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++
++}
++
++
++/*
++ * Task 5
++ */
++ 
++void  MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel)
++{
++      
++      MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
++      MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
++      MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr);   /* var[11] */
++      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
++      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
++      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
++      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
++      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
++      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
++      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
++      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
++      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++      MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff);    /* var[13] */
++      MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff);    /* var[14] */
++      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
++      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008);    /* var[16] */
++      MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
++      MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
++      MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000);    /* inc[2] */
++      MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc);    /* inc[3] */
++      MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004);    /* inc[4] */
++      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
++      MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff);    /* inc[6] */
++      MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001);    /* inc[7] */
++
++    /*enable the task*/
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++
++}
+--- /dev/null
++++ b/drivers/dma/MCD_tasksInit.h
+@@ -0,0 +1,73 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++#ifndef MCD_TSK_INIT_H
++#define MCD_TSK_INIT_H 1
++
++/*
++ * Do not edit!
++ */
++
++
++
++/*
++ * Task 0
++ */
++void  MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++
++
++/*
++ * Task 1
++ */
++void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++
++
++/*
++ * Task 2
++ */
++void  MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++
++
++/*
++ * Task 3
++ */
++void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++
++
++/*
++ * Task 4
++ */
++void  MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel);
++
++
++/*
++ * Task 5
++ */
++void  MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel);
++
++#endif  /* MCD_TSK_INIT_H */
+--- a/drivers/dma/Makefile
++++ b/drivers/dma/Makefile
+@@ -4,3 +4,5 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
+ ioatdma-objs := ioat.o ioat_dma.o ioat_dca.o
+ obj-$(CONFIG_INTEL_IOP_ADMA) += iop-adma.o
+ obj-$(CONFIG_FSL_DMA) += fsldma.o
++obj-$(CONFIG_MCD_DMA) += mcddma.o
++mcddma-objs := MCD_dmaApi.o MCD_tasks.o MCD_tasksInit.o
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -351,6 +351,8 @@ config MACB
+ source "drivers/net/arm/Kconfig"
++source "drivers/net/fec/Kconfig"
++
+ config AX88796
+       tristate "ASIX AX88796 NE2000 clone support"
+       depends on ARM || MIPS || SUPERH
+--- a/drivers/net/Makefile
++++ b/drivers/net/Makefile
+@@ -226,6 +226,8 @@ obj-$(CONFIG_ENC28J60) += enc28j60.o
+ obj-$(CONFIG_MACB) += macb.o
++obj-$(CONFIG_FEC_548x) += fec/
++
+ obj-$(CONFIG_ARM) += arm/
+ obj-$(CONFIG_DEV_APPLETALK) += appletalk/
+ obj-$(CONFIG_TR) += tokenring/
+--- /dev/null
++++ b/drivers/net/fec/Kconfig
+@@ -0,0 +1,25 @@
++config FEC_548x
++      tristate "MCF547x/MCF548x Fast Ethernet Controller support"
++      depends on M547X_8X
++      help
++        The MCF547x and MCF548x have a built-in Fast Ethernet Controller.
++        Saying Y here will include support for this device in the kernel.
++
++        To compile this driver as a module, choose M here: the module
++        will be called fecm.
++
++config FEC_548x_AUTO_NEGOTIATION
++      bool "Enable Auto-Negotiation"
++      depends on FEC_548x
++      help
++        This option enables the FEC to automatically detect the 
++        half/full duplex mode and the network speed at initialization
++        If you want this, say Y.
++
++config FEC_548x_ENABLE_FEC2
++      bool "Enable the second FEC"
++      depends on FEC_548x
++      help
++        This enables the second FEC on the 547x/548x. If you want to use
++        it, say Y.
++
+--- /dev/null
++++ b/drivers/net/fec/Makefile
+@@ -0,0 +1,7 @@
++#
++# Makefile for the FEC ethernet driver
++#
++
++obj-$(CONFIG_FEC_548x) += fecm.o
++
++fecm-objs := fec.o ks8721.o
+--- /dev/null
++++ b/drivers/net/fec/fec.c
+@@ -0,0 +1,1375 @@
++/*
++ * Performance and stability improvements: (C) Copyright 2008,
++ *      Daniel Krueger, SYSTEC electronic GmbH
++ *
++ * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming
++ * soon -- Kurt Mahan
++ *
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/ptrace.h>
++#include <linux/errno.h>
++#include <linux/ioport.h>
++#include <linux/slab.h>
++#include <linux/interrupt.h>
++#include <linux/pci.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/skbuff.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++#include <linux/bitops.h>
++
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++
++#include <asm/dma.h>
++#include <asm/MCD_dma.h>
++#include <asm/m5485sram.h>
++#include <asm/virtconvert.h>
++#include <asm/irq.h>
++
++#include "fec.h"
++#include "ks8721.h"
++
++#ifdef        CONFIG_FEC_548x_ENABLE_FEC2
++#define       FEC_MAX_PORTS   2
++#define       FEC_2
++#else
++#define       FEC_MAX_PORTS   1
++#undef        FEC_2
++#endif
++
++#define VERSION "0.13"
++MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION);
++
++// Private structure
++struct fec_priv {
++      struct net_device *netdev;              /* owning net device */
++      void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; //Array of transmission buffers
++      MCD_bufDescFec *fecpriv_txdesc; // Array of transmission descriptors
++      volatile unsigned int fecpriv_current_tx;       // Inex of the transmission descriptor that is used by DMA
++      volatile unsigned int fecpriv_next_tx;  // Inex of the transmission descriptor that can be used for new data
++      unsigned int fecpriv_current_rx;        // Index of the reception descriptor that is used by DMA
++      MCD_bufDescFec *fecpriv_rxdesc;         // Array of reception descriptors
++//    unsigned char *fecpriv_rxbuf;           // Address of reception buffers
++      struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; // Array of reception skb structure pointers
++      unsigned int fecpriv_initiator_rx;      // Reception DMA initiator
++      unsigned int fecpriv_initiator_tx;      // Transmission DMA initiator
++      int fecpriv_fec_rx_channel;     // DMA reception channel
++      int fecpriv_fec_tx_channel;     // DMA transmission channel
++      int fecpriv_rx_requestor;       // DMA reception requestor
++      int fecpriv_tx_requestor;       // DMA transmission requestor
++      void *fecpriv_interrupt_fec_rx_handler; // DMA reception handler
++      void *fecpriv_interrupt_fec_tx_handler; // DMA transmission handler
++      unsigned char *fecpriv_mac_addr;        // Private copy of FEC address
++      struct net_device_stats fecpriv_stat;   // Pointer to the statistical information
++      spinlock_t fecpriv_lock;
++      int fecpriv_rxflag;
++      struct tasklet_struct fecpriv_tasklet_reinit;
++      int index;
++};
++
++struct net_device *fec_dev[FEC_MAX_PORTS];
++
++// FEC functions
++int __init fec_init(void);
++struct net_device_stats *fec_get_stat(struct net_device *dev);
++
++int fec_open(struct net_device *dev);
++int fec_close(struct net_device *nd);
++int fec_tx(struct sk_buff *skb, struct net_device *dev);
++void fec_set_multicast_list(struct net_device *nd);
++int fec_set_mac_address(struct net_device *dev, void *p);
++void fec_tx_timeout(struct net_device *dev);
++void fec_interrupt_fec_tx_handler(struct net_device *dev);
++void fec_interrupt_fec_rx_handler(struct net_device *dev);
++irqreturn_t fec_interrupt_handler(int irq, void *dev_id);
++void fec_interrupt_fec_tx_handler_fec0(void);
++void fec_interrupt_fec_rx_handler_fec0(void);
++void fec_interrupt_fec_reinit(unsigned long data);
++
++unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 };  // Default address of FEC0
++
++#ifdef   FEC_2
++unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 };  // Default address of FEC1
++#endif
++
++#ifndef MODULE
++int fec_str_to_mac( char *str_mac, unsigned char* addr);
++int __init fec_mac_setup0 (char *s);
++#endif
++
++
++#ifdef   FEC_2
++void fec_interrupt_fec_tx_handler_fec1(void);
++void fec_interrupt_fec_rx_handler_fec1(void);
++
++#ifndef MODULE
++int __init fec_mac_setup1 (char *s);
++#endif
++
++#endif
++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data);
++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data);
++
++module_init(fec_init);
++/* module_exit(fec_cleanup); */
++__setup("mac0=", fec_mac_setup0);
++
++#ifdef   FEC_2
++__setup("mac1=", fec_mac_setup1);
++#endif
++
++/*
++ * Initialize a FEC device
++ */
++int fec_enet_init(struct net_device *dev)
++{
++      static int index = 0;
++      struct fec_priv *fp = netdev_priv(dev);
++      int i;
++
++      fp->index = index;
++      fp->netdev = dev;
++      fec_dev[ index ] = dev;
++printk(KERN_INFO "FEI: index=%d\n", index);
++
++      if (index == 0) {
++              /* disable fec0 */
++              FEC_ECR(FEC_BASE_ADDR_FEC0) = FEC_ECR_DISABLE;
++
++              /* setup the interrupt handler */
++              dev->irq = 64 + ISC_FEC0;
++
++              if (request_irq(dev->irq, fec_interrupt_handler,
++                              IRQF_DISABLED, "ColdFire FEC 0", dev)) {
++                      dev->irq = 0;
++                      printk("Cannot allocate FEC0 IRQ\n");
++              } else {
++                      /* interrupt priority and level */
++                      MCF_ICR(ISC_FEC0) = ILP_FEC0;
++              }
++
++              /* fec base address */
++              dev->base_addr = FEC_BASE_ADDR_FEC0;
++
++              /* requestor numbers */
++              fp->fecpriv_rx_requestor = DMA_FEC0_RX;
++              fp->fecpriv_tx_requestor = DMA_FEC0_TX;
++
++              /* fec0 handlers */
++              fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec0;
++              fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec0;
++
++              /* tx descriptors */
++              fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC0;
++
++              /* rx descriptors */
++              fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0;
++
++printk(KERN_INFO "FEI: txdesc=0x%p  rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc);
++
++              /* mac addr */
++              fp->fecpriv_mac_addr = fec_mac_addr_fec0;
++      }
++      else {
++              /* disable fec1 */
++              FEC_ECR(FEC_BASE_ADDR_FEC1) = FEC_ECR_DISABLE;
++#ifdef FEC_2
++              /* setup the interrupt handler */
++              dev->irq = 64 + ISC_FEC1;
++
++              if (request_irq(dev->irq, fec_interrupt_handler,
++                              IRQF_DISABLED, "ColdFire FEC 1", dev)) {
++                      dev->irq = 0;
++                      printk("Cannot allocate FEC1 IRQ\n");
++              } else {
++                      /* interrupt priority and level */
++                      MCF_ICR(ISC_FEC1) = ILP_FEC1;
++              }
++
++              /* fec base address */
++              dev->base_addr = FEC_BASE_ADDR_FEC1;
++
++              /* requestor numbers */
++              fp->fecpriv_rx_requestor = DMA_FEC1_RX;
++              fp->fecpriv_tx_requestor = DMA_FEC1_TX;
++
++              /* fec1 handlers */
++              fp->fecpriv_interrupt_fec_rx_handler = fec_interrupt_fec_rx_handler_fec1;
++              fp->fecpriv_interrupt_fec_tx_handler = fec_interrupt_fec_tx_handler_fec1;
++
++              /* tx descriptors */
++              fp->fecpriv_txdesc = (void*)FEC_TX_DESC_FEC1;
++
++              /* rx descriptors */
++              fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1;
++
++              /* mac addr */
++              fp->fecpriv_mac_addr = fec_mac_addr_fec1;
++#endif
++      }
++
++printk(KERN_INFO "FEI: index=%d base_addr=0x%lx\n", index, dev->base_addr);
++
++      /* clear MIB */
++      memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN);
++
++      /* clear the statistics structure */
++      memset((void *) &(fp->fecpriv_stat), 0,
++             sizeof(struct net_device_stats));
++
++      /* grab the FEC initiators */
++      dma_set_initiator(fp->fecpriv_tx_requestor);
++      fp->fecpriv_initiator_tx = dma_get_initiator(fp->fecpriv_tx_requestor);
++      dma_set_initiator(fp->fecpriv_rx_requestor);
++      fp->fecpriv_initiator_rx = dma_get_initiator(fp->fecpriv_rx_requestor);
++
++      /* reset the DMA channels */
++      fp->fecpriv_fec_rx_channel = -1;
++      fp->fecpriv_fec_tx_channel = -1;
++
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
++              fp->askb_rx[i] = NULL;
++
++      /* initialize the pointers to the socket buffers */
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
++              fp->fecpriv_txbuf[i] = NULL;
++
++      ether_setup(dev);
++
++      dev->open = fec_open;
++      dev->stop = fec_close;
++      dev->hard_start_xmit = fec_tx;
++      dev->get_stats = fec_get_stat;
++      dev->set_multicast_list = fec_set_multicast_list;
++      dev->set_mac_address = fec_set_mac_address;
++      dev->tx_timeout = fec_tx_timeout;
++      dev->watchdog_timeo = FEC_TX_TIMEOUT * HZ;
++
++      memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
++
++      spin_lock_init(&fp->fecpriv_lock);
++
++      // Initialize FEC/I2C/IRQ Pin Assignment Register
++      FEC_GPIO_PAR_FECI2CIRQ &= 0xF;
++      FEC_GPIO_PAR_FECI2CIRQ |= FEC_FECI2CIRQ;
++
++      index++;
++      return 0;
++}
++
++/*
++ * Module Initialization
++ */
++int __init fec_init(void)
++{
++      struct net_device *dev;
++      int i;
++      int err;
++      DECLARE_MAC_BUF(mac);
++
++      printk(KERN_INFO "FEC ENET (DMA) Version .00\n");
++
++
++      for (i = 0; i < FEC_MAX_PORTS; i++) {
++              dev = alloc_etherdev(sizeof(struct fec_priv));
++              if (!dev)
++                      return -ENOMEM;
++              err = fec_enet_init(dev);
++              if (err) {
++                      free_netdev(dev);
++                      continue;
++              }
++              if (register_netdev(dev) != 0) {
++                      free_netdev(dev);
++                      return -EIO;
++              }
++
++              printk(KERN_INFO "%s: ethernet %s\n",
++                     dev->name, print_mac(mac, dev->dev_addr));
++      }
++      return 0;
++}
++
++/*
++ * Stop a device
++ */
++void fec_stop(struct net_device *dev)
++{
++      struct fec_priv *fp = netdev_priv(dev);
++
++      dma_remove_initiator(fp->fecpriv_initiator_tx);
++      dma_remove_initiator(fp->fecpriv_initiator_rx);
++
++      if (dev->irq)
++              free_irq(dev->irq, dev);
++}
++
++/************************************************************************
++* NAME: fec_open
++*
++* DESCRIPTION: This function performs the initialization of
++*                             of FEC and corresponding KS8721 transiver
++*
++* RETURNS: If no error occurs, this function returns zero.
++*************************************************************************/
++
++int fec_open(struct net_device *dev)
++{
++      struct fec_priv *fp = netdev_priv(dev);
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++      int fduplex;
++      int i;
++      int channel;
++      int error_code = -EBUSY;
++
++printk(KERN_INFO "FECOPEN: index=%d\n", fp->index);
++
++      //Receive the DMA channels
++      channel = dma_set_channel_fec(fp->fecpriv_rx_requestor);
++
++      if (channel == -1)
++      {
++              printk("Dma channel cannot be reserved\n");
++              goto ERRORS;
++      }
++
++      fp->fecpriv_fec_rx_channel = channel;
++
++      dma_connect(channel, (int) fp->fecpriv_interrupt_fec_rx_handler);
++
++      channel = dma_set_channel_fec(fp->fecpriv_tx_requestor);
++
++      if (channel == -1)
++      {
++              printk("Dma channel cannot be reserved\n");
++              goto ERRORS;
++      }
++printk(KERN_INFO "FECOPEN2\n");
++
++      fp->fecpriv_fec_tx_channel = channel;
++
++      dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler);
++
++      // init tasklet for controller reinitialization
++      tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev);
++printk(KERN_INFO "FECOPEN3\n");
++
++      // Reset FIFOs
++      FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL;
++      FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
++
++      // Reset and disable FEC
++      FEC_ECR(base_addr) = FEC_ECR_RESET;
++
++      // Wait
++      udelay(10);
++
++      // Clear all events
++      FEC_EIR(base_addr) = FEC_EIR_CLEAR;
++
++      // Reset FIFO status
++      FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK;
++      FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK;
++
++#if 0
++/* JKM -- move into HW init */
++      // Copy the default address to the device structure
++      memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
++#endif
++
++      // Set the default address
++      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
++      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
++
++      // Reset the group address descriptor
++      FEC_GALR(base_addr) = 0x00000000;
++      FEC_GAUR(base_addr) = 0x00000000;
++
++      // Reset the individual address descriptor
++      FEC_IALR(base_addr) = 0x00000000;
++      FEC_IAUR(base_addr) = 0x00000000;
++
++      // Set the receive control register
++      FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII;
++
++      // Set the receive FIFO control register
++//    FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK;
++      FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR
++                             | (FEC_FECRFCR_MSK     // disable all but ...
++                                & ~FEC_FECRFCR_FAE  // enable frame accept error
++                                & ~FEC_FECRFCR_RXW  // enable receive wait condition
++//                                & ~FEC_FECRFCR_UF   // enable FIFO underflow
++                             );
++
++      //Set the receive FIFO alarm register
++      FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM;
++
++      // Set the transmit FIFO control register
++//    FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK;
++      FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR
++                             | (FEC_FECTFCR_MSK     // disable all but ...
++                                & ~FEC_FECTFCR_FAE  // enable frame accept error
++//                                & ~FEC_FECTFCR_TXW  // enable transmit wait condition
++//                                & ~FEC_FECTFCR_UF   // enable FIFO underflow
++                                & ~FEC_FECTFCR_OF); // enable FIFO overflow
++
++      //Set the transmit FIFO alarm register
++      FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM;
++
++      // Set the Tx FIFO watermark
++      FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK;
++
++      // Enable the transmitter to append the CRC
++      FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC;
++
++      // Enable the ethernet interrupts
++//    FEC_EIMR(base_addr) = FEC_EIMR_MASK;
++      FEC_EIMR(base_addr) = FEC_EIMR_DISABLE
++                            | FEC_EIR_LC
++                            | FEC_EIR_RL
++                            | FEC_EIR_HBERR
++                            | FEC_EIR_XFUN
++                            | FEC_EIR_XFERR
++                            | FEC_EIR_RFERR
++                            ;
++printk(KERN_INFO "FECOPEN4\n");
++
++#ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
++      if ((error_code = init_transceiver(base_addr, &fduplex)) != 0)
++      {
++              printk("Initialization of the transceiver is failed\n");
++              goto ERRORS;
++      }
++#else
++      fduplex = 1;
++#endif
++printk(KERN_INFO "FECOPEN5\n");
++
++      if (fduplex)
++              // Enable the full duplex mode
++              FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC;
++      else
++              // Disable reception of frames while transmitting
++              FEC_RCR(base_addr) |= FEC_RCR_DRT;
++
++      // Enable MIB
++      FEC_MIBC(base_addr) = FEC_MIBC_ENABLE;
++
++      // Enable FEC
++      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
++
++      // Initialize transmission descriptors and start DMA for the transmission
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
++              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
++printk(KERN_INFO "FECOPEN6\n");
++
++      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
++
++      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
++
++      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
++                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
++                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
++                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
++                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
++
++      // Initialize reception descriptors and start DMA for the reception
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
++      {
++              fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA);
++              if (!fp->askb_rx[i])
++              {
++              fp->fecpriv_rxdesc[i].dataPointer = 0;
++              fp->fecpriv_rxdesc[i].statCtrl = 0;
++              fp->fecpriv_rxdesc[i].length = 0;
++              }
++              else
++              {
++                  skb_reserve(fp->askb_rx[i], 16);
++                      fp->askb_rx[i]->dev = dev;
++              fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
++              fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
++              fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
++          }
++      }
++printk(KERN_INFO "FECOPEN7\n");
++
++      fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
++      fp->fecpriv_current_rx = 0;
++
++      // flush entire data cache before restarting the DMA
++#if 0
++/* JKM -- currently running with cache turned off */
++      DcacheFlushInvalidate();
++#endif
++      
++      MCD_startDma(fp->fecpriv_fec_rx_channel, (char *) fp->fecpriv_rxdesc, 0,
++                   (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
++                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
++                   FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
++                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
++
++      netif_start_queue(dev);
++
++//    MOD_INC_USE_COUNT;
++printk(KERN_INFO "FECOPEN: finished\n");
++
++      return 0;
++
++ERRORS:
++
++      // Remove the channels and return with the error code
++      if (fp->fecpriv_fec_rx_channel != -1)
++      {
++              dma_disconnect(fp->fecpriv_fec_rx_channel);
++              dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
++              fp->fecpriv_fec_rx_channel = -1;
++      }
++
++      if (fp->fecpriv_fec_tx_channel != -1)
++      {
++              dma_disconnect(fp->fecpriv_fec_tx_channel);
++              dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
++              fp->fecpriv_fec_tx_channel = -1;
++      }
++
++      return error_code;
++
++}
++
++/************************************************************************
++* NAME: fec_close
++*
++* DESCRIPTION: This function performs the graceful stop of the
++*                             transmission and disables FEC
++*
++* RETURNS: This function always returns zero.
++*************************************************************************/
++int fec_close(struct net_device *dev)
++{
++      //Receive the pointer to the private structure
++      struct fec_priv *fp = netdev_priv(dev);
++
++      // Receive the base address
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++
++      unsigned long time;
++
++      int i;
++
++      netif_stop_queue(dev);
++
++      // Perform the graceful stop
++      FEC_TCR(base_addr) |= FEC_TCR_GTS;
++
++      time = jiffies;
++
++      // Wait for the graceful stop
++      while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ)
++              schedule();
++
++      // Disable FEC
++      FEC_ECR(base_addr) = FEC_ECR_DISABLE;
++
++      // Reset the DMA channels
++      spin_lock_irq(&fp->fecpriv_lock);
++      MCD_killDma(fp->fecpriv_fec_tx_channel);
++      spin_unlock_irq(&fp->fecpriv_lock);
++      dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
++      dma_disconnect(fp->fecpriv_fec_tx_channel);
++      fp->fecpriv_fec_tx_channel = -1;
++
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
++              if (fp->fecpriv_txbuf[i])
++              {
++                      kfree(fp->fecpriv_txbuf[i]);
++                      fp->fecpriv_txbuf[i] = NULL;
++              }
++
++      spin_lock_irq(&fp->fecpriv_lock);
++      MCD_killDma(fp->fecpriv_fec_rx_channel);
++      spin_unlock_irq(&fp->fecpriv_lock);
++
++      dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
++      dma_disconnect(fp->fecpriv_fec_rx_channel);
++      fp->fecpriv_fec_rx_channel = -1;
++
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
++      {
++              if (fp->askb_rx[i])
++              {
++                  kfree_skb(fp->askb_rx[i]);
++                  fp->askb_rx[i] = NULL;
++          }
++      }
++//    MOD_DEC_USE_COUNT;
++
++      return 0;
++}
++
++/************************************************************************
++* +NAME: fec_get_stat
++*
++* RETURNS: This function returns the statistical information.
++*************************************************************************/
++struct net_device_stats * fec_get_stat(struct net_device *dev)
++{
++
++      //Receive the pointer to the private structure
++      struct fec_priv *fp = netdev_priv(dev);
++
++      // Receive the base address
++      unsigned long base_addr = dev->base_addr;
++
++      // Receive the statistical information
++      fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr);
++      fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr);
++      fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr);
++      fp->fecpriv_stat.tx_bytes = FECSTAT_RMON_T_OCTETS(base_addr);
++
++      fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr);
++      fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr);
++
++      fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + FECSTAT_RMON_R_OVERSIZE(base_addr) + FECSTAT_RMON_R_FRAG(base_addr) + FECSTAT_RMON_R_JAB(base_addr);
++      fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr);
++      fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr);
++      fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr);
++
++      fp->fecpriv_stat.tx_carrier_errors = FECSTAT_IEEE_T_CSERR(base_addr);
++      fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr);
++      fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr);
++
++      // I hope that one frame doesn't have more than one error
++      fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + fp->fecpriv_stat.rx_crc_errors + fp->fecpriv_stat.rx_frame_errors + fp->fecpriv_stat.rx_over_errors + fp->fecpriv_stat.rx_dropped;
++      fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + fp->fecpriv_stat.tx_fifo_errors + fp->fecpriv_stat.tx_window_errors + fp->fecpriv_stat.tx_aborted_errors + fp->fecpriv_stat.tx_heartbeat_errors + fp->fecpriv_stat.tx_dropped;
++
++      return &fp->fecpriv_stat;
++}
++
++/************************************************************************
++* NAME: fec_set_multicast_list
++*
++* DESCRIPTION: This function sets the frame filtering parameters
++*************************************************************************/
++void fec_set_multicast_list(struct net_device *dev)
++{
++      // Pointer to the address list
++      struct dev_mc_list *dmi;
++
++      unsigned int crc, data;
++      int i, j, k;
++
++      // Receive the base address
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++
++      if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI)
++      {
++              // Allow all incoming frames
++              FEC_GALR(base_addr) = 0xFFFFFFFF;
++              FEC_GAUR(base_addr) = 0xFFFFFFFF;
++              return;
++      }
++      // Reset the group address register
++      FEC_GALR(base_addr) = 0x00000000;
++      FEC_GAUR(base_addr) = 0x00000000;
++
++      // Process all addresses
++      for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next)
++      {
++              // Processing must be only for the group addresses
++              if (!(dmi->dmi_addr[0] & 1))
++                      continue;
++
++              // Calculate crc value for the current address
++              crc = 0xFFFFFFFF;
++              for (j = 0; j < dmi->dmi_addrlen; j++)
++              {
++
++                      for (k = 0, data = dmi->dmi_addr[j]; k < 8;  k++, data >>= 1)
++                      {
++                              if ((crc ^ data) & 1)
++                                      crc = (crc >> 1) ^ FEC_CRCPOL;
++                              else
++                                      crc >>= 1;
++
++                      }
++
++              }
++
++              // Add this value
++              crc >>= 26;
++              crc &= 0x3F;
++              if (crc > 31)
++                      FEC_GAUR(base_addr) |= 0x1 << (crc - 32);
++              else
++                      FEC_GALR(base_addr) |= 0x1 << crc;
++
++      }
++
++}
++
++/************************************************************************
++* NAME: fec_set_mac_address
++*
++* DESCRIPTION: This function sets the MAC address
++*************************************************************************/
++int fec_set_mac_address(struct net_device *dev, void *p)
++{
++      //Receive the pointer to the private structure
++      struct fec_priv *fp = netdev_priv(dev);
++
++      // Receive the base address
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++
++      struct sockaddr *addr = p;
++
++      if (netif_running(dev))
++              return -EBUSY;
++
++      // Copy a new address to the device structure
++      memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
++
++      // Copy a new address to the private structure
++      memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6);
++
++      // Set the address to the registers
++      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
++      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
++
++      return 0;
++}
++
++/************************************************************************
++* NAME: fec_tx
++*
++* DESCRIPTION: This function starts transmission of the frame using DMA
++*
++* RETURNS: This function always returns zero.
++*************************************************************************/
++int fec_tx(struct sk_buff *skb, struct net_device *dev)
++{
++
++      //Receive the pointer to the private structure
++      struct fec_priv *fp = netdev_priv(dev);
++
++      void *data, *data_aligned;
++      int offset;
++
++printk(KERN_INFO "fec_tx\n");
++      data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
++
++      if (!data)
++      {
++              fp->fecpriv_stat.tx_dropped++;
++              dev_kfree_skb(skb);
++              return 0;
++      }
++
++      offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - (unsigned long)virt_to_phys(data);
++      data_aligned = (void*)((unsigned long)data + offset);
++      memcpy(data_aligned, skb->data, skb->len);
++
++      // flush data cache before initializing the descriptor and starting DMA
++#if 0
++/* JKM -- currently running with cache turned off */
++      DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len);
++#endif
++
++      spin_lock_irq(&fp->fecpriv_lock);
++
++      // Initialize the descriptor
++      fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data;
++      fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned);
++      fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len;
++      fp->fecpriv_txdesc[fp->fecpriv_next_tx].statCtrl |= (MCD_FEC_END_FRAME | MCD_FEC_BUF_READY);
++      fp->fecpriv_next_tx = (fp->fecpriv_next_tx + 1) & FEC_TX_INDEX_MASK;
++
++      if (fp->fecpriv_txbuf[fp->fecpriv_current_tx] && fp->fecpriv_current_tx == fp->fecpriv_next_tx)
++              netif_stop_queue(dev);
++
++      spin_unlock_irq(&fp->fecpriv_lock);
++
++      // Tell the DMA to continue the transmission
++      MCD_continDma(fp->fecpriv_fec_tx_channel);
++
++      dev_kfree_skb(skb);
++
++      dev->trans_start = jiffies;
++
++      return 0;
++}
++
++/************************************************************************
++* NAME: fec_tx_timeout
++*
++* DESCRIPTION: If the interrupt processing of received frames was lost
++*              and DMA stopped the reception, this function clears
++*              the transmission descriptors and starts DMA
++*
++*************************************************************************/
++void fec_tx_timeout(struct net_device *dev)
++{
++      int i;
++      struct fec_priv *fp = netdev_priv(dev);
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++
++printk(KERN_INFO "fec_tx_timeout\n");
++      spin_lock_irq(&fp->fecpriv_lock);
++      MCD_killDma(fp->fecpriv_fec_tx_channel);
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
++      {
++              if (fp->fecpriv_txbuf[i])
++              {
++
++                      kfree(fp->fecpriv_txbuf[i]);
++                      fp->fecpriv_txbuf[i] = NULL;
++
++              }
++              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
++      }
++      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
++
++      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
++
++    // Reset FIFOs
++    FEC_FECFRST(base_addr) |= FEC_SW_RST;
++    FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
++
++      // Reset and disable FEC
++//    FEC_ECR(base_addr) = FEC_ECR_RESET;
++
++      // Enable FEC
++      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
++
++      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
++                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
++                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
++                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
++                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
++
++      spin_unlock_irq(&fp->fecpriv_lock);
++
++      netif_wake_queue(dev);
++
++}
++
++/************************************************************************
++* NAME: fec_read_mii
++*
++* DESCRIPTION: This function reads the value from the MII register
++*
++* RETURNS: If no error occurs, this function returns zero.
++*************************************************************************/
++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data)
++{
++      unsigned long time;
++
++      // Clear the MII interrupt bit
++      FEC_EIR(base_addr) = FEC_EIR_MII;
++
++      // Write to the MII management frame register
++      FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18);
++
++      time = jiffies;
++
++      // Wait for the reading
++      while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
++      {
++              if (jiffies - time > FEC_MII_TIMEOUT * HZ)
++                      return -ETIME;
++              schedule();
++      }
++
++      // Clear the MII interrupt bit
++      FEC_EIR(base_addr) = FEC_EIR_MII;
++
++      *data = FEC_MMFR(base_addr) & 0x0000FFFF;
++
++      return 0;
++}
++
++/************************************************************************
++* NAME: fec_write_mii
++*
++* DESCRIPTION: This function writes the value to the MII register
++*
++* RETURNS: If no error occurs, this function returns zero.
++*************************************************************************/
++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data)
++{
++      unsigned long time;
++
++      // Clear the MII interrupt bit
++      FEC_EIR(base_addr) = FEC_EIR_MII;
++
++      // Write to the MII management frame register
++      FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data;
++
++      time = jiffies;
++
++      // Wait for the writing
++
++      while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
++      {
++              if (jiffies - time > FEC_MII_TIMEOUT * HZ)
++                      return -ETIME;
++
++              schedule();
++      }
++
++      // Clear the MII interrupt bit
++      FEC_EIR(base_addr) = FEC_EIR_MII;
++
++      return 0;
++}
++
++/************************************************************************
++* NAME: fec_interrupt_tx_handler
++*
++* DESCRIPTION: This function is called when the data
++*              transmission from the buffer to the FEC is completed.
++*
++*************************************************************************/
++void fec_interrupt_fec_tx_handler(struct net_device *dev)
++{
++      struct fec_priv *fp = netdev_priv(dev);
++
++printk(KERN_INFO "fectxint\n");
++      //Release the socket buffer
++      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
++      {
++              kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
++              fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
++      }
++      fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK;
++
++      if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE)
++              for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK)
++              {
++                      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
++                      {
++                              kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
++                              fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
++                      }
++              }
++
++      if (netif_queue_stopped(dev))
++              netif_wake_queue(dev);
++
++}
++
++/************************************************************************
++* NAME: fec_interrupt_rx_handler
++*
++* DESCRIPTION: This function is called when the data
++*              reception from the FEC to the reception buffer is completed.
++*
++*************************************************************************/
++void fec_interrupt_fec_rx_handler(struct net_device *dev)
++{
++      struct fec_priv *fp = netdev_priv(dev);
++      struct sk_buff *skb;
++
++printk(KERN_INFO "fecrxint\n");
++      fp->fecpriv_rxflag = 1;
++/*
++      // Some buffers can be missed
++      if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME))
++      {
++              // Find a valid index
++              for(i = 0; i < FEC_RX_BUF_NUMBER && !(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME); i++, fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK);
++
++              if(i == FEC_RX_BUF_NUMBER)
++              {
++                      // There are no data to process
++                      // Tell the DMA to continue the reception
++                      MCD_continDma(fp->fecpriv_fec_rx_channel);
++
++                      fp->fecpriv_rxflag = 0;
++
++                      return;
++              }
++      }
++*/
++      for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK)
++      {
++          if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) &&
++                  (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) // --tym--
++          {
++              skb = fp->askb_rx[fp->fecpriv_current_rx];
++              if (!skb)
++              {
++                  fp->fecpriv_stat.rx_dropped++;
++            }
++              else
++              {
++                  // flush data cache before initializing the descriptor and starting DMA
++//                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len);
++
++                      skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4);
++//                            skb->dev = dev;
++                      skb->protocol = eth_type_trans(skb, dev);
++                      netif_rx(skb);
++              }
++                  fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME;
++              // allocate new skbuff
++              fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA);
++                  if (!fp->askb_rx[fp->fecpriv_current_rx])
++          {
++                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0;
++                  fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0;
++                  fp->fecpriv_stat.rx_dropped++;
++                  }
++              else
++              {
++                  skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16);
++                      fp->askb_rx[fp->fecpriv_current_rx]->dev = dev;
++
++                  // flush data cache before initializing the descriptor and starting DMA
++#if 0
++/* JKM -- currently running with cache turned off */
++                  DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
++#endif
++
++              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail);
++              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE;
++                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY;
++
++                  // flush data cache before initializing the descriptor and starting DMA
++//                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
++          }
++        }
++
++      }
++
++      // Tell the DMA to continue the reception
++      MCD_continDma(fp->fecpriv_fec_rx_channel);
++
++      fp->fecpriv_rxflag = 0;
++
++}
++
++/************************************************************************
++* NAME: fec_interrupt_handler
++*
++* DESCRIPTION: This function is called when some special errors occur
++*
++*************************************************************************/
++irqreturn_t fec_interrupt_handler(int irq, void *dev_id)
++{
++
++      struct net_device *dev = (struct net_device *)dev_id;
++      struct fec_priv *fp = netdev_priv(dev);
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++      unsigned long events;
++
++printk(KERN_INFO "fecerrint\n");
++      // Read and clear the events
++      events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
++
++      if (events & FEC_EIR_HBERR)
++      {
++              fp->fecpriv_stat.tx_heartbeat_errors++;
++      FEC_EIR(base_addr) = FEC_EIR_HBERR;
++      }
++
++    // receive/transmit FIFO error
++    if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0))
++    {
++        // kill DMA receive channel
++        MCD_killDma (fp->fecpriv_fec_rx_channel);
++        // kill running transmission by DMA
++        MCD_killDma (fp->fecpriv_fec_tx_channel);
++
++        // Reset FIFOs
++        FEC_FECFRST(base_addr) |= FEC_SW_RST;
++        FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
++
++        // reset receive FIFO status register
++        FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE
++                                 | FEC_FECRFSR_RXW
++                                 | FEC_FECRFSR_UF;
++
++        // reset transmit FIFO status register
++        FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE
++                                 | FEC_FECTFSR_TXW
++                                 | FEC_FECTFSR_UF
++                                 | FEC_FECTFSR_OF;
++
++        // reset RFERR and XFERR event
++        FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR;
++
++      // stop queue
++      netif_stop_queue(dev);
++      
++        // execute reinitialization as tasklet
++      tasklet_schedule(&fp->fecpriv_tasklet_reinit);
++
++        fp->fecpriv_stat.rx_dropped++;
++
++    }
++
++    // transmit FIFO underrun
++    if ((events & FEC_EIR_XFUN) != 0)
++    {
++        // reset XFUN event
++        FEC_EIR(base_addr) = FEC_EIR_XFUN;
++              fp->fecpriv_stat.tx_aborted_errors++;
++    }
++
++    // late collision
++    if ((events & FEC_EIR_LC) != 0)
++    {
++        // reset LC event
++        FEC_EIR(base_addr) = FEC_EIR_LC;
++              fp->fecpriv_stat.tx_aborted_errors++;
++    }
++
++    // collision retry limit
++    if ((events & FEC_EIR_RL) != 0)
++    {
++        // reset RL event
++        FEC_EIR(base_addr) = FEC_EIR_RL;
++              fp->fecpriv_stat.tx_aborted_errors++;
++    }
++
++    return 0;
++}
++
++/************************************************************************
++* NAME: fec_interrupt_reinit
++*
++* DESCRIPTION: This function is called from interrupt handler
++*              when controller must be reinitialized.
++*
++*************************************************************************/
++void fec_interrupt_fec_reinit(unsigned long data)
++{
++      int i;
++      struct net_device *dev = (struct net_device*)data;
++      struct fec_priv *fp = netdev_priv(dev);
++      unsigned long base_addr = (unsigned long) dev->base_addr;
++
++printk(KERN_INFO "fecreinit\n");
++      // Initialize reception descriptors and start DMA for the reception
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
++      {
++              if (!fp->askb_rx[i])
++              {
++              fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA);
++              if (!fp->askb_rx[i])
++                  {
++                      fp->fecpriv_rxdesc[i].dataPointer = 0;
++                      fp->fecpriv_rxdesc[i].statCtrl = 0;
++              fp->fecpriv_rxdesc[i].length = 0;
++              continue;
++              }
++                      fp->askb_rx[i]->dev = dev;
++          skb_reserve(fp->askb_rx[i], 16);
++          }
++          fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
++              fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
++      fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
++      }
++
++      fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
++      fp->fecpriv_current_rx = 0;
++
++    // restart frame transmission
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
++      {
++              if (fp->fecpriv_txbuf[i])
++              {
++
++                      kfree(fp->fecpriv_txbuf[i]);
++                      fp->fecpriv_txbuf[i] = NULL;
++              fp->fecpriv_stat.tx_dropped++;
++              }
++              fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
++      }
++      fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
++      fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
++
++      // flush entire data cache before restarting the DMA
++#if 0
++/* JKM -- currently running with cache turned off */
++      DcacheFlushInvalidate();
++#endif
++      
++    // restart DMA from beginning
++      MCD_startDma(fp->fecpriv_fec_rx_channel,
++                   (char *) fp->fecpriv_rxdesc, 0,
++                   (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
++                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_rx,
++                   FEC_RX_DMA_PRI, MCD_FECRX_DMA | MCD_INTERRUPT,
++                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
++
++      MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
++                   (unsigned char *) &(FEC_FECTFDR(base_addr)), 0,
++                   FEC_MAX_FRM_SIZE, 0, fp->fecpriv_initiator_tx,
++                   FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
++                   MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
++
++    // Enable FEC
++    FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
++
++      netif_wake_queue(dev);
++
++}
++
++/************************************************************************
++* NAME: fec_interrupt_tx_handler_fec0
++*
++* DESCRIPTION: This is the DMA interrupt handler using  for FEC0
++*              transmission.
++*
++*************************************************************************/
++void fec_interrupt_fec_tx_handler_fec0(void)
++{
++      fec_interrupt_fec_tx_handler(fec_dev[0]);
++}
++
++#ifdef   FEC_2
++/************************************************************************
++* NAME: fec_interrupt_tx_handler_fec1
++*
++* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
++*              transmission.
++*
++*************************************************************************/
++void fec_interrupt_fec_tx_handler_fec1(void)
++{
++      fec_interrupt_fec_tx_handler(fec_dev[1]);
++}
++#endif
++
++/************************************************************************
++* NAME: fec_interrupt_rx_handler_fec0
++*
++* DESCRIPTION: This is the DMA interrupt handler using for the FEC0
++*              reception.
++*
++*************************************************************************/
++void fec_interrupt_fec_rx_handler_fec0(void)
++{
++      fec_interrupt_fec_rx_handler(fec_dev[0]);
++}
++
++#ifdef   FEC_2
++/************************************************************************
++* NAME: fec_interrupt_rx_handler_fec1
++*
++* DESCRIPTION: This is the DMA interrupt handler using for the FEC1
++*              reception.
++*
++*************************************************************************/
++void fec_interrupt_fec_rx_handler_fec1(void)
++{
++      fec_interrupt_fec_rx_handler(fec_dev[1]);
++}
++
++#endif
++#ifndef MODULE
++
++/************************************************************************
++* NAME: fec_mac_setup0
++*
++* DESCRIPTION: This function sets the MAC address of FEC0 from command line
++*
++*************************************************************************/
++int __init fec_mac_setup0(char *s)
++{
++      if(!s || !*s)
++              return 1;
++
++      if(fec_str_to_mac(s, fec_mac_addr_fec0))
++              printk("The MAC address of FEC0 cannot be set from command line");
++      return 1;
++
++}
++
++#ifdef   FEC_2
++
++/************************************************************************
++* NAME: fec_mac_setup1
++*
++* DESCRIPTION: This function sets the MAC address of FEC1 from command line
++*
++*************************************************************************/
++int __init fec_mac_setup1(char *s)
++{
++      if(!s || !*s)
++              return 1;
++
++
++      if(fec_str_to_mac(s, fec_mac_addr_fec1))
++              printk("The MAC address of FEC1 cannot be set from command line");
++      return 1;
++
++}
++#endif
++
++/************************************************************************
++* NAME: fec_str_to_mac
++*
++* DESCRIPTION: This function interprets the character string into MAC addr
++*
++*************************************************************************/
++int fec_str_to_mac( char *str_mac, unsigned char* addr)
++{
++    unsigned long val;
++      char c;
++      unsigned long octet[6], *octetptr = octet;
++      int i;
++again:
++
++      val = 0;
++      while ((c = *str_mac) != '\0')
++      {
++              if ((c>='0')&&(c<='9'))
++              {
++                      val = (val * 16) + (c - '0');
++                      str_mac++;
++                      continue;
++              }
++              else
++              if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F')))
++              {
++                      val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A'));
++                      str_mac++;
++                      continue;
++              }
++              break;
++      }
++      if (*str_mac == ':')
++      {
++              *octetptr++ = val, str_mac++;
++              if (octetptr >= octet + 6)
++                      return 1;
++              goto again;
++      }
++
++       //Check for trailing characters.
++      if (*str_mac && !(*str_mac==' '))
++              return 1;
++      *octetptr++ = val;
++
++      if ((octetptr - octet)==6)
++      {
++         for(i=0;i<=6;i++)
++            addr[i]=octet[i];
++      }
++    else
++              return 1;
++
++      return 0;
++
++}
++#endif
+--- /dev/null
++++ b/drivers/net/fec/fec.h
+@@ -0,0 +1,162 @@
++
++#define   FEC_BASE_ADDR_FEC0                ((unsigned int)MCF_MBAR + 0x9000)
++#define   FEC_BASE_ADDR_FEC1                ((unsigned int)MCF_MBAR + 0x9800)
++
++//#define   FEC_INTC_IMRH_INT_MASK38          (0x00000040)
++//#define   FEC_INTC_IMRH_INT_MASK39          (0x00000080)
++//#define   FEC_INTC_ICR_FEC0                 (0x30)
++//#define   FEC_INTC_ICR_FEC1                 (0x31)
++#define   FEC_FECI2CIRQ                     (0xFFC0)
++#define   FEC_GPIO_PAR_FECI2CIRQ            *(volatile unsigned short*)((unsigned int)MCF_MBAR + 0xA44)
++//#define   FEC_INTC_ICRn(x)                  (*(volatile unsigned char *)(void*)((unsigned int) MCF_MBAR + 0x000740+((x)*0x001)))
++//#define   FEC_INTC_IMRH                     *(volatile unsigned int*)((unsigned int)MCF_MBAR + 0x000708)
++
++#define   FEC_ECR_DISABLE                   (0x00000000)
++
++#define   FEC_ECR(x)                        *(volatile unsigned int *)(x + 0x024)
++#define   FEC_EIR(x)                        *(volatile unsigned int*)(x + 0x004)
++#define   FEC_PALR(x)                       *(volatile unsigned int*)(x + 0x0E4)
++#define   FEC_PAUR(x)                       *(volatile unsigned int*)(x + 0x0E8)
++#define   FEC_IALR(x)                       *(volatile unsigned int*)(x + 0x11C)
++#define   FEC_IAUR(x)                       *(volatile unsigned int*)(x + 0x118)
++#define   FEC_GALR(x)                       *(volatile unsigned int*)(x + 0x124)
++#define   FEC_GAUR(x)                       *(volatile unsigned int*)(x + 0x120)
++#define   FEC_RCR(x)                        *(volatile unsigned int*)(x + 0x084)
++#define   FEC_FECRFCR(x)                    *(volatile unsigned int*)(x + 0x18C)
++#define   FEC_FECRFAR(x)                    *(volatile unsigned int*)(x + 0x198)
++#define   FEC_FECTFCR(x)                    *(volatile unsigned int*)(x + 0x1AC)
++#define   FEC_FECTFAR(x)                    *(volatile unsigned int*)(x + 0x1B8)
++#define   FEC_FECTFWR(x)                    *(volatile unsigned int*)(x + 0x144)
++#define   FEC_CTCWR(x)                      *(volatile unsigned int*)(x + 0x1C8)
++#define   FEC_EIMR(x)                       *(volatile unsigned int*)(x + 0x008)
++#define   FEC_TCR(x)                        *(volatile unsigned int*)(x + 0x0C4)
++#define   FEC_MIBC(x)                       *(volatile unsigned int*)(x + 0x064)
++#define   FEC_MSCR(x)                       *(volatile unsigned int*)(x + 0x044)
++#define   FEC_FECTFDR(x)                    *(volatile unsigned int*)(x + 0x1A4)
++#define   FEC_FECRFDR(x)                    *(volatile unsigned int*)(x + 0x184)
++#define   FEC_FECTFSR(x)                    *(volatile unsigned int*)(x + 0x1A8)
++#define   FEC_FECRFSR(x)                                      *(volatile unsigned int*)(x + 0x188)
++#define   FECSTAT_RMON_R_PACKETS(x)         *(volatile unsigned int*)(x + 0x284)
++#define   FECSTAT_RMON_T_PACKETS(x)         *(volatile unsigned int*)(x + 0x204)
++#define   FECSTAT_RMON_R_OCTETS(x)          *(volatile unsigned int*)(x + 0x2C4)
++#define   FECSTAT_RMON_T_OCTETS(x)          *(volatile unsigned int*)(x + 0x244)
++#define   FECSTAT_RMON_R_UNDERSIZE(x)       *(volatile unsigned int*)(x + 0x294)
++#define   FECSTAT_RMON_R_OVERSIZE(x)        *(volatile unsigned int*)(x + 0x298)
++#define   FECSTAT_RMON_R_FRAG(x)            *(volatile unsigned int*)(x + 0x29C)
++#define   FECSTAT_RMON_R_JAB(x)             *(volatile unsigned int*)(x + 0x2A0)
++#define   FECSTAT_RMON_R_MC_PKT(x)          *(volatile unsigned int*)(x + 0x28C)
++#define   FECSTAT_RMON_T_COL(x)             *(volatile unsigned int*)(x + 0x224)
++#define   FECSTAT_IEEE_R_ALIGN(x)           *(volatile unsigned int*)(x + 0x2D4)
++#define   FECSTAT_IEEE_R_CRC(x)             *(volatile unsigned int*)(x + 0x2D0)
++#define   FECSTAT_IEEE_R_MACERR(x)          *(volatile unsigned int*)(x + 0x2D8)
++#define   FECSTAT_IEEE_T_CSERR(x)           *(volatile unsigned int*)(x + 0x268)
++#define   FECSTAT_IEEE_T_MACERR(x)          *(volatile unsigned int*)(x + 0x264)
++#define   FECSTAT_IEEE_T_LCOL(x)            *(volatile unsigned int*)(x + 0x25C)
++#define   FECSTAT_IEEE_R_OCTETS_OK(x)       *(volatile unsigned int*)(x + 0x2E0)
++#define   FECSTAT_IEEE_T_OCTETS_OK(x)       *(volatile unsigned int*)(x + 0x274)
++#define   FECSTAT_IEEE_R_DROP(x)            *(volatile unsigned int*)(x + 0x2C8)
++#define   FECSTAT_IEEE_T_DROP(x)            *(volatile unsigned int*)(x + 0x248)
++#define   FECSTAT_IEEE_R_FRAME_OK(x)        *(volatile unsigned int*)(x + 0x2CC)
++#define   FECSTAT_IEEE_T_FRAME_OK(x)        *(volatile unsigned int*)(x + 0x24C)
++#define   FEC_MMFR(x)                       *(volatile unsigned int*)(x + 0x040)
++#define   FEC_FECFRST(x)                                      *(volatile unsigned int*)(x + 0x1C4)
++
++#define   FEC_MAX_FRM_SIZE                  (1518)
++#define   FEC_MAXBUF_SIZE                   (1520)
++
++// Register values
++#define   FEC_ECR_RESET                     (0x00000001)
++#define   FEC_EIR_CLEAR                     (0xFFFFFFFF)
++#define   FEC_EIR_RL                        (0x00100000)
++#define   FEC_EIR_HBERR                     (0x80000000)
++#define   FEC_EIR_BABR                                                (0x40000000)   // babbling receive error
++#define   FEC_EIR_BABT                                                (0x20000000)   // babbling transmit error
++#define   FEC_EIR_TXF                         (0x08000000)   // transmit frame interrupt
++#define   FEC_EIR_MII                                         (0x00800000)   // MII interrupt
++#define   FEC_EIR_LC                                          (0x00200000)   // late collision
++#define   FEC_EIR_XFUN                                                (0x00080000)   // transmit FIFO underrun
++#define   FEC_EIR_XFERR                                               (0x00040000)   // transmit FIFO error
++#define   FEC_EIR_RFERR                                               (0x00020000)   // receive FIFO error
++#define   FEC_RCR_MAX_FRM_SIZE              (FEC_MAX_FRM_SIZE << 16)
++#define   FEC_RCR_MII                       (0x00000004)
++#define   FEC_FECRFCR_FAE                                     (0x00400000)   // frame accept error
++#define   FEC_FECRFCR_RXW                                     (0x00200000)   // receive wait condition
++#define   FEC_FECRFCR_UF                                      (0x00100000)   // receive FIFO underflow
++#define   FEC_FECRFCR_FRM                   (0x08000000)
++#define   FEC_FECRFCR_GR                    (0x7 << 24)
++
++#define   FEC_EIMR_DISABLE                                    (0x00000000)
++
++#define   FEC_FECRFAR_ALARM                 (0x300)
++#define   FEC_FECTFCR_FRM                   (0x08000000)
++#define   FEC_FECTFCR_GR                    (0x7 << 24)
++#define   FEC_FECTFCR_FAE                                     (0x00400000)   // frame accept error
++#define   FEC_FECTFCR_TXW                                     (0x00040000)   // transmit wait condition
++#define   FEC_FECTFCR_UF                                      (0x00100000)   // transmit FIFO underflow
++#define   FEC_FECTFCR_OF                                      (0x00080000)   // transmit FIFO overflow
++
++#define   FEC_FECTFAR_ALARM                 (0x100)
++#define   FEC_FECTFWR_XWMRK                 (0x00000000)
++
++#define   FEC_FECTFSR_MSK                   (0xC0B00000)
++#define   FEC_FECTFSR_TXW                   (0x40000000)   // transmit wait condition
++#define   FEC_FECTFSR_FAE                   (0x00800000)   // frame accept error
++#define   FEC_FECTFSR_UF                    (0x00200000)   // transmit FIFO underflow
++#define   FEC_FECTFSR_OF                    (0x00100000)   // transmit FIFO overflow
++
++#define   FEC_FECRFSR_MSK                   (0x80F00000)
++#define   FEC_FECRFSR_FAE                   (0x00800000)   // frame accept error
++#define   FEC_FECRFSR_RXW                   (0x00400000)   // receive wait condition
++#define   FEC_FECRFSR_UF                    (0x00200000)   // receive FIFO underflow
++
++#define   FEC_CTCWR_TFCW_CRC                (0x03000000)
++#define   FEC_TCR_FDEN                      (0x00000004)
++#define   FEC_TCR_HBC                       (0x00000002)
++#define   FEC_RCR_DRT                       (0x00000002)
++#define   FEC_EIMR_MASK                     (FEC_EIR_RL | FEC_EIR_HBERR)
++#define   FEC_ECR_ETHEREN                   (0x00000002)
++#define   FEC_FECTFCR_MSK                   (0x00FC0000)
++#define   FEC_FECRFCR_MSK                   (0x00F80000)
++#define   FEC_EIR_GRA                       (0x10000000)
++#define   FEC_TCR_GTS                       (0x00000001)
++#define   FEC_MIBC_ENABLE                   (0x00000000)
++#define   FEC_MIB_LEN                       (228)
++#define   FEC_PHY_ADDR                      (0x01)
++
++#define FEC_RX_DMA_PRI                      (6)
++#define FEC_TX_DMA_PRI                      (6)
++
++#define   FEC_TX_BUF_NUMBER                 (8)
++#define   FEC_RX_BUF_NUMBER                 (64)
++
++#define   FEC_TX_INDEX_MASK                 (0x7)
++#define   FEC_RX_INDEX_MASK                 (0x3f)
++
++#define   FEC_RX_DESC_FEC0                  SYS_SRAM_FEC_START
++#define   FEC_TX_DESC_FEC0                  FEC_RX_DESC_FEC0 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
++
++#define   FEC_RX_DESC_FEC1                  SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE/2
++#define   FEC_TX_DESC_FEC1                  FEC_RX_DESC_FEC1 + FEC_RX_BUF_NUMBER * sizeof(MCD_bufDescFec)
++
++#define   FEC_EIR_MII                       (0x00800000)
++#define   FEC_MMFR_READ                     (0x60020000)
++#define   FEC_MMFR_WRITE                    (0x50020000)
++
++#define   FEC_FLAGS_RX                      (0x00000001)
++
++#define   FEC_CRCPOL                        (0xEDB88320)
++
++#define   FEC_MII_TIMEOUT                   (2)
++#define   FEC_GR_TIMEOUT                    (1)
++#define   FEC_TX_TIMEOUT                    (1)
++#define   FEC_RX_TIMEOUT                    (1)
++
++#define   FEC_SW_RST                        0x2000000
++#define   FEC_RST_CTL                       0x1000000
++
++int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
++               unsigned int *data);
++int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra,
++                unsigned int data);
++
++#define init_transceiver ks8721_init_transceiver
+--- /dev/null
++++ b/drivers/net/fec/ks8721.c
+@@ -0,0 +1,125 @@
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/string.h>
++#include <linux/ptrace.h>
++#include <linux/errno.h>
++#include <linux/ioport.h>
++#include <linux/slab.h>
++#include <linux/interrupt.h>
++#include <linux/pci.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/skbuff.h>
++#include <linux/spinlock.h>
++#include <linux/workqueue.h>
++#include <linux/bitops.h>
++
++#if 0
++#include <linux/config.h>
++#include <linux/sched.h>
++#include <linux/errno.h>
++#include <asm/coldfire.h>
++#endif
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++
++#include   "fec.h"
++#include   "ks8721.h"
++
++#ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
++#define   KS8721_AUTO_NEGOTIATION_ENABLE
++#endif
++
++/************************************************************************
++* +NAME: ks8721_init_transceiver
++*
++* DESCRIPTION: This function initializes the transceiver
++*
++* RETURNS: If no error occurs, this function returns zero.
++*          Otherwise, it returns 1
++*************************************************************************/
++
++int ks8721_init_transceiver(unsigned long base_addr, int *fduplex)
++{
++
++      int data;
++      unsigned long time;
++      int flag = 1;
++
++      int result;
++
++      // Set the frequency of MII
++      FEC_MSCR(base_addr) = FEC_MII_SPEED;
++
++      // Reset
++      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_RESET)))
++              return result;
++
++      // Read back    
++      if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, &data)) != 0)
++              return result;
++
++      // If reset bit is set, return
++      if (data & KS8721_CTRL_RESET)
++              return -ETIME;
++
++#ifdef KS8721_AUTO_NEGOTIATION_ENABLE
++
++      // Disable  the auto-negotiation 
++      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, 0)) != 0)
++              return result;
++
++      // Set the auto-negotiation advertisement register 
++      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_ANADV, KS8721_ANADV_ADV_ALL)) != 0)
++              return result;
++
++      // Enable the auto-negotiation
++      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_AN_ENABLE)) != 0)
++              return result;
++
++      // Read PHY status register
++      if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
++              return result;
++      // Set the current time
++      time = jiffies;
++
++      // Wait for the auto-negotiation completion
++      while (!(data & KS8721_STAT_ANCOMPLETE))
++      {
++
++              if (jiffies - time > KS8721_TIMEOUT * HZ)
++              {
++                      flag = 0;
++                      break;
++              }
++
++              schedule();
++
++              // Read PHY status register
++              if ((result = fec_read_mii(base_addr, FEC_PHY_ADDR, KS8721_STAT, &data)) != 0)
++                      return result;
++      }
++
++      if (flag)
++      {
++              // Set the duplex flag     
++              if (data & KS8721_STAT_FDUPLEX)
++                      *fduplex = 1;
++              else
++                      *fduplex = 0;
++
++              return 0;
++      }
++
++#endif
++
++      // Set the default mode (Full duplex, 100 Mbps) 
++      if ((result = fec_write_mii(base_addr, FEC_PHY_ADDR, KS8721_CTRL, KS8721_CTRL_DEFAULT_MODE)) != 0)
++              return result;
++      *fduplex = KS8721_CTRL_DEFAULT_MODE & 0x100;
++
++      return 0;
++
++}
+--- /dev/null
++++ b/drivers/net/fec/ks8721.h
+@@ -0,0 +1,21 @@
++
++#define   FEC_MII_SPEED              (((unsigned int)(MCF_BUSCLK / 5000000)) << 1)
++
++// Numbers of the transceiver registers 
++#define   KS8721_CTRL                0x00
++#define   KS8721_ANADV               0x04
++#define   KS8721_STAT                0x01
++
++// Register values
++#define   KS8721_CTRL_RESET          0x8000
++#define   KS8721_ANADV_ADV_ALL       0x01E1
++#define   KS8721_CTRL_AN_ENABLE      0x1280
++#define   KS8721_CTRL_DEFAULT_MODE   0x2100
++#define   KS8721_STAT_ANCOMPLETE     0x0020
++#define   KS8721_STAT_LINK           0x0004
++#define   KS8721_STAT_FDUPLEX        0x5000
++
++// Timeout for the auto-negotiation mode
++#define   KS8721_TIMEOUT             5
++
++int ks8721_init_transceiver(unsigned long base_addr, int *fduplex);
+--- /dev/null
++++ b/include/asm-m68k/MCD_dma.h
+@@ -0,0 +1,408 @@
++/*********************************************************************
++ *
++ * Copyright (C) 2004  Motorola, Inc.
++ *  MOTOROLA, INC. All Rights Reserved.
++ *  You are hereby granted a copyright license to use
++ *  the SOFTWARE so long as this entire notice is
++ *  retained without alteration in any modified and/or redistributed
++ *  versions, and that such modified versions are clearly identified
++ *  as such. No licenses are granted by implication, estoppel or
++ *  otherwise under any patents or trademarks of Motorola, Inc. This
++ *  software is provided on an "AS IS" basis and without warranty.
++ *
++ *  To the maximum extent permitted by applicable law, MOTOROLA
++ *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
++ *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
++ *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
++ *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
++ *  ACCOMPANYING WRITTEN MATERIALS.
++ *
++ *  To the maximum extent permitted by applicable law, IN NO EVENT
++ *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
++ *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
++ *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
++ *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ *
++ *  Motorola assumes no responsibility for the maintenance and support
++ *  of this software
++ ********************************************************************/
++
++/*
++ * File:        MCD_dma.h
++ * Purpose:     Main header file for multi-channel DMA API.
++ *
++ * Notes:
++ *
++ * Modifications:
++ */
++#ifndef _MCD_API_H
++#define _MCD_API_H
++
++#include <asm/types.h>
++
++/*
++ * Turn Execution Unit tasks ON (#define) or OFF (#undef)
++ */
++#undef MCD_INCLUDE_EU
++
++/*
++ * Number of DMA channels
++ */
++#define NCHANNELS 16
++
++/*
++ * Total number of variants
++ */
++#ifdef MCD_INCLUDE_EU
++#define NUMOFVARIANTS   6
++#else
++#define NUMOFVARIANTS   4
++#endif
++
++/*
++ * Define sizes of the various tables
++ */
++#define TASK_TABLE_SIZE     (NCHANNELS*32)
++#define VAR_TAB_SIZE        (128)
++#define CONTEXT_SAVE_SIZE   (128)
++#define FUNCDESC_TAB_SIZE   (256)
++
++#ifdef MCD_INCLUDE_EU
++#define FUNCDESC_TAB_NUM    16
++#else
++#define FUNCDESC_TAB_NUM    1
++#endif
++
++
++#ifndef DEFINESONLY
++
++/*
++ * Portability typedefs
++ */
++ /*
++#ifndef s32
++typedef int s32;
++#endif
++#ifndef u32
++typedef unsigned int u32;
++#endif
++#ifndef s16
++typedef short s16;
++#endif
++#ifndef u16
++typedef unsigned short u16;
++#endif
++#ifndef s8
++typedef char s8;
++#endif
++#ifndef u8
++typedef unsigned char u8;
++#endif
++*/
++/*
++ * These structures represent the internal registers of the
++ * multi-channel DMA
++ */
++struct dmaRegs_s {
++   u32 taskbar;         /* task table base address register */
++   u32 currPtr;
++   u32 endPtr;
++   u32 varTablePtr;
++   u16 dma_rsvd0;
++   u16 ptdControl;      /* ptd control */
++   u32 intPending;      /* interrupt pending register */
++   u32 intMask;         /* interrupt mask register */
++   u16 taskControl[16]; /* task control registers */
++   u8  priority[32];    /* priority registers */
++   u32 initiatorMux;    /* initiator mux control */
++   u32 taskSize0;       /* task size control register 0. */
++   u32 taskSize1;       /* task size control register 1. */
++   u32 dma_rsvd1;       /* reserved */
++   u32 dma_rsvd2;       /* reserved */
++   u32 debugComp1;      /* debug comparator 1 */
++   u32 debugComp2;      /* debug comparator 2 */
++   u32 debugControl;    /* debug control */
++   u32 debugStatus;     /* debug status */
++   u32 ptdDebug;        /* priority task decode debug */
++   u32 dma_rsvd3[31];   /* reserved */
++};
++typedef volatile struct dmaRegs_s dmaRegs;
++
++#endif
++
++/*
++ * PTD contrl reg bits
++ */
++#define PTD_CTL_TSK_PRI         0x8000
++#define PTD_CTL_COMM_PREFETCH   0x0001
++
++/*
++ * Task Control reg bits and field masks
++ */
++#define TASK_CTL_EN             0x8000
++#define TASK_CTL_VALID          0x4000
++#define TASK_CTL_ALWAYS         0x2000
++#define TASK_CTL_INIT_MASK      0x1f00
++#define TASK_CTL_ASTRT          0x0080
++#define TASK_CTL_HIPRITSKEN     0x0040
++#define TASK_CTL_HLDINITNUM     0x0020
++#define TASK_CTL_ASTSKNUM_MASK  0x000f
++
++/*
++ * Priority reg bits and field masks
++ */
++#define PRIORITY_HLD            0x80
++#define PRIORITY_PRI_MASK       0x07
++
++/*
++ * Debug Control reg bits and field masks
++ */
++#define DBG_CTL_BLOCK_TASKS_MASK    0xffff0000
++#define DBG_CTL_AUTO_ARM            0x00008000
++#define DBG_CTL_BREAK               0x00004000
++#define DBG_CTL_COMP1_TYP_MASK      0x00003800
++#define DBG_CTL_COMP2_TYP_MASK      0x00000070
++#define DBG_CTL_EXT_BREAK           0x00000004
++#define DBG_CTL_INT_BREAK           0x00000002
++
++/*
++ * PTD Debug reg selector addresses
++ * This reg must be written with a value to show the contents of
++ * one of the desired internal register.
++ */
++#define PTD_DBG_REQ             0x00 /* shows the state of 31 initiators */
++#define PTD_DBG_TSK_VLD_INIT    0x01 /* shows which 16 tasks are valid and
++                                        have initiators asserted */
++
++
++/*
++ * General return values
++ */
++#define MCD_OK                   0
++#define MCD_ERROR               -1
++#define MCD_TABLE_UNALIGNED     -2
++#define MCD_CHANNEL_INVALID     -3
++
++/*
++ * MCD_initDma input flags
++ */
++#define MCD_RELOC_TASKS         0x00000001
++#define MCD_NO_RELOC_TASKS      0x00000000
++#define MCD_COMM_PREFETCH_EN    0x00000002  /* Commbus Prefetching - MCF547x/548x ONLY */
++
++/*
++ * MCD_dmaStatus Status Values for each channel
++ */
++#define MCD_NO_DMA  1 /* No DMA has been requested since reset */
++#define MCD_IDLE    2 /* DMA active, but the initiator is currently inactive */
++#define MCD_RUNNING 3 /* DMA active, and the initiator is currently active */
++#define MCD_PAUSED  4 /* DMA active but it is currently paused */
++#define MCD_HALTED  5 /* the most recent DMA has been killed with MCD_killTask() */
++#define MCD_DONE    6 /* the most recent DMA has completed. */
++
++
++/*
++ * MCD_startDma parameter defines
++ */
++
++/*
++ * Constants for the funcDesc parameter
++ */
++/* Byte swapping: */
++#define MCD_NO_BYTE_SWAP    0x00045670  /* to disable byte swapping. */
++#define MCD_BYTE_REVERSE    0x00076540  /* to reverse the bytes of each u32 of the DMAed data. */
++#define MCD_U16_REVERSE     0x00067450  /* to reverse the 16-bit halves of
++                                           each 32-bit data value being DMAed.*/
++#define MCD_U16_BYTE_REVERSE    0x00054760 /* to reverse the byte halves of each
++                                            16-bit half of each 32-bit data value DMAed */
++#define MCD_NO_BIT_REV  0x00000000  /* do not reverse the bits of each byte DMAed. */
++#define MCD_BIT_REV     0x00088880  /* reverse the bits of each byte DMAed */
++/* CRCing: */
++#define MCD_CRC16       0xc0100000  /* to perform CRC-16 on DMAed data. */
++#define MCD_CRCCCITT    0xc0200000  /* to perform CRC-CCITT on DMAed data. */
++#define MCD_CRC32       0xc0300000  /* to perform CRC-32 on DMAed data. */
++#define MCD_CSUMINET    0xc0400000  /* to perform internet checksums on DMAed data.*/
++#define MCD_NO_CSUM     0xa0000000  /* to perform no checksumming. */
++
++#define MCD_FUNC_NOEU1 (MCD_NO_BYTE_SWAP | MCD_NO_BIT_REV | MCD_NO_CSUM)
++#define MCD_FUNC_NOEU2 (MCD_NO_BYTE_SWAP | MCD_NO_CSUM)
++
++/*
++ * Constants for the flags parameter
++ */
++#define MCD_TT_FLAGS_RL   0x00000001 /* Read line */
++#define MCD_TT_FLAGS_CW   0x00000002 /* Combine Writes */
++#define MCD_TT_FLAGS_SP   0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY  */
++#define MCD_TT_FLAGS_MASK 0x000000ff
++#define MCD_TT_FLAGS_DEF  (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
++
++#define MCD_SINGLE_DMA  0x00000100 /* Unchained DMA */
++#define MCD_CHAIN_DMA              /* TBD */
++#define MCD_EU_DMA                 /* TBD */
++#define MCD_FECTX_DMA   0x00001000 /* FEC TX ring DMA */
++#define MCD_FECRX_DMA   0x00002000 /* FEC RX ring DMA */
++
++
++/* these flags are valid for MCD_startDma and the chained buffer descriptors */
++#define MCD_BUF_READY   0x80000000 /* indicates that this buffer is now under the DMA's control */
++#define MCD_WRAP        0x20000000 /* to tell the FEC Dmas to wrap to the first BD */
++#define MCD_INTERRUPT   0x10000000 /* to generate an interrupt after completion of the DMA. */
++#define MCD_END_FRAME   0x08000000 /* tell the DMA to end the frame when transferring
++                                      last byte of data in buffer */
++#define MCD_CRC_RESTART 0x40000000 /* to empty out the accumulated checksum
++                                      prior to performing the DMA. */
++
++/* Defines for the FEC buffer descriptor control/status word*/
++#define MCD_FEC_BUF_READY   0x8000
++#define MCD_FEC_WRAP        0x2000
++#define MCD_FEC_INTERRUPT   0x1000
++#define MCD_FEC_END_FRAME   0x0800
++
++
++/*
++ * Defines for general intuitiveness
++ */
++
++#define MCD_TRUE  1
++#define MCD_FALSE 0
++
++/*
++ * Three different cases for destination and source.
++ */
++#define MINUS1          -1
++#define ZERO            0
++#define PLUS1           1
++
++#ifndef DEFINESONLY
++
++/* Task Table Entry struct*/
++typedef struct {
++    u32 TDTstart;   /* task descriptor table start */
++    u32 TDTend;     /* task descriptor table end */
++    u32 varTab;     /* variable table start */
++    u32 FDTandFlags;    /* function descriptor table start and flags */
++    volatile u32 descAddrAndStatus;
++    volatile u32 modifiedVarTab;
++    u32 contextSaveSpace;   /* context save space start */
++    u32 literalBases;
++} TaskTableEntry;
++
++
++/* Chained buffer descriptor */
++typedef volatile struct MCD_bufDesc_struct MCD_bufDesc;
++struct MCD_bufDesc_struct {
++   u32 flags;         /* flags describing the DMA */
++   u32 csumResult;    /* checksum from checksumming performed since last checksum reset */
++   s8  *srcAddr;      /* the address to move data from */
++   s8  *destAddr;     /* the address to move data to */
++   s8  *lastDestAddr; /* the last address written to */
++   u32 dmaSize;       /* the number of bytes to transfer independent of the transfer size */
++   MCD_bufDesc *next; /* next buffer descriptor in chain */
++   u32 info;          /* private information about this descriptor;  DMA does not affect it */
++};
++
++/* Progress Query struct */
++typedef volatile struct MCD_XferProg_struct {
++   s8 *lastSrcAddr;         /* the most-recent or last, post-increment source address */
++   s8 *lastDestAddr;        /* the most-recent or last, post-increment destination address */
++   u32  dmaSize;            /* the amount of data transferred for the current buffer */
++   MCD_bufDesc *currBufDesc;/* pointer to the current buffer descriptor being DMAed */
++} MCD_XferProg;
++
++
++/* FEC buffer descriptor */
++typedef volatile struct MCD_bufDescFec_struct {
++    u16 statCtrl;
++    u16 length;
++    u32 dataPointer;
++} MCD_bufDescFec;
++
++
++/*************************************************************************/
++/*
++ * API function Prototypes  - see MCD_dmaApi.c for further notes
++ */
++
++/*
++ * MCD_startDma starts a particular kind of DMA .
++ */
++int MCD_startDma (
++   int channel,   /* the channel on which to run the DMA */
++   s8  *srcAddr,  /* the address to move data from, or buffer-descriptor address */
++   s16 srcIncr,   /* the amount to increment the source address per transfer */
++   s8  *destAddr, /* the address to move data to */
++   s16 destIncr,  /* the amount to increment the destination address per transfer */
++   u32 dmaSize,   /* the number of bytes to transfer independent of the transfer size */
++   u32 xferSize,  /* the number bytes in of each data movement (1, 2, or 4) */
++   u32 initiator, /* what device initiates the DMA */
++   int priority,  /* priority of the DMA */
++   u32 flags,     /* flags describing the DMA */
++   u32 funcDesc   /* a description of byte swapping, bit swapping, and CRC actions */
++);
++
++/* 
++ * MCD_initDma() initializes the DMA API by setting up a pointer to the DMA 
++ * registers, relocating and creating the appropriate task structures, and 
++ * setting up some global settings
++ */
++int MCD_initDma (dmaRegs *sDmaBarAddr, void *taskTableDest, u32 flags);
++
++/* 
++ * MCD_dmaStatus() returns the status of the DMA on the requested channel.
++ */
++int MCD_dmaStatus (int channel);
++
++/* 
++ * MCD_XferProgrQuery() returns progress of DMA on requested channel
++ */
++int MCD_XferProgrQuery (int channel, MCD_XferProg *progRep);
++
++/* 
++ * MCD_killDma() halts the DMA on the requested channel, without any
++ * intention of resuming the DMA.
++ */
++int MCD_killDma (int channel);
++
++/* 
++ * MCD_continDma() continues a DMA which as stopped due to encountering an
++ * unready buffer descriptor.
++ */
++int MCD_continDma (int channel);
++
++/* 
++ * MCD_pauseDma() pauses the DMA on the given channel ( if any DMA is
++ * running on that channel). 
++ */
++int MCD_pauseDma (int channel);
++
++/* 
++ * MCD_resumeDma() resumes the DMA on a given channel (if any DMA is
++ * running on that channel).
++ */
++int MCD_resumeDma (int channel);
++
++/* 
++ * MCD_csumQuery provides the checksum/CRC after performing a non-chained DMA
++ */
++int MCD_csumQuery (int channel, u32 *csum);
++
++/* 
++ * MCD_getCodeSize provides the packed size required by the microcoded task
++ * and structures.
++ */
++int MCD_getCodeSize(void);
++
++/*
++ * MCD_getVersion provides a pointer to a version string and returns a
++ * version number.
++ */
++int MCD_getVersion(char **longVersion);
++
++/* macro for setting a location in the variable table */
++#define MCD_SET_VAR(taskTab,idx,value) ((u32 *)(taskTab)->varTab)[idx] = value
++   /* Note that MCD_SET_VAR() is invoked many times in firing up a DMA function,
++      so I'm avoiding surrounding it with "do {} while(0)" */
++
++#endif  /* DEFINESONLY */
++
++#endif /* _MCD_API_H */
+--- a/include/asm-m68k/coldfire.h
++++ b/include/asm-m68k/coldfire.h
+@@ -7,6 +7,7 @@
+ #define MCF_SRAM      0x80000000
+ #elif defined(CONFIG_M547X_8X)
+ #define MCF_MBAR      0xE0000000
++#define MCF_MMUBAR    0xE1000000
+ #define MCF_RAMBAR0   0xE3000000
+ #define MCF_RAMBAR1   0xE3001000
+ #endif
+--- a/include/asm-m68k/dma.h
++++ b/include/asm-m68k/dma.h
+@@ -1,16 +1,120 @@
+ #ifndef _M68K_DMA_H
+ #define _M68K_DMA_H 1
+-
+ /* it's useless on the m68k, but unfortunately needed by the new
+    bootmem allocator (but this should do it for this) */
+ #define MAX_DMA_ADDRESS PAGE_OFFSET
++#ifndef CONFIG_COLDFIRE
+ #define MAX_DMA_CHANNELS 8
+ extern int request_dma(unsigned int dmanr, const char * device_id);   /* reserve a DMA channel */
+ extern void free_dma(unsigned int dmanr);     /* release it again */
++#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
++
++/************************************************
++ *    Multichannel DMA definitions            *
++ ************************************************/
++#ifdef CONFIG_MCD_DMA
++#include <asm/MCD_dma.h>
++#include <asm/m5485dma.h>
++
++struct scatterlist;
++
++#define MAX_DMA_CHANNELS NCHANNELS
++/*
++ *  identifiers for each initiator/requestor
++ */
++#define DMA_ALWAYS      (0)
++#define DMA_DSPI_RX     (1)
++#define DMA_DSPI_TX     (2)
++#define DMA_DREQ0       (3)
++#define DMA_PSC0_RX     (4)
++#define DMA_PSC0_TX     (5)
++#define DMA_USBEP0      (6)
++#define DMA_USBEP1      (7)
++#define DMA_USBEP2      (8)
++#define DMA_USBEP3      (9)
++#define DMA_PCI_TX      (10)
++#define DMA_PCI_RX      (11)
++#define DMA_PSC1_RX     (12)
++#define DMA_PSC1_TX     (13)
++#define DMA_I2C_RX      (14)
++#define DMA_I2C_TX      (15)
++#define DMA_FEC0_RX     (16)
++#define DMA_FEC0_TX     (17)
++#define DMA_FEC1_RX     (18)
++#define DMA_FEC1_TX     (19)
++#define DMA_DREQ1       (20)
++#define DMA_CTM0        (21)
++#define DMA_CTM1        (22)
++#define DMA_CTM2        (23)
++#define DMA_CTM3        (24)
++#define DMA_CTM4        (25)
++#define DMA_CTM5        (26)
++#define DMA_CTM6        (27)
++#define DMA_CTM7        (28)
++#define DMA_USBEP4      (29)
++#define DMA_USBEP5      (30)
++#define DMA_USBEP6      (31)
++#define DMA_PSC2_RX     (32)
++#define DMA_PSC2_TX     (33)
++#define DMA_PSC3_RX     (34)
++#define DMA_PSC3_TX     (35)
++#define DMA_FEC_RX(x)   ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX)
++#define DMA_FEC_TX(x)   ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX)
++
++int  dma_set_initiator(int);
++unsigned int dma_get_initiator(int);
++void dma_remove_initiator(int);
++int dma_set_channel(int);
++int dma_get_channel(int);
++void dma_remove_channel(int);
++int dma_set_channel_fec(int requestor);
++int dma_connect(int channel, int address);
++int dma_disconnect(int channel);
++void dma_remove_channel_by_number(int channel);
++int dma_init(void);
++
++#endif /* CONFIG_MCD_DMA */
++
++extern spinlock_t dma_spin_lock;
++
++static __inline__ unsigned long claim_dma_lock(void)
++{
++      unsigned long flags;
++      spin_lock_irqsave(&dma_spin_lock, flags);
++      return flags;
++}
++
++static __inline__ void release_dma_lock(unsigned long flags)
++{
++      spin_unlock_irqrestore(&dma_spin_lock, flags);
++}
++
++
++/*
++ *  Linux standard DMA stuff
++ */
++#if 0
++int  request_dma(unsigned int channel, const char * device_id);
++void free_dma(unsigned int channel);
++void enable_dma(unsigned int channel);
++void disable_dma(unsigned int channel);
++int  dma_channel_active(unsigned int channel);
++void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg);
++void set_dma_page(unsigned int channel, char pagenr);
++void set_dma_addr(unsigned int channel, unsigned long physaddr);
++void set_dma_count(unsigned int channel, unsigned long count);
++void set_dma_mode(unsigned int channel, unsigned int mode);
++void set_dma_speed(unsigned int channel, int cycle_ns);
++int  get_dma_residue(unsigned int channel);
++#endif
++#define clear_dma_ff(channel)
++
++#endif /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484) || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
++
+ #ifdef CONFIG_PCI
+ extern int isa_dma_bridge_buggy;
+ #else
+--- /dev/null
++++ b/include/asm-m68k/m5485dma.h
+@@ -0,0 +1,97 @@
++/*
++ *    m5485dma.h -- ColdFire 547x/548x DMA controller support.
++ */
++#ifndef __MCF548X_DMA_H__
++#define __MCF548X_DMA_H__
++
++
++/* Register read/write macros */
++#define MCF_DMA_DIPR    (*(volatile u32*)(void*)(MCF_MBAR+0x008014))
++#define MCF_DMA_DIMR    (*(volatile u32*)(void*)(MCF_MBAR+0x008018))
++#define MCF_DMA_IMCR    (*(volatile u32*)(void*)(MCF_MBAR+0x00805C))
++
++/* Bit definitions and macros for MCF_DMA_DIPR */
++#define MCF_DMA_DIPR_TASK0           (0x00000001)
++#define MCF_DMA_DIPR_TASK1           (0x00000002)
++#define MCF_DMA_DIPR_TASK2           (0x00000004)
++#define MCF_DMA_DIPR_TASK3           (0x00000008)
++#define MCF_DMA_DIPR_TASK4           (0x00000010)
++#define MCF_DMA_DIPR_TASK5           (0x00000020)
++#define MCF_DMA_DIPR_TASK6           (0x00000040)
++#define MCF_DMA_DIPR_TASK7           (0x00000080)
++#define MCF_DMA_DIPR_TASK8           (0x00000100)
++#define MCF_DMA_DIPR_TASK9           (0x00000200)
++#define MCF_DMA_DIPR_TASK10          (0x00000400)
++#define MCF_DMA_DIPR_TASK11          (0x00000800)
++#define MCF_DMA_DIPR_TASK12          (0x00001000)
++#define MCF_DMA_DIPR_TASK13          (0x00002000)
++#define MCF_DMA_DIPR_TASK14          (0x00004000)
++#define MCF_DMA_DIPR_TASK15          (0x00008000)
++
++/* Bit definitions and macros for MCF_DMA_DIMR */
++#define MCF_DMA_DIMR_TASK0           (0x00000001)
++#define MCF_DMA_DIMR_TASK1           (0x00000002)
++#define MCF_DMA_DIMR_TASK2           (0x00000004)
++#define MCF_DMA_DIMR_TASK3           (0x00000008)
++#define MCF_DMA_DIMR_TASK4           (0x00000010)
++#define MCF_DMA_DIMR_TASK5           (0x00000020)
++#define MCF_DMA_DIMR_TASK6           (0x00000040)
++#define MCF_DMA_DIMR_TASK7           (0x00000080)
++#define MCF_DMA_DIMR_TASK8           (0x00000100)
++#define MCF_DMA_DIMR_TASK9           (0x00000200)
++#define MCF_DMA_DIMR_TASK10          (0x00000400)
++#define MCF_DMA_DIMR_TASK11          (0x00000800)
++#define MCF_DMA_DIMR_TASK12          (0x00001000)
++#define MCF_DMA_DIMR_TASK13          (0x00002000)
++#define MCF_DMA_DIMR_TASK14          (0x00004000)
++#define MCF_DMA_DIMR_TASK15          (0x00008000)
++
++/* Bit definitions and macros for MCF_DMA_IMCR */
++#define MCF_DMA_IMCR_SRC16(x)        (((x)&0x00000003)<<0)
++#define MCF_DMA_IMCR_SRC17(x)        (((x)&0x00000003)<<2)
++#define MCF_DMA_IMCR_SRC18(x)        (((x)&0x00000003)<<4)
++#define MCF_DMA_IMCR_SRC19(x)        (((x)&0x00000003)<<6)
++#define MCF_DMA_IMCR_SRC20(x)        (((x)&0x00000003)<<8)
++#define MCF_DMA_IMCR_SRC21(x)        (((x)&0x00000003)<<10)
++#define MCF_DMA_IMCR_SRC22(x)        (((x)&0x00000003)<<12)
++#define MCF_DMA_IMCR_SRC23(x)        (((x)&0x00000003)<<14)
++#define MCF_DMA_IMCR_SRC24(x)        (((x)&0x00000003)<<16)
++#define MCF_DMA_IMCR_SRC25(x)        (((x)&0x00000003)<<18)
++#define MCF_DMA_IMCR_SRC26(x)        (((x)&0x00000003)<<20)
++#define MCF_DMA_IMCR_SRC27(x)        (((x)&0x00000003)<<22)
++#define MCF_DMA_IMCR_SRC28(x)        (((x)&0x00000003)<<24)
++#define MCF_DMA_IMCR_SRC29(x)        (((x)&0x00000003)<<26)
++#define MCF_DMA_IMCR_SRC30(x)        (((x)&0x00000003)<<28)
++#define MCF_DMA_IMCR_SRC31(x)        (((x)&0x00000003)<<30)
++#define MCF_DMA_IMCR_SRC16_FEC0RX    (0x00000000)
++#define MCF_DMA_IMCR_SRC17_FEC0TX    (0x00000000)
++#define MCF_DMA_IMCR_SRC18_FEC0RX    (0x00000020)
++#define MCF_DMA_IMCR_SRC19_FEC0TX    (0x00000080)
++#define MCF_DMA_IMCR_SRC20_FEC1RX    (0x00000100)
++#define MCF_DMA_IMCR_SRC21_DREQ1     (0x00000000)
++#define MCF_DMA_IMCR_SRC21_FEC1TX    (0x00000400)
++#define MCF_DMA_IMCR_SRC22_FEC0RX    (0x00001000)
++#define MCF_DMA_IMCR_SRC23_FEC0TX    (0x00004000)
++#define MCF_DMA_IMCR_SRC24_CTM0      (0x00010000)
++#define MCF_DMA_IMCR_SRC24_FEC1RX    (0x00020000)
++#define MCF_DMA_IMCR_SRC25_CTM1      (0x00040000)
++#define MCF_DMA_IMCR_SRC25_FEC1TX    (0x00080000)
++#define MCF_DMA_IMCR_SRC26_USBEP4    (0x00000000)
++#define MCF_DMA_IMCR_SRC26_CTM2      (0x00200000)
++#define MCF_DMA_IMCR_SRC27_USBEP5    (0x00000000)
++#define MCF_DMA_IMCR_SRC27_CTM3      (0x00800000)
++#define MCF_DMA_IMCR_SRC28_USBEP6    (0x00000000)
++#define MCF_DMA_IMCR_SRC28_CTM4      (0x01000000)
++#define MCF_DMA_IMCR_SRC28_DREQ1     (0x02000000)
++#define MCF_DMA_IMCR_SRC28_PSC2RX    (0x03000000)
++#define MCF_DMA_IMCR_SRC29_DREQ1     (0x04000000)
++#define MCF_DMA_IMCR_SRC29_CTM5      (0x08000000)
++#define MCF_DMA_IMCR_SRC29_PSC2TX    (0x0C000000)
++#define MCF_DMA_IMCR_SRC30_FEC1RX    (0x00000000)
++#define MCF_DMA_IMCR_SRC30_CTM6      (0x10000000)
++#define MCF_DMA_IMCR_SRC30_PSC3RX    (0x30000000)
++#define MCF_DMA_IMCR_SRC31_FEC1TX    (0x00000000)
++#define MCF_DMA_IMCR_SRC31_CTM7      (0x80000000)
++#define MCF_DMA_IMCR_SRC31_PSC3TX    (0xC0000000)
++
++#endif /* __MCF548X_DMA_H__ */
+--- /dev/null
++++ b/include/asm-m68k/m5485sram.h
+@@ -0,0 +1,12 @@
++#ifndef SYS_SRAM_H
++#define SYS_SRAM_H
++
++
++#define SYS_SRAM_DMA_START        MCF_MBAR + 0x10000
++#define SYS_SRAM_DMA_SIZE         8192
++#define SYS_SRAM_FEC_START        SYS_SRAM_DMA_START + SYS_SRAM_DMA_SIZE
++#define SYS_SRAM_FEC_SIZE         2048
++#define SYS_SRAM_SEC_START        SYS_SRAM_FEC_START + SYS_SRAM_FEC_SIZE
++#define SYS_SRAM_SEC_SIZE         1280
++
++#endif /* SYS_SRAM_H */
diff --git a/target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch b/target/linux/coldfire/patches/046-mcfv4e_kern_to_phys.patch
new file mode 100644 (file)
index 0000000..b111789
--- /dev/null
@@ -0,0 +1,1614 @@
+From 13fc0abf4b5da6f18dea15fd31697655615a79fc Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 12 Mar 2008 15:39:03 -0600
+Subject: [PATCH] Move kernel to physical sdram base address.
+
+Work based on the patches from Systec GMBH.  Also DMA support,
+uBoot integration, FEC fixes, and assorted cleanups.
+
+Uber patch needs to be split up.
+
+LTIBName: mcfv4e-kern-to-phys
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c           |  102 ++-----
+ arch/m68k/coldfire/dma.c              |    7 +-
+ arch/m68k/coldfire/entry.S            |   10 +
+ arch/m68k/coldfire/head.S             |   53 +++-
+ arch/m68k/coldfire/mcf5445x-devices.c |    2 +
+ arch/m68k/coldfire/mcf5445x-pci.c     |    3 +
+ arch/m68k/coldfire/signal.c           |    3 +
+ arch/m68k/configs/m5485evb_defconfig  |   79 +++++-
+ arch/m68k/mm/cache.c                  |    4 +-
+ arch/m68k/mm/cf-mmu.c                 |   28 ++-
+ arch/m68k/mm/memory.c                 |    8 +-
+ drivers/net/fec/fec.c                 |   20 +-
+ include/asm-m68k/bootinfo.h           |   59 +++-
+ include/asm-m68k/cf_cacheflush.h      |  547 +++++++++++----------------------
+ include/asm-m68k/cf_pgalloc.h         |    5 +-
+ include/asm-m68k/cf_pgtable.h         |    2 +-
+ include/asm-m68k/cfcache.h            |    6 +
+ include/asm-m68k/page.h               |    8 +
+ include/asm-m68k/page_offset.h        |   25 +-
+ 19 files changed, 446 insertions(+), 525 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -23,7 +23,6 @@
+ #include <asm/coldfire.h>
+ #include <asm/cfcache.h>
+ #include <asm/cacheflush.h>
+-#include <asm/bootinfo.h>
+ #include <asm/io.h>
+ #include <asm/cfmmu.h>
+ #include <asm/setup.h>
+@@ -36,7 +35,14 @@
+ #include <asm/mcfsim.h>
+-#if 0
++#if defined(CONFIG_M54455)
++#define UBOOT_EXTRA_CLOCKS
++#elif defined(CONFIG_M547X_8X)
++#define UBOOT_PCI
++#endif
++#include <asm/bootinfo.h>
++
++#ifdef CONFIG_M54455
+ #include <asm/mcf5445x_intc.h>
+ #include <asm/mcf5445x_sdramc.h>
+ #include <asm/mcf5445x_fbcs.h>
+@@ -44,10 +50,6 @@
+ #include <asm/mcf5445x_xbs.h>
+ #endif
+-/* JKM -- testing */
+-#include <linux/pfn.h>
+-/* JKM */
+-
+ extern int get_irq_list(struct seq_file *p, void *v);
+ extern char _text, _end;
+ extern char _etext, _edata, __init_begin, __init_end;
+@@ -58,6 +60,10 @@ extern unsigned long availmem;
+ static int irq_enable[NR_IRQS];
+ unsigned long num_pages;
++/* ethernet mac addresses from uboot */
++unsigned char uboot_enet0[6];
++unsigned char uboot_enet1[6];
++
+ void coldfire_sort_memrec(void)
+ {
+       int i, j;
+@@ -87,6 +93,9 @@ void coldfire_sort_memrec(void)
+       }
+ }
++/*
++ * UBoot Handler
++ */
+ int __init uboot_commandline(char *bootargs)
+ {
+       int len = 0, cmd_line_len;
+@@ -101,12 +110,17 @@ int __init uboot_commandline(char *boota
+               return 0;
+       /* Add offset to get post-remapped kernel memory location */
+-      uboot_info.bd_info = (*(u32 *)(uboot_info_stk)) + offset;
++      uboot_info.bdi = (struct bd_info *)((*(u32 *)(uboot_info_stk)) + offset);
+       uboot_info.initrd_start = (*(u32 *)(uboot_info_stk+4)) + offset;
+       uboot_info.initrd_end = (*(u32 *)(uboot_info_stk+8)) + offset;
+       uboot_info.cmd_line_start = (*(u32 *)(uboot_info_stk+12)) + offset;
+       uboot_info.cmd_line_stop = (*(u32 *)(uboot_info_stk+16)) + offset;
++      /* copy over mac addresses */
++      memcpy(uboot_enet0, uboot_info.bdi->bi_enet0addr, 6);
++      memcpy(uboot_enet1, uboot_info.bdi->bi_enet1addr, 6);
++
++      /* copy command line */
+       cmd_line_len = uboot_info.cmd_line_stop - uboot_info.cmd_line_start;
+       if ((cmd_line_len > 0) && (cmd_line_len < CL_SIZE-1))
+               len = (int)strncpy(bootargs, (char *)uboot_info.cmd_line_start,\
+@@ -121,7 +135,7 @@ int __init uboot_commandline(char *boota
+ #if defined(CONFIG_M54455)
+ #define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
+ #elif defined(CONFIG_M547X_8X)
+-#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
+ #endif
+ asmlinkage void __init cf_early_init(void)
+ {
+@@ -142,7 +156,6 @@ asmlinkage void __init cf_early_init(voi
+       MCF_INTC1_IMRL = 0xFFFFFFFF;
+       MCF_INTC1_IMRH = 0xFFFFFFFF;
+ #elif defined(CONFIG_M547X_8X)
+-/* JKM -- ?? */
+       MCF_IMRL = 0xFFFFFFFF;
+       MCF_IMRH = 0xFFFFFFFF;
+ #endif
+@@ -170,7 +183,6 @@ asmlinkage void __init cf_early_init(voi
+                       MCF_XBS_PRS_M6(MCF_XBS_PRI_1) |
+                       MCF_XBS_PRS_M7(MCF_XBS_PRI_7));
+ #endif
+-      
+       m68k_machtype = MACH_CFMMU;
+       m68k_fputype = FPU_CFV4E;
+@@ -181,7 +193,6 @@ asmlinkage void __init cf_early_init(voi
+       m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
+       m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
+-#if defined(CONFIG_M54455)
+       if (!uboot_commandline(m68k_command_line)) {
+ #if defined(CONFIG_BOOTPARAM)
+               strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
+@@ -189,11 +200,6 @@ asmlinkage void __init cf_early_init(voi
+               strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+ #endif
+       }
+-#else
+-/* JKM -- hack until mappings get resolved */
+-      strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+-#endif
+-
+ #if defined(CONFIG_BLK_DEV_INITRD)
+       /* add initrd image */
+@@ -372,75 +378,11 @@ void coldfire_reboot(void)
+ #endif
+ }
+-/* int coldfire_hwclk(int i, struct rtc_time *t)
+-{
+-      printk ("Real time clock needs porting.\n");
+-      return 0;
+-}*/
+-
+ static void coldfire_get_model(char *model)
+ {
+       sprintf(model, "Version 4 ColdFire");
+ }
+-/* JKM -- Why do we need these? */
+-void coldfire_enable_irq(unsigned int vec)
+-{
+-      unsigned long flags;
+-
+-      vec -= 64;
+-
+-      if (((int)vec < 0) || (vec > 63)) {
+-              printk(KERN_WARNING "enable_irq %d failed\n", vec);
+-              return;
+-      }
+-
+-      local_irq_save(flags);
+-      irq_enable[vec]++;
+-#if defined(CONFIG_M54455)
+-      if (vec < 32)
+-              MCF_INTC0_IMRL &= ~(1 << vec);
+-      else
+-              MCF_INTC0_IMRH &= ~(1 << (vec - 32));
+-#elif defined(CONFIG_M547X_8X)
+-      if (vec < 32)
+-              MCF_IMRL &= ~(1 << vec);
+-      else
+-              MCF_IMRH &= ~(1 << (vec - 32));
+-#endif
+-      local_irq_restore(flags);
+-}
+-
+-/* JKM -- Why do we need these? */
+-void coldfire_disable_irq(unsigned int vec)
+-{
+-      unsigned long flags;
+-
+-      vec -= 64;
+-
+-      if (((int)vec < 0) || (vec > 63)) {
+-              printk(KERN_WARNING "disable_irq %d failed\n", vec);
+-              return;
+-      }
+-
+-      local_irq_save(flags);
+-      if (--irq_enable[vec] == 0) {
+-#if defined(CONFIG_M54455)
+-              if (vec < 32)
+-                      MCF_INTC0_IMRL |= (1 << vec);
+-              else
+-                      MCF_INTC0_IMRH |= (1 << (vec - 32));
+-#elif defined(CONFIG_M547X_8X)
+-              if (vec < 32)
+-                      MCF_IMRL |= (1 << vec);
+-              else
+-                      MCF_IMRH |= (1 << (vec - 32));
+-#endif
+-
+-      }
+-      local_irq_restore(flags);
+-}
+-
+ static void __init
+ coldfire_bootmem_alloc(unsigned long memory_start, unsigned long memory_end)
+ {
+--- a/arch/m68k/coldfire/dma.c
++++ b/arch/m68k/coldfire/dma.c
+@@ -516,13 +516,8 @@ dma_init()
+       MCF_DMA_DIPR = 0xFFFFFFFF;
+       MCF_ICR(ISC_DMA) = ILP_DMA;
+-#if 0
+-// JKM
+-      enable_irq( 64 + ISC_DMA );
+-#endif
+-      result =
+-          MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
++      result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
+                       (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
+       if (result != MCD_OK) {
+               printk("Cannot perform DMA initialization\n");
+--- a/arch/m68k/coldfire/entry.S
++++ b/arch/m68k/coldfire/entry.S
+@@ -10,6 +10,8 @@
+  *  Kurt Mahan kmahan@freescale.com
+  *  Copyright Freescale Semiconductor, Inc. 2007
+  *
++ *  Modify irq status in buserr -- (c) Copyright 2008, SYSTEM electronic Gmbh
++ *
+  * Based on:
+  *
+  *  arch/m68knommu/platform/5307/entry.S &
+@@ -77,7 +79,15 @@ sw_usp:
+ .globl inthandler
+ ENTRY(buserr)
++#ifdef CONFIG_COLDFIRE_FOO
++      movew   #0x2700,%sr             /* lock interrupts */
++#endif
+       SAVE_ALL_INT
++#ifdef        CONFIG_COLDFIRE_FOO
++      movew   PT_SR(%sp),%d3          /* get original %sr */
++      oril    #0x2000,%d3             /* set supervisor mode in it */
++      movew   %d3,%sr                 /* recover irq state */
++#endif
+       GET_CURRENT(%d0)
+       movel   %sp,%sp@-               /* stack frame pointer argument */
+       jsr     buserr_c
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -5,6 +5,7 @@
+  *    Matt Waddel Matt.Waddel@freescale.com
+  *    Kurt Mahan kmahan@freescale.com
+  *  Copyright Freescale Semiconductor, Inc. 2007, 2008
++ *  Phys kernel mapping Copyright Daniel Krueger, SYSTEC electornic GmbH 2008
+  *
+  *  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
+@@ -52,7 +53,7 @@
+ #define __FINIT               .previous
+ #endif
+-/* JKM -- REVISE DOCS FOR RIGO */
++/* JKM -- REVISE DOCS FOR RIGO and PHYS MAPPING */
+ /*
+  * Setup ACR mappings to provide the following memory map:
+  *   Data
+@@ -62,10 +63,17 @@
+  *     None currently (mapped via TLBs)
+  */
++#if CONFIG_SDRAM_BASE != PAGE_BASE
+ #if defined(CONFIG_M54455)
++#if 0
+ #define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
++#endif
++#define ACR0_DEFAULT  #0x400FA028   /* ACR0 default value */
+ #define ACR1_DEFAULT  #0xF00FA040   /* ACR1 default value */
++#if 0
+ #define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
++#endif
++#define ACR2_DEFAULT  #0x400FA028   /* ACR2 default value */
+ #define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
+ /* ACR mapping for FPGA (maps 0) */
+ #define ACR0_FPGA     #0x000FA048   /* ACR0 enable FPGA */
+@@ -76,6 +84,16 @@
+ #define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
+ #endif
++#else
++#if defined(CONFIG_M54455)
++#elif defined(CONFIG_M547X_8X)
++#define ACR0_DEFAULT  #0xE000C040   /* ACR0 default value */
++#define ACR1_DEFAULT  #0x000FA008   /* ACR1 default value */
++#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
++#define ACR3_DEFAULT  #0x000FA008   /* ACR3 default value */
++#endif
++#endif
++
+ /* Several macros to make the writing of subroutines easier:
+  * - func_start marks the beginning of the routine which setups the frame
+@@ -153,6 +171,7 @@ func_define        putn,1
+ #endif
+ .endm
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ /*
+       mmu_map  -  creates a new TLB entry
+@@ -222,6 +241,7 @@ func_define        putn,1
+       movew   \temp_data_reg, (MMUOR)
+ 1:    
+ .endm /* mmu_unmap */
++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
+ /* .text */
+ .section ".text.head","ax"
+@@ -235,7 +255,11 @@ ENTRY(_stext)
+       .long   BOOTINFOV_MAGIC
+       .long   0
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ 1:    jmp     __start-(0xc0000000-CONFIG_SDRAM_BASE)
++#else
++1:    jmp     __start
++#endif
+ .equ  kernel_pg_dir,_stext
+ .equ  .,_stext+0x1000
+@@ -244,24 +268,13 @@ ENTRY(_start)
+       jra     __start
+ __INIT
+ ENTRY(__start)
+-
+-/* JKM -- make sure Rigo handles UBOOT */
+ /* Save the location of u-boot info - cmd line, bd_info, etc. */
+       movel   %a7,%a4         /* Don't use %a4 before cf_early_init */
+-/* JKM -- fix to use CONFIG_SDRAM_BASE) */
+-#if defined(CONFIG_M54455)
+-      addl    #0x80000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
+-#elif defined(CONFIG_M547X_8X)
+-      addl    #0xc0000004,%a4 /* 0x80000004= 1 stack push + high mem offset */
+-#endif
++      addl    #0x00000004,%a4 /* offset past top */
++      addl    #(PAGE_OFFSET-CONFIG_SDRAM_BASE),%a4    /* high mem offset */
+-/* JKM -- fix this to work off of CONFIG_SDRAM_BASE */
+ /* Setup initial stack pointer */
+-#if defined(CONFIG_M54455)
+-      movel   #0x40001000,%sp 
+-#elif defined(CONFIG_M547X_8X)
+-      movel   #0x00001000,%sp 
+-#endif
++      movel   #CONFIG_SDRAM_BASE+0x1000,%sp
+ /* Setup usp */
+       subl    %a0,%a0
+@@ -297,16 +310,21 @@ ENTRY(__start)
+ /* setup ACRs */
+       movel   ACR0_DEFAULT, %d0               /* ACR0 (DATA) setup */
+       movec   %d0, %acr0
++      nop
+       movel   ACR1_DEFAULT, %d0               /* ACR1 (DATA) setup */
+       movec   %d0, %acr1
++      nop
+       movel   ACR2_DEFAULT, %d0               /* ACR2 (CODE) setup */
+       movec   %d0, %acr2
++      nop
+       movel   ACR3_DEFAULT, %d0               /* ACR3 (CODE) setup */
+       movec   %d0, %acr3
++      nop
+       /* If you change the memory size to another value make a matching 
+          change in paging_init(cf-mmu.c) to zones_size[]. */
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ #if defined(CONFIG_M54455)
+       /* Map 256MB as code */
+       mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), \
+@@ -511,6 +529,7 @@ ENTRY(__start)
+               MMUTR_SG, MMUDR_SZ1M, MMUDR_DCB, MMUDR_SP, MMUDR_R, \
+               MMUDR_W, 0, 0, %d0
+ #endif
++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
+       /* Turn on MMU */
+       movel   #(MMUCR_EN),%a0
+@@ -531,6 +550,7 @@ ENTRY(__running_high)
+       movel   %a1,%a0@
+       /* Unmap unity mappings */
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ #if defined(CONFIG_M54455)
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
+@@ -544,6 +564,7 @@ ENTRY(__running_high)
+       mmu_unmap (PHYS_OFFSET+2*0x1000000), 0, %d0
+       mmu_unmap (PHYS_OFFSET+3*0x1000000), 0, %d0
+ #endif
++#endif /* CONFIG_SDRAM_BASE != PAGE_OFFSET */
+ /* Setup initial stack pointer */
+       lea     init_task,%a2 
+@@ -574,6 +595,7 @@ func_return        set_context
+  * Map in 0x00000000 -> 0x0fffffff and then do the write.
+  */
+ set_fpga:
++#if 0
+       movew   %sr,%d1
+       movew   #0x2700,%sr
+       movel   ACR0_FPGA, %d0
+@@ -585,6 +607,7 @@ set_fpga:
+       movec   %d0, %acr0
+       nop
+       movew   %d1,%sr
++#endif
+       rts
+ #endif
+--- a/arch/m68k/coldfire/mcf5445x-devices.c
++++ b/arch/m68k/coldfire/mcf5445x-devices.c
+@@ -127,7 +127,9 @@ static inline void mcf5445x_init_pata(vo
+ static int __init mcf5445x_init_devices(void)
+ {
+       printk(KERN_INFO "MCF5445x INIT_DEVICES\n");
++#if 0
+       mcf5445x_init_pata();
++#endif
+       return 0;
+ }
+--- a/arch/m68k/coldfire/mcf5445x-pci.c
++++ b/arch/m68k/coldfire/mcf5445x-pci.c
+@@ -236,6 +236,8 @@ mcf5445x_pci_arb_interrupt(int irq, void
+ int __init
+ init_mcf5445x_pci(void)
+ {
++      return 0;
++#if 0
+       /*
+        * Initialize the PCI core
+        */
+@@ -331,6 +333,7 @@ init_mcf5445x_pci(void)
+       raw_pci_ops = &mcf5445x_pci_ops;
+       return 0;
++#endif
+ }
+ /*
+--- a/arch/m68k/coldfire/signal.c
++++ b/arch/m68k/coldfire/signal.c
+@@ -608,7 +608,10 @@ static inline int rt_setup_ucontext(stru
+ static inline void push_cache(unsigned long vaddr)
+ {
++#if 0 
++// JKM -- need to add into the old cpushl cache stuff
+       cf_cache_push(__pa(vaddr), 8);
++#endif
+ }
+ static inline void __user *
+--- a/arch/m68k/configs/m5485evb_defconfig
++++ b/arch/m68k/configs/m5485evb_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+ # Linux kernel version: 2.6.24
+-# Thu Feb 21 00:19:01 2008
++# Wed Mar  5 16:05:25 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -103,6 +103,7 @@ CONFIG_DEFAULT_IOSCHED="cfq"
+ # CONFIG_SUN3 is not set
+ CONFIG_COLDFIRE=y
+ CONFIG_CFV4E=y
++CONFIG_MCD_DMA=y
+ # CONFIG_AMIGA is not set
+ # CONFIG_ATARI is not set
+ # CONFIG_MAC is not set
+@@ -135,7 +136,7 @@ CONFIG_M5485CFE=y
+ # CONFIG_M5485DFE is not set
+ # CONFIG_M5485EFE is not set
+ # CONFIG_M5485FFE is not set
+-CONFIG_MCFCLK=50000000
++CONFIG_MCFCLK=200000000
+ # CONFIG_MCF_USER_HALT is not set
+ CONFIG_MMU_CFV4E=y
+ CONFIG_SDRAM_BASE=0x00000000
+@@ -279,7 +280,73 @@ CONFIG_FW_LOADER=y
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+ # CONFIG_CONNECTOR is not set
+-# CONFIG_MTD is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++# CONFIG_MTD_CHAR is not set
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++CONFIG_MTD_RAM=y
++CONFIG_MTD_ROM=y
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+@@ -347,6 +414,9 @@ CONFIG_NETDEVICES=y
+ # CONFIG_PHYLIB is not set
+ CONFIG_NET_ETHERNET=y
+ CONFIG_MII=y
++CONFIG_FEC_548x=y
++CONFIG_FEC_548x_AUTO_NEGOTIATION=y
++# CONFIG_FEC_548x_ENABLE_FEC2 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+@@ -530,7 +600,7 @@ CONFIG_FS_MBCACHE=y
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+ CONFIG_MINIX_FS=y
+-# CONFIG_ROMFS_FS is not set
++CONFIG_ROMFS_FS=y
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+ CONFIG_DNOTIFY=y
+@@ -578,6 +648,7 @@ CONFIG_TMPFS=y
+ # CONFIG_BEFS_FS is not set
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
++# CONFIG_JFFS2_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
+ # CONFIG_HPFS_FS is not set
+--- a/arch/m68k/mm/cache.c
++++ b/arch/m68k/mm/cache.c
+@@ -81,7 +81,9 @@ static unsigned long virt_to_phys_slow(u
+ void flush_icache_range(unsigned long address, unsigned long endaddr)
+ {
+ #ifdef CONFIG_COLDFIRE
+-      cf_icache_flush_range(address, endaddr);
++// JKM -- hack until new cpushl stuff is in
++//    cf_icache_flush_range(address, endaddr);
++      flush_icache();
+ #else /* !CONFIG_COLDFIRE */
+       if (CPU_IS_040_OR_060) {
+--- a/arch/m68k/mm/cf-mmu.c
++++ b/arch/m68k/mm/cf-mmu.c
+@@ -35,6 +35,12 @@
+ #include <asm/coldfire.h>
+ #include <asm/tlbflush.h>
++#if PAGE_OFFSET == CONFIG_SDRAM_BASE
++#define       KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE)))
++#else
++#define       KERNRAM(x) (x >= PAGE_OFFSET)
++#endif
++
+ mm_context_t next_mmu_context;
+ unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
+@@ -53,10 +59,16 @@ extern char __init_begin, __init_end;
+ void free_initmem(void)
+ {
++#if 0
+       unsigned long addr;
+       unsigned long start = (unsigned long)&__init_begin;
+       unsigned long end = (unsigned long)&__init_end;
++/* 
++ * JKM -- revisit -- the latest round of vmlinux.lds changes has caused
++ * a little grief with how init areas are handled.  With the new toolchain
++ * release I'll fix this.
++ */
+       printk(KERN_INFO "free_initmem: __init_begin = 0x%lx  __init_end = 0x%lx\n", start, end);
+       addr = (unsigned long)&__init_begin;
+@@ -67,6 +79,7 @@ void free_initmem(void)
+               free_page(addr);
+               totalram_pages++;
+       }
++#endif
+ }
+ /* Coldfire paging_init derived from sun3 */
+@@ -149,8 +162,8 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       mmuar = ( dtlb ) ? regs->mmuar
+                        : regs->pc + (extension_word * sizeof(long));
+-        mm = (!user_mode(regs) && (mmuar >= PAGE_OFFSET)) ? &init_mm
+-                                                        : current->mm;
++        mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm;
++
+         if (!mm) {
+           local_irq_restore(flags);
+           return (-1);
+@@ -167,9 +180,9 @@ int cf_tlb_miss(struct pt_regs *regs, in
+           local_irq_restore(flags);
+           return (-1);
+       }       
+-      
+-      pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
+-                                   : pte_offset_map(pmd, mmuar);
++    
++      pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar)
++                             : pte_offset_map(pmd, mmuar);
+       if (pte_none(*pte) || !pte_present(*pte)) {
+           local_irq_restore(flags);
+           return (-1);                
+@@ -185,7 +198,7 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       
+         set_pte(pte, pte_mkyoung(*pte));
+         asid = mm->context & 0xff;
+-        if (!pte_dirty(*pte) && mmuar<=PAGE_OFFSET)
++        if (!pte_dirty(*pte) && !KERNRAM(mmuar))
+           set_pte(pte, pte_wrprotect(*pte));
+         *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
+@@ -201,7 +214,8 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       else
+           *MMUOR = MMUOR_ITLB | MMUOR_ACC | MMUOR_UAA;
+-      asm ("nop");
++      asm("nop");
++
+       /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
+                 (pte_val(*pte)  & PAGE_MASK));*/
+       local_irq_restore(flags);
+--- a/arch/m68k/mm/memory.c
++++ b/arch/m68k/mm/memory.c
+@@ -206,7 +206,9 @@ static inline void pushcl040(unsigned lo
+ void cache_clear (unsigned long paddr, int len)
+ {
+ #ifdef CONFIG_COLDFIRE
+-      cf_cache_clear(paddr, len);
++// JKM -- revise to use proper caching
++//    cf_cache_clear(paddr, len);
++      flush_bcache();
+ #else
+     if (CPU_IS_040_OR_060) {
+       int tmp;
+@@ -257,7 +259,9 @@ EXPORT_SYMBOL(cache_clear);
+ void cache_push (unsigned long paddr, int len)
+ {
+ #ifdef CONFIG_COLDFIRE
+-      cf_cache_push(paddr, len);
++// JKM -- revise to use proper caching
++//    cf_cache_push(paddr, len);
++      flush_bcache();
+ #else
+     if (CPU_IS_040_OR_060) {
+       int tmp = PAGE_SIZE;
+--- a/drivers/net/fec/fec.c
++++ b/drivers/net/fec/fec.c
+@@ -99,6 +99,9 @@ unsigned char fec_mac_addr_fec0[6] = { 0
+ unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 };  // Default address of FEC1
+ #endif
++extern unsigned char uboot_enet0[];
++extern unsigned char uboot_enet1[];
++
+ #ifndef MODULE
+ int fec_str_to_mac( char *str_mac, unsigned char* addr);
+ int __init fec_mac_setup0 (char *s);
+@@ -175,6 +178,12 @@ printk(KERN_INFO "FEI: index=%d\n", inde
+ printk(KERN_INFO "FEI: txdesc=0x%p  rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc);
+               /* mac addr */
++              if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] ||
++                  uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) {
++                      /* use uboot enet 0 addr */
++                      memcpy(fec_mac_addr_fec0, uboot_enet0, 6);
++              }
++
+               fp->fecpriv_mac_addr = fec_mac_addr_fec0;
+       }
+       else {
+@@ -211,6 +220,11 @@ printk(KERN_INFO "FEI: txdesc=0x%p  rxde
+               fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC1;
+               /* mac addr */
++              if (uboot_enet1[0] || uboot_enet1[1] || uboot_enet1[2] ||
++                  uboot_enet1[3] || uboot_enet1[4] || uboot_enet1[5]) {
++                      /* use uboot enet 1 addr */
++                      memcpy(fec_mac_addr_fec1, uboot_enet1, 6);
++              }
+               fp->fecpriv_mac_addr = fec_mac_addr_fec1;
+ #endif
+       }
+@@ -762,7 +776,6 @@ int fec_tx(struct sk_buff *skb, struct n
+       void *data, *data_aligned;
+       int offset;
+-printk(KERN_INFO "fec_tx\n");
+       data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
+       if (!data)
+@@ -820,7 +833,6 @@ void fec_tx_timeout(struct net_device *d
+       struct fec_priv *fp = netdev_priv(dev);
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-printk(KERN_INFO "fec_tx_timeout\n");
+       spin_lock_irq(&fp->fecpriv_lock);
+       MCD_killDma(fp->fecpriv_fec_tx_channel);
+       for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
+@@ -941,7 +953,6 @@ void fec_interrupt_fec_tx_handler(struct
+ {
+       struct fec_priv *fp = netdev_priv(dev);
+-printk(KERN_INFO "fectxint\n");
+       //Release the socket buffer
+       if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
+       {
+@@ -977,7 +988,6 @@ void fec_interrupt_fec_rx_handler(struct
+       struct fec_priv *fp = netdev_priv(dev);
+       struct sk_buff *skb;
+-printk(KERN_INFO "fecrxint\n");
+       fp->fecpriv_rxflag = 1;
+ /*
+       // Some buffers can be missed
+@@ -1070,7 +1080,6 @@ irqreturn_t fec_interrupt_handler(int ir
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+       unsigned long events;
+-printk(KERN_INFO "fecerrint\n");
+       // Read and clear the events
+       events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
+@@ -1157,7 +1166,6 @@ void fec_interrupt_fec_reinit(unsigned l
+       struct fec_priv *fp = netdev_priv(dev);
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-printk(KERN_INFO "fecreinit\n");
+       // Initialize reception descriptors and start DMA for the reception
+       for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
+       {
+--- a/include/asm-m68k/bootinfo.h
++++ b/include/asm-m68k/bootinfo.h
+@@ -19,11 +19,59 @@
+ **   Redesign of the boot information structure; renamed to bootinfo.h again
+ ** 27/11/96 Geert Uytterhoeven:
+ **   Backwards compatibility with bootinfo interface version 1.0
++** 12/03/08 Kurt Mahan
++**   Copy the bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
++**   into this file.  The original author is Wolfgang Denk, 
++**   DENX Software Engineering, wd@denx.de.
+ */
+ #ifndef _M68K_BOOTINFO_H
+ #define _M68K_BOOTINFO_H
++#ifndef __ASSEMBLY__
++/*
++ * UBoot Support
++ *
++ * bd_info structure from uboot1.3.2/include/asm-m68k/u-boot.h
++ */
++struct bd_info {
++      unsigned long bi_memstart;      /* start of DRAM memory */
++      unsigned long bi_memsize;       /* size  of DRAM memory in bytes */
++      unsigned long bi_flashstart;    /* start of FLASH memory */
++      unsigned long bi_flashsize;     /* size  of FLASH memory */
++      unsigned long bi_flashoffset;   /* reserved area for startup monitor */
++      unsigned long bi_sramstart;     /* start of SRAM memory */
++      unsigned long bi_sramsize;      /* size  of SRAM memory */
++      unsigned long bi_mbar_base;     /* base of internal registers */
++      unsigned long bi_bootflags;     /* boot / reboot flag (for LynxOS) */
++      unsigned long bi_boot_params;   /* where this board expects params */
++      unsigned long bi_ip_addr;       /* IP Address */
++      unsigned char bi_enet0addr[6];  /* Ethernet 0 mac address */
++      unsigned short bi_ethspeed;     /* Ethernet speed in Mbps */
++      unsigned long bi_intfreq;       /* Internal Freq, in MHz */
++      unsigned long bi_busfreq;       /* Bus Freq, in MHz */
++#ifdef UBOOT_PCI
++      unsigned long bi_pcifreq;       /* pci Freq in MHz */
++#endif
++#ifdef UBOOT_EXTRA_CLOCK
++      unsigned long bi_inpfreq;       /* input Freq in MHz */
++      unsigned long bi_vcofreq;       /* vco Freq in MHz */
++      unsigned long bi_flbfreq;       /* Flexbus Freq in MHz */
++#endif
++      unsigned long bi_baudrate;      /* Console Baudrate */
++      unsigned char bi_enet1addr[6];  /* eth1 mac address */
++      unsigned char bi_enet2addr[6];  /* eth2 mac address */
++      unsigned char bi_enet3addr[6];  /* eth3 mac address */
++};
++
++struct uboot_record {
++      struct bd_info *bdi;
++      unsigned long initrd_start;
++      unsigned long initrd_end;
++      unsigned long cmd_line_start;
++      unsigned long cmd_line_stop;
++};
++#endif /* __ASSEMBLY__ */
+     /*
+      *  Bootinfo definitions
+@@ -49,17 +97,6 @@ struct bi_record {
+ #endif /* __ASSEMBLY__ */
+-#ifndef __ASSEMBLY__
+-
+-struct uboot_record {
+-    unsigned long bd_info;
+-    unsigned long initrd_start;
+-    unsigned long initrd_end;
+-    unsigned long cmd_line_start;
+-    unsigned long cmd_line_stop;
+-};
+-
+-#endif /* __ASSEMBLY__ */
+     /*
+--- a/include/asm-m68k/cf_cacheflush.h
++++ b/include/asm-m68k/cf_cacheflush.h
+@@ -1,335 +1,92 @@
+-/*
+- * include/asm-m68k/cf_cacheflush.h - Coldfire Cache
+- *
+- * Based on include/asm-m68k/cacheflush.h
+- *
+- * Coldfire pieces by:
+- *   Kurt Mahan kmahan@freescale.com
+- *
+- * Copyright Freescale Semiconductor, Inc. 2007
+- *
+- * 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.
+- */
+ #ifndef M68K_CF_CACHEFLUSH_H
+ #define M68K_CF_CACHEFLUSH_H
+ #include <asm/cfcache.h>
+-
+ /*
+- * Coldfire Cache Model
+- *
+- * The Coldfire processors use a Harvard architecture cache configured
+- * as four-way set associative.  The cache does not implement bus snooping
+- * so cache coherency with other masters must be maintained in software.
+- *
+- * The cache is managed via the CPUSHL instruction in conjunction with
+- * bits set in the CACR (cache control register).  Currently the code
+- * uses the CPUSHL enhancement which adds the ability to
+- * invalidate/clear/push a cacheline by physical address.  This feature
+- * is designated in the Hardware Configuration Register [D1-CPES].
+- *
+- * CACR Bits:
+- *    DPI[28]         cpushl invalidate disable for d-cache
+- *    IDPI[12]        cpushl invalidate disable for i-cache
+- *    SPA[14]         cpushl search by physical address
+- *    IVO[20]         cpushl invalidate only
+- *
+- * Random Terminology:
+- *  * invalidate = reset the cache line's valid bit
+- *  * push = generate a line-sized store of the data if its contents are marked
+- *         as modifed (the modified flag is cleared after the store)
+- *  * clear = push + invalidate
+- */
+-
+-/**
+- * flush_icache - Flush all of the instruction cache
+- */
+-static inline void flush_icache(void)
+-{
+-      asm volatile("nop\n"
+-                   "moveq%.l  #0,%%d0\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "1:\n"
+-                   "cpushl    %%ic,(%%a0)\n"
+-                   "add%.l    #0x0010,%%a0\n"
+-                   "addq%.l   #1,%%d1\n"
+-                   "cmpi%.l   %0,%%d1\n"
+-                   "bne       1b\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "addq%.l   #1,%%d0\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "cmpi%.l   #4,%%d0\n"
+-                   "bne       1b\n"
+-                   : : "i" (CACHE_SETS)
+-                   : "a0", "d0", "d1");
+-}
+-
+-/**
+- * flush_dcache - Flush all of the data cache
+- */
+-static inline void flush_dcache(void)
+-{
+-      asm volatile("nop\n"
+-                   "moveq%.l  #0,%%d0\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "1:\n"
+-                   "cpushl    %%dc,(%%a0)\n"
+-                   "add%.l    #0x0010,%%a0\n"
+-                   "addq%.l   #1,%%d1\n"
+-                   "cmpi%.l   %0,%%d1\n"
+-                   "bne       1b\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "addq%.l   #1,%%d0\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "cmpi%.l   #4,%%d0\n"
+-                   "bne       1b\n"
+-                   : : "i" (CACHE_SETS)
+-                   : "a0", "d0", "d1");
+-}
+-
+-/**
+- * flush_bcache - Flush all of both caches
++ * Cache handling functions
+  */
+-static inline void flush_bcache(void)
+-{
+-      asm volatile("nop\n"
+-                   "moveq%.l  #0,%%d0\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "add%.l    #0x0010,%%a0\n"
+-                   "addq%.l   #1,%%d1\n"
+-                   "cmpi%.l   %0,%%d1\n"
+-                   "bne       1b\n"
+-                   "moveq%.l  #0,%%d1\n"
+-                   "addq%.l   #1,%%d0\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "cmpi%.l   #4,%%d0\n"
+-                   "bne       1b\n"
+-                   : : "i" (CACHE_SETS)
+-                   : "a0", "d0", "d1");
+-}
+-/**
+- * cf_cache_clear - invalidate cache
+- * @paddr: starting physical address
+- * @len: number of bytes
+- *
+- * Invalidate cache lines starting at paddr for len bytes.
+- * Those lines are not pushed.
+- */
+-static inline void cf_cache_clear(unsigned long paddr, int len)
+-{
+-      /* number of lines */
+-      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
+-      if (len == 0)
+-              return;
+-
+-      /* align on set boundary */
+-      paddr &= 0xfffffff0;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%d0\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "subq%.l   #1,%%d0\n"
+-                   "bne%.b    1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : : "a" (paddr), "r" (len),
+-                       "r" (shadow_cacr),
+-                       "i" (CF_CACR_SPA+CF_CACR_IVO)
+-                   : "a0", "d0");
+-}
+-
+-/**
+- * cf_cache_push - Push dirty cache out with no invalidate
+- * @paddr: starting physical address
+- * @len: number of bytes
+- *
+- * Push the any dirty lines starting at paddr for len bytes.
+- * Those lines are not invalidated.
+- */
+-static inline void cf_cache_push(unsigned long paddr, int len)
+-{
+-      /* number of lines */
+-      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
+-      if (len == 0)
+-              return;
+-
+-      /* align on set boundary */
+-      paddr &= 0xfffffff0;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%d0\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "subq%.l   #1,%%d0\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : : "a" (paddr), "r" (len),
+-                       "r" (shadow_cacr),
+-                       "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI)
+-                   : "a0", "d0");
+-}
++#define flush_icache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%ic,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
++
++#define flush_dcache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%dc,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
++
++#define flush_bcache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%bc,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
+-/**
+- * cf_cache_flush - Push dirty cache out and invalidate
+- * @paddr: starting physical address
+- * @len: number of bytes
+- *
+- * Push the any dirty lines starting at paddr for len bytes and
+- * invalidate those lines.
++/*
++ * invalidate the cache for the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
+  */
+-static inline void cf_cache_flush(unsigned long paddr, int len)
+-{
+-      /* number of lines */
+-      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
+-      if (len == 0)
+-              return;
+-
+-      /* align on set boundary */
+-      paddr &= 0xfffffff0;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%d0\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "subq%.l   #1,%%d0\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : : "a" (paddr), "r" (len),
+-                       "r" (shadow_cacr),
+-                       "i" (CF_CACR_SPA)
+-                   : "a0", "d0");
+-}
+-
+-/**
+- * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate
+- * @vstart - starting virtual address
+- * @vend: ending virtual address
+- *
+- * Push the any dirty data/instr lines starting at paddr for len bytes and
+- * invalidate those lines.
++extern void cache_clear(unsigned long paddr, int len);
++/*
++ * push any dirty cache in the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
+  */
+-static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend)
+-{
+-      int len;
+-
+-      /* align on set boundary */
+-      vstart &= 0xfffffff0;
+-      vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
+-      len = vend - vstart;
+-      if (len == 0)
+-              return;
+-      vstart = __pa(vstart);
+-      vend = vstart + len;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%a1\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "cmpa%.l   %%a0,%%a1\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : /* no return */
+-                   : "a" (vstart), "a" (vend),
+-                     "r" (shadow_cacr),
+-                     "i" (CF_CACR_SPA)
+-                   : "a0", "a1", "d0");
+-}
++extern void cache_push(unsigned long paddr, int len);
+-/**
+- * cf_dcache_flush_range - Push dirty data cache in range out and invalidate
+- * @vstart - starting virtual address
+- * @vend: ending virtual address
+- *
+- * Push the any dirty data lines starting at paddr for len bytes and
+- * invalidate those lines.
++/*
++ * push and invalidate pages in the specified user virtual
++ * memory range.
+  */
+-static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend)
+-{
+-      /* align on set boundary */
+-      vstart &= 0xfffffff0;
+-      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%a1\n"
+-                   "1:\n"
+-                   "cpushl    %%dc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "cmpa%.l   %%a0,%%a1\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : /* no return */
+-                   : "a" (__pa(vstart)), "a" (__pa(vend)),
+-                     "r" (shadow_cacr),
+-                     "i" (CF_CACR_SPA)
+-                   : "a0", "a1", "d0");
+-}
++extern void cache_push_v(unsigned long vaddr, int len);
+-/**
+- * cf_icache_flush_range - Push dirty inst cache in range out and invalidate
+- * @vstart - starting virtual address
+- * @vend: ending virtual address
+- *
+- * Push the any dirty instr lines starting at paddr for len bytes and
+- * invalidate those lines.  This should just be an invalidate since you
+- * shouldn't be able to have dirty instruction cache.
+- */
+-static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend)
+-{
+-      /* align on set boundary */
+-      vstart &= 0xfffffff0;
+-      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
+-
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%a0\n"
+-                   "move%.l   %1,%%a1\n"
+-                   "1:\n"
+-                   "cpushl    %%ic,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "cmpa%.l   %%a0,%%a1\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : /* no return */
+-                   : "a" (__pa(vstart)), "a" (__pa(vend)),
+-                     "r" (shadow_cacr),
+-                     "i" (CF_CACR_SPA)
+-                   : "a0", "a1", "d0");
+-}
++/* This is needed whenever the virtual mapping of the current
++   process changes.  */
+ /**
+  * flush_cache_mm - Flush an mm_struct
+@@ -343,6 +100,8 @@ static inline void flush_cache_mm(struct
+ #define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
++#define flush_cache_all()             flush_bcache()
++
+ /**
+  * flush_cache_range - Flush a cache range
+  * @vma: vma struct
+@@ -356,7 +115,8 @@ static inline void flush_cache_range(str
+       unsigned long start, unsigned long end)
+ {
+       if (vma->vm_mm == current->mm)
+-              cf_cache_flush_range(start, end);
++              flush_bcache();
++//            cf_cache_flush_range(start, end);
+ }
+ /**
+@@ -372,76 +132,113 @@ static inline void flush_cache_page(stru
+       unsigned long vmaddr, unsigned long pfn)
+ {
+       if (vma->vm_mm == current->mm)
+-              cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
++              flush_bcache();
++//            cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
+ }
+-/**
+- * __flush_page_to_ram - Push a page out of the cache
+- * @vaddr: Virtual address at start of page
+- *
+- * Push the page at kernel virtual address *vaddr* and clear
+- * the icache.
+- */
+-static inline void __flush_page_to_ram(void *vaddr)
+-{
+-      asm volatile("nop\n"
+-                   "move%.l   %2,%%d0\n"
+-                   "or%.l     %3,%%d0\n"
+-                   "movec     %%d0,%%cacr\n"
+-                   "move%.l   %0,%%d0\n"
+-                   "and%.l    #0xfffffff0,%%d0\n"
+-                   "move%.l   %%d0,%%a0\n"
+-                   "move%.l   %1,%%d0\n"
+-                   "1:\n"
+-                   "cpushl    %%bc,(%%a0)\n"
+-                   "lea       0x10(%%a0),%%a0\n"
+-                   "subq%.l   #1,%%d0\n"
+-                   "bne.b     1b\n"
+-                   "movec     %2,%%cacr\n"
+-                   : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE),
+-                       "r" (shadow_cacr), "i" (CF_CACR_SPA)
+-                   : "a0", "d0");
++/* Push the page at kernel virtual address and clear the icache */
++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
++extern inline void __flush_page_to_ram(void *address)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++  unsigned long addr = (unsigned long) address;
++
++  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
++
++  start_set = addr & _ICACHE_SET_MASK;
++  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3)) {
++      asm volatile("cpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
++    }
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;    
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
++    asm volatile("cpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
++  }
++}
++
++/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */
++#define flush_dcache_page(page)                       \
++      __flush_page_to_ram((void *) page_address(page))
++#define flush_icache_page(vma,pg)             \
++      __flush_page_to_ram((void *) page_address(pg))
++#define flush_icache_user_range(adr,len)      do { } while (0)
++/* NL */
++#define flush_icache_user_page(vma,page,addr,len)     do { } while (0)
++
++/* Push n pages at kernel virtual address and clear the icache */
++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
++extern inline void flush_icache_range (unsigned long address,
++                                     unsigned long endaddr)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++
++  start_set = address & _ICACHE_SET_MASK;
++  end_set = endaddr & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3)) {
++      asm volatile("cpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
++    }
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;    
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
++    asm volatile("cpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
++  }
+ }
+-/*
+- * Various defines for the kernel.
+- */
+-
+-extern void cache_clear(unsigned long paddr, int len);
+-extern void cache_push(unsigned long paddr, int len);
+-extern void flush_icache_range(unsigned long address, unsigned long endaddr);
+-
+-#define flush_cache_all()                     flush_bcache()
+-#define flush_cache_vmap(start, end)          flush_bcache()
+-#define flush_cache_vunmap(start, end)                flush_bcache()
+-
+-#define flush_dcache_range(vstart, vend)      cf_dcache_flush_range(vstart, vend)
+-#define flush_dcache_page(page)                       __flush_page_to_ram(page_address(page))
+-#define flush_dcache_mmap_lock(mapping)               do { } while (0)
+-#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
+-
+-#define flush_icache_page(vma, page)          __flush_page_to_ram(page_address(page))
+-
+-/**
+- * copy_to_user_page - Copy memory to user page
+- */
+ static inline void copy_to_user_page(struct vm_area_struct *vma,
+                                    struct page *page, unsigned long vaddr,
+                                    void *dst, void *src, int len)
+ {
+       memcpy(dst, src, len);
+-      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
++      flush_icache_user_page(vma, page, vaddr, len);
+ }
+-
+-/**
+- * copy_from_user_page - Copy memory from user page
+- */
+ static inline void copy_from_user_page(struct vm_area_struct *vma,
+                                      struct page *page, unsigned long vaddr,
+                                      void *dst, void *src, int len)
+ {
+-      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
+       memcpy(dst, src, len);
+ }
++#define flush_cache_vmap(start, end)          flush_cache_all()
++#define flush_cache_vunmap(start, end)                flush_cache_all()
++#define flush_dcache_mmap_lock(mapping)               do { } while (0)
++#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++
+ #endif /* M68K_CF_CACHEFLUSH_H */
+--- a/include/asm-m68k/cf_pgalloc.h
++++ b/include/asm-m68k/cf_pgalloc.h
+@@ -1,13 +1,9 @@
+ #ifndef M68K_CF_PGALLOC_H
+ #define M68K_CF_PGALLOC_H
+-/* JKM -- added -- needed? */
+-#include <linux/highmem.h>
+-
+ #include <asm/coldfire.h>
+ #include <asm/page.h>
+ #include <asm/cf_tlbflush.h>
+-/* JKM -- added -- needed? */
+ #include <asm/cf_cacheflush.h>
+ extern inline void pte_free_kernel(pte_t *pte)
+@@ -41,6 +37,7 @@ extern inline pmd_t *pmd_alloc_kernel(pg
+ #define pmd_populate(mm, pmd, page) (pmd_val(*pmd) = \
+       (unsigned long)(page_address(page)))
++
+ #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
+ static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page)
+--- a/include/asm-m68k/cf_pgtable.h
++++ b/include/asm-m68k/cf_pgtable.h
+@@ -341,7 +341,7 @@ static inline pte_t pgoff_to_pte(unsigne
+ #define __pte_to_swp_entry(pte)       ((swp_entry_t) { pte_val(pte) })
+ #define __swp_entry_to_pte(x) (__pte((x).val))
+-#define pmd_page(pmd)         virt_to_page(__pmd_page(pmd))
++#define pmd_page(pmd)         (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
+ #define pte_offset_map(pmdp, address) ((pte_t *)__pmd_page(*pmdp) +   \
+                                      __pte_offset(address))
+--- a/include/asm-m68k/cfcache.h
++++ b/include/asm-m68k/cfcache.h
+@@ -87,6 +87,12 @@
+ #define CACHE_SETS 0x0200             /* 512 sets */
+ #define CACHE_WAYS 0x0004             /* 4 way */
++/* in for the old cpushl caching code */
++#define _DCACHE_SET_MASK ((DCACHE_SIZE/64-1)<<CACHE_WAYS)
++#define _ICACHE_SET_MASK ((ICACHE_SIZE/64-1)<<CACHE_WAYS)
++#define LAST_DCACHE_ADDR _DCACHE_SET_MASK
++#define LAST_ICACHE_ADDR _ICACHE_SET_MASK
++
+ #define CACHE_DISABLE_MODE    (CF_CACR_DCINVA+        \
+                                CF_CACR_BCINVA+        \
+                                CF_CACR_ICINVA)
+--- a/include/asm-m68k/page.h
++++ b/include/asm-m68k/page.h
+@@ -123,13 +123,21 @@ extern unsigned long m68k_memoffset;
+ #if defined(CONFIG_COLDFIRE)
+ static inline unsigned long ___pa(void *vaddr)
+ {
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+       return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
++#else
++      return (unsigned long)vaddr;
++#endif
+ }
+ #define __pa(vaddr)   ___pa((void *)(vaddr))
+ static inline void *__va(unsigned long paddr)
+ {
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+       return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
++#else
++      return (void *)paddr;
++#endif
+ }
+ #else
+--- a/include/asm-m68k/page_offset.h
++++ b/include/asm-m68k/page_offset.h
+@@ -1,16 +1,15 @@
++/*
++ * Page and physical memory maps.
++ */
++#if defined(CONFIG_SUN3)
++#define PAGE_OFFSET_RAW               0x0E000000
++
++#elif defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)
++#define       PHYS_OFFSET             CONFIG_SDRAM_BASE
++#define PAGE_OFFSET_RAW               (PHYS_OFFSET)
++/* #define PAGE_OFFSET_RAW            0xC0000000 */
+-/* This handles the memory map.. */
+-#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
++#else
++/* default */
+ #define PAGE_OFFSET_RAW               0x00000000
+-#elif defined(CONFIG_SUN3)
+-#define PAGE_OFFSET_RAW               0x0E000000
+-#else /* CONFIG_COLDFIRE */
+-#if defined(CONFIG_M54455)
+-#define PAGE_OFFSET_RAW               0xC0000000
+-#define       PHYS_OFFSET             0x40000000
+-#elif defined(CONFIG_M547X_8X)
+-#define PAGE_OFFSET_RAW               0xC0000000
+-#define       PHYS_OFFSET             0x00000000
+ #endif
+-#endif
+-
diff --git a/target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch b/target/linux/coldfire/patches/047-m547x_8x_fec_cleanup.patch
new file mode 100644 (file)
index 0000000..9c36804
--- /dev/null
@@ -0,0 +1,1223 @@
+From 5bac5f471fb1124c51a5811757c54174f6224e7e Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 12 Mar 2008 17:13:29 -0600
+Subject: [PATCH] Clean up FEC DMA driver.
+
+LTIBName: m547x-8x-fec-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/net/fec/fec.c |  611 +++++++++++++++++++++---------------------------
+ 1 files changed, 267 insertions(+), 344 deletions(-)
+
+--- a/drivers/net/fec/fec.c
++++ b/drivers/net/fec/fec.c
+@@ -4,7 +4,6 @@
+  *
+  * Code crunched to get it to work on 2.6.24 -- FEC cleanup coming
+  * soon -- Kurt Mahan
+- *
+  */
+ #include <linux/module.h>
+ #include <linux/kernel.h>
+@@ -44,42 +43,40 @@
+ #undef        FEC_2
+ #endif
+-#define VERSION "0.13"
++#define VERSION "0.20"
+ MODULE_DESCRIPTION( "DMA Fast Ethernet Controller driver ver " VERSION);
+-// Private structure
++/* fec private */
+ struct fec_priv {
+       struct net_device *netdev;              /* owning net device */
+-      void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; //Array of transmission buffers
+-      MCD_bufDescFec *fecpriv_txdesc; // Array of transmission descriptors
+-      volatile unsigned int fecpriv_current_tx;       // Inex of the transmission descriptor that is used by DMA
+-      volatile unsigned int fecpriv_next_tx;  // Inex of the transmission descriptor that can be used for new data
+-      unsigned int fecpriv_current_rx;        // Index of the reception descriptor that is used by DMA
+-      MCD_bufDescFec *fecpriv_rxdesc;         // Array of reception descriptors
+-//    unsigned char *fecpriv_rxbuf;           // Address of reception buffers
+-      struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; // Array of reception skb structure pointers
+-      unsigned int fecpriv_initiator_rx;      // Reception DMA initiator
+-      unsigned int fecpriv_initiator_tx;      // Transmission DMA initiator
+-      int fecpriv_fec_rx_channel;     // DMA reception channel
+-      int fecpriv_fec_tx_channel;     // DMA transmission channel
+-      int fecpriv_rx_requestor;       // DMA reception requestor
+-      int fecpriv_tx_requestor;       // DMA transmission requestor
+-      void *fecpriv_interrupt_fec_rx_handler; // DMA reception handler
+-      void *fecpriv_interrupt_fec_tx_handler; // DMA transmission handler
+-      unsigned char *fecpriv_mac_addr;        // Private copy of FEC address
+-      struct net_device_stats fecpriv_stat;   // Pointer to the statistical information
++      void* fecpriv_txbuf[FEC_TX_BUF_NUMBER]; /* tx buffer ptrs */
++      MCD_bufDescFec *fecpriv_txdesc;         /* tx descriptor ptrs */
++      volatile unsigned int fecpriv_current_tx; /* current tx desc index */
++      volatile unsigned int fecpriv_next_tx;  /* next tx desc index */
++      unsigned int fecpriv_current_rx;        /* current rx desc index */
++      MCD_bufDescFec *fecpriv_rxdesc;         /* rx descriptor ptrs */
++      struct sk_buff *askb_rx[FEC_RX_BUF_NUMBER]; /* rx SKB ptrs */
++      unsigned int fecpriv_initiator_rx;      /* rx dma initiator */
++      unsigned int fecpriv_initiator_tx;      /* tx dma initiator */
++      int fecpriv_fec_rx_channel;             /* rx dma channel */
++      int fecpriv_fec_tx_channel;             /* tx dma channel */
++      int fecpriv_rx_requestor;               /* rx dma requestor */
++      int fecpriv_tx_requestor;               /* tx dma requestor */
++      void *fecpriv_interrupt_fec_rx_handler; /* dma rx handler */
++      void *fecpriv_interrupt_fec_tx_handler; /* dma tx handler */
++      unsigned char *fecpriv_mac_addr;        /* private fec mac addr */
++      struct net_device_stats fecpriv_stat;   /* stats ptr */
+       spinlock_t fecpriv_lock;
+       int fecpriv_rxflag;
+       struct tasklet_struct fecpriv_tasklet_reinit;
+-      int index;
++      int index;                              /* fec hw number */
+ };
+ struct net_device *fec_dev[FEC_MAX_PORTS];
+-// FEC functions
++/* FEC functions */
+ int __init fec_init(void);
+ struct net_device_stats *fec_get_stat(struct net_device *dev);
+-
+ int fec_open(struct net_device *dev);
+ int fec_close(struct net_device *nd);
+ int fec_tx(struct sk_buff *skb, struct net_device *dev);
+@@ -93,10 +90,12 @@ void fec_interrupt_fec_tx_handler_fec0(v
+ void fec_interrupt_fec_rx_handler_fec0(void);
+ void fec_interrupt_fec_reinit(unsigned long data);
+-unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 };  // Default address of FEC0
++/* default fec0 address */
++unsigned char fec_mac_addr_fec0[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x50 };
+ #ifdef   FEC_2
+-unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 };  // Default address of FEC1
++/* default fec1 address */
++unsigned char fec_mac_addr_fec1[6] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x51 };
+ #endif
+ extern unsigned char uboot_enet0[];
+@@ -111,17 +110,18 @@ int __init fec_mac_setup0 (char *s);
+ #ifdef   FEC_2
+ void fec_interrupt_fec_tx_handler_fec1(void);
+ void fec_interrupt_fec_rx_handler_fec1(void);
++#endif
+ #ifndef MODULE
+ int __init fec_mac_setup1 (char *s);
+ #endif
+-#endif
+ int fec_read_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int *data);
+ int fec_write_mii(unsigned int base_addr, unsigned int pa, unsigned int ra, unsigned int data);
+ module_init(fec_init);
+ /* module_exit(fec_cleanup); */
++
+ __setup("mac0=", fec_mac_setup0);
+ #ifdef   FEC_2
+@@ -140,7 +140,6 @@ int fec_enet_init(struct net_device *dev
+       fp->index = index;
+       fp->netdev = dev;
+       fec_dev[ index ] = dev;
+-printk(KERN_INFO "FEI: index=%d\n", index);
+       if (index == 0) {
+               /* disable fec0 */
+@@ -175,8 +174,6 @@ printk(KERN_INFO "FEI: index=%d\n", inde
+               /* rx descriptors */
+               fp->fecpriv_rxdesc = (void*)FEC_RX_DESC_FEC0;
+-printk(KERN_INFO "FEI: txdesc=0x%p  rxdesc=0x%p\n", fp->fecpriv_txdesc, fp->fecpriv_rxdesc);
+-
+               /* mac addr */
+               if (uboot_enet0[0] || uboot_enet0[1] || uboot_enet0[2] ||
+                   uboot_enet0[3] || uboot_enet0[4] || uboot_enet0[5]) {
+@@ -229,8 +226,6 @@ printk(KERN_INFO "FEI: txdesc=0x%p  rxde
+ #endif
+       }
+-printk(KERN_INFO "FEI: index=%d base_addr=0x%lx\n", index, dev->base_addr);
+-
+       /* clear MIB */
+       memset((void *) (dev->base_addr + 0x200), 0, FEC_MIB_LEN);
+@@ -288,8 +283,7 @@ int __init fec_init(void)
+       int err;
+       DECLARE_MAC_BUF(mac);
+-      printk(KERN_INFO "FEC ENET (DMA) Version .00\n");
+-
++      printk(KERN_INFO "FEC ENET (DMA) Version %s\n", VERSION);
+       for (i = 0; i < FEC_MAX_PORTS; i++) {
+               dev = alloc_etherdev(sizeof(struct fec_priv));
+@@ -333,7 +327,6 @@ void fec_stop(struct net_device *dev)
+ *
+ * RETURNS: If no error occurs, this function returns zero.
+ *************************************************************************/
+-
+ int fec_open(struct net_device *dev)
+ {
+       struct fec_priv *fp = netdev_priv(dev);
+@@ -343,13 +336,10 @@ int fec_open(struct net_device *dev)
+       int channel;
+       int error_code = -EBUSY;
+-printk(KERN_INFO "FECOPEN: index=%d\n", fp->index);
+-
+-      //Receive the DMA channels
++      /* Receive the DMA channels */
+       channel = dma_set_channel_fec(fp->fecpriv_rx_requestor);
+-      if (channel == -1)
+-      {
++      if (channel == -1) {
+               printk("Dma channel cannot be reserved\n");
+               goto ERRORS;
+       }
+@@ -360,60 +350,54 @@ printk(KERN_INFO "FECOPEN: index=%d\n", 
+       channel = dma_set_channel_fec(fp->fecpriv_tx_requestor);
+-      if (channel == -1)
+-      {
++      if (channel == -1) {
+               printk("Dma channel cannot be reserved\n");
+               goto ERRORS;
+       }
+-printk(KERN_INFO "FECOPEN2\n");
+       fp->fecpriv_fec_tx_channel = channel;
+       dma_connect(channel, (int) fp->fecpriv_interrupt_fec_tx_handler);
+-      // init tasklet for controller reinitialization
++      /* init tasklet for controller reinitialization */
+       tasklet_init(&fp->fecpriv_tasklet_reinit, fec_interrupt_fec_reinit, (unsigned long) dev);
+-printk(KERN_INFO "FECOPEN3\n");
+-      // Reset FIFOs
++      /* Reset FIFOs */
+       FEC_FECFRST(base_addr) |= FEC_SW_RST | FEC_RST_CTL;
+       FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
+-      // Reset and disable FEC
++      /* Reset and disable FEC */
+       FEC_ECR(base_addr) = FEC_ECR_RESET;
+-      // Wait
+       udelay(10);
+-      // Clear all events
++      /* Clear all events */
+       FEC_EIR(base_addr) = FEC_EIR_CLEAR;
+-      // Reset FIFO status
++      /* Reset FIFO status */
+       FEC_FECTFSR(base_addr) = FEC_FECTFSR_MSK;
+       FEC_FECRFSR(base_addr) = FEC_FECRFSR_MSK;
+-#if 0
+-/* JKM -- move into HW init */
+-      // Copy the default address to the device structure
+-      memcpy(dev->dev_addr, fp->fecpriv_mac_addr, ETH_ALEN);
+-#endif
++      /* Set the default address */
++      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) |
++                            (fp->fecpriv_mac_addr[1] << 16) |
++                            (fp->fecpriv_mac_addr[2] << 8) |
++                            fp->fecpriv_mac_addr[3];
++      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) |
++                            (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
+-      // Set the default address
+-      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
+-      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
+-
+-      // Reset the group address descriptor
++      /* Reset the group address descriptor */
+       FEC_GALR(base_addr) = 0x00000000;
+       FEC_GAUR(base_addr) = 0x00000000;
+-      // Reset the individual address descriptor
++      /* Reset the individual address descriptor */
+       FEC_IALR(base_addr) = 0x00000000;
+       FEC_IAUR(base_addr) = 0x00000000;
+-      // Set the receive control register
++      /* Set the receive control register */
+       FEC_RCR(base_addr) = FEC_RCR_MAX_FRM_SIZE | FEC_RCR_MII;
+-      // Set the receive FIFO control register
++      /* Set the receive FIFO control register */
+ //    FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR | FEC_FECRFCR_MSK;
+       FEC_FECRFCR(base_addr) = FEC_FECRFCR_FRM | FEC_FECRFCR_GR
+                              | (FEC_FECRFCR_MSK     // disable all but ...
+@@ -422,10 +406,10 @@ printk(KERN_INFO "FECOPEN3\n");
+ //                                & ~FEC_FECRFCR_UF   // enable FIFO underflow
+                              );
+-      //Set the receive FIFO alarm register
++      /* Set the receive FIFO alarm register */
+       FEC_FECRFAR(base_addr) = FEC_FECRFAR_ALARM;
+-      // Set the transmit FIFO control register
++      /* Set the transmit FIFO control register */
+ //    FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR | FEC_FECTFCR_MSK;
+       FEC_FECTFCR(base_addr) = FEC_FECTFCR_FRM | FEC_FECTFCR_GR
+                              | (FEC_FECTFCR_MSK     // disable all but ...
+@@ -434,16 +418,16 @@ printk(KERN_INFO "FECOPEN3\n");
+ //                                & ~FEC_FECTFCR_UF   // enable FIFO underflow
+                                 & ~FEC_FECTFCR_OF); // enable FIFO overflow
+-      //Set the transmit FIFO alarm register
++      /* Set the transmit FIFO alarm register */
+       FEC_FECTFAR(base_addr) = FEC_FECTFAR_ALARM;
+-      // Set the Tx FIFO watermark
++      /* Set the Tx FIFO watermark */
+       FEC_FECTFWR(base_addr) = FEC_FECTFWR_XWMRK;
+-      // Enable the transmitter to append the CRC
++      /* Enable the transmitter to append the CRC */
+       FEC_CTCWR(base_addr) = FEC_CTCWR_TFCW_CRC;
+-      // Enable the ethernet interrupts
++      /* Enable the ethernet interrupts */
+ //    FEC_EIMR(base_addr) = FEC_EIMR_MASK;
+       FEC_EIMR(base_addr) = FEC_EIMR_DISABLE
+                             | FEC_EIR_LC
+@@ -453,9 +437,16 @@ printk(KERN_INFO "FECOPEN3\n");
+                             | FEC_EIR_XFERR
+                             | FEC_EIR_RFERR
+                             ;
+-printk(KERN_INFO "FECOPEN4\n");
+-#ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
++/*
++ * JKM --
++ *
++ * There's a problem with the PHY initialization code -- 
++ * for now assume uboot left it in an initialized state.
++ */
++// printk(KERN_INFO "FECOPEN: starting auto-negotiation\n");
++// #ifdef   CONFIG_FEC_548x_AUTO_NEGOTIATION
++#if 0
+       if ((error_code = init_transceiver(base_addr, &fduplex)) != 0)
+       {
+               printk("Initialization of the transceiver is failed\n");
+@@ -464,25 +455,24 @@ printk(KERN_INFO "FECOPEN4\n");
+ #else
+       fduplex = 1;
+ #endif
+-printk(KERN_INFO "FECOPEN5\n");
++// printk(KERN_INFO "FECOPEN: done with auto-negotiation\n");
+       if (fduplex)
+-              // Enable the full duplex mode
++              /* Enable the full duplex mode */
+               FEC_TCR(base_addr) = FEC_TCR_FDEN | FEC_TCR_HBC;
+       else
+-              // Disable reception of frames while transmitting
++              /* Disable reception of frames while transmitting */
+               FEC_RCR(base_addr) |= FEC_RCR_DRT;
+-      // Enable MIB
++      /* Enable MIB */
+       FEC_MIBC(base_addr) = FEC_MIBC_ENABLE;
+-      // Enable FEC
++      /* Enable FEC */
+       FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
+-      // Initialize transmission descriptors and start DMA for the transmission
++      /* Initialize tx descriptors and start DMA for the transmission */
+       for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
+               fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
+-printk(KERN_INFO "FECOPEN6\n");
+       fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
+@@ -494,31 +484,27 @@ printk(KERN_INFO "FECOPEN6\n");
+                    FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
+                    MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
+-      // Initialize reception descriptors and start DMA for the reception
+-      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
+-      {
++      /* Initialize rx descriptors and start DMA for the reception */
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
+               fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_DMA);
+-              if (!fp->askb_rx[i])
+-              {
+-              fp->fecpriv_rxdesc[i].dataPointer = 0;
+-              fp->fecpriv_rxdesc[i].statCtrl = 0;
+-              fp->fecpriv_rxdesc[i].length = 0;
++              if (!fp->askb_rx[i]) {
++                      fp->fecpriv_rxdesc[i].dataPointer = 0;
++                      fp->fecpriv_rxdesc[i].statCtrl = 0;
++                      fp->fecpriv_rxdesc[i].length = 0;
+               }
+-              else
+-              {
+-                  skb_reserve(fp->askb_rx[i], 16);
++              else {
++                      skb_reserve(fp->askb_rx[i], 16);
+                       fp->askb_rx[i]->dev = dev;
+-              fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
+-              fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
+-              fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
+-          }
++                      fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
++                      fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
++                      fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
++              }
+       }
+-printk(KERN_INFO "FECOPEN7\n");
+       fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
+       fp->fecpriv_current_rx = 0;
+-      // flush entire data cache before restarting the DMA
++      /* flush entire data cache before restarting the DMA */
+ #if 0
+ /* JKM -- currently running with cache turned off */
+       DcacheFlushInvalidate();
+@@ -531,31 +517,24 @@ printk(KERN_INFO "FECOPEN7\n");
+                    MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
+       netif_start_queue(dev);
+-
+-//    MOD_INC_USE_COUNT;
+-printk(KERN_INFO "FECOPEN: finished\n");
+-
+       return 0;
+ ERRORS:
+-      // Remove the channels and return with the error code
+-      if (fp->fecpriv_fec_rx_channel != -1)
+-      {
++      /* Remove the channels and return with the error code */
++      if (fp->fecpriv_fec_rx_channel != -1) {
+               dma_disconnect(fp->fecpriv_fec_rx_channel);
+               dma_remove_channel_by_number(fp->fecpriv_fec_rx_channel);
+               fp->fecpriv_fec_rx_channel = -1;
+       }
+-      if (fp->fecpriv_fec_tx_channel != -1)
+-      {
++      if (fp->fecpriv_fec_tx_channel != -1) {
+               dma_disconnect(fp->fecpriv_fec_tx_channel);
+               dma_remove_channel_by_number(fp->fecpriv_fec_tx_channel);
+               fp->fecpriv_fec_tx_channel = -1;
+       }
+       return error_code;
+-
+ }
+ /************************************************************************
+@@ -568,31 +547,26 @@ ERRORS:
+ *************************************************************************/
+ int fec_close(struct net_device *dev)
+ {
+-      //Receive the pointer to the private structure
+       struct fec_priv *fp = netdev_priv(dev);
+-
+-      // Receive the base address
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-
+       unsigned long time;
+-
+       int i;
+       netif_stop_queue(dev);
+-      // Perform the graceful stop
++      /* Perform the graceful stop */
+       FEC_TCR(base_addr) |= FEC_TCR_GTS;
+       time = jiffies;
+-      // Wait for the graceful stop
++      /* Wait for the graceful stop */
+       while (!(FEC_EIR(base_addr) & FEC_EIR_GRA) && jiffies - time < FEC_GR_TIMEOUT * HZ)
+               schedule();
+-      // Disable FEC
++      /* Disable FEC */
+       FEC_ECR(base_addr) = FEC_ECR_DISABLE;
+-      // Reset the DMA channels
++      /* Reset the DMA channels */
+       spin_lock_irq(&fp->fecpriv_lock);
+       MCD_killDma(fp->fecpriv_fec_tx_channel);
+       spin_unlock_irq(&fp->fecpriv_lock);
+@@ -600,12 +574,12 @@ int fec_close(struct net_device *dev)
+       dma_disconnect(fp->fecpriv_fec_tx_channel);
+       fp->fecpriv_fec_tx_channel = -1;
+-      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
+-              if (fp->fecpriv_txbuf[i])
+-              {
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
++              if (fp->fecpriv_txbuf[i]) {
+                       kfree(fp->fecpriv_txbuf[i]);
+                       fp->fecpriv_txbuf[i] = NULL;
+               }
++      }
+       spin_lock_irq(&fp->fecpriv_lock);
+       MCD_killDma(fp->fecpriv_fec_rx_channel);
+@@ -615,15 +589,12 @@ int fec_close(struct net_device *dev)
+       dma_disconnect(fp->fecpriv_fec_rx_channel);
+       fp->fecpriv_fec_rx_channel = -1;
+-      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
+-      {
+-              if (fp->askb_rx[i])
+-              {
+-                  kfree_skb(fp->askb_rx[i]);
+-                  fp->askb_rx[i] = NULL;
+-          }
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
++              if (fp->askb_rx[i]) {
++                      kfree_skb(fp->askb_rx[i]);
++                      fp->askb_rx[i] = NULL;
++              }
+       }
+-//    MOD_DEC_USE_COUNT;
+       return 0;
+ }
+@@ -635,14 +606,10 @@ int fec_close(struct net_device *dev)
+ *************************************************************************/
+ struct net_device_stats * fec_get_stat(struct net_device *dev)
+ {
+-
+-      //Receive the pointer to the private structure
+       struct fec_priv *fp = netdev_priv(dev);
+-
+-      // Receive the base address
+       unsigned long base_addr = dev->base_addr;
+-      // Receive the statistical information
++      /* Receive the statistical information */
+       fp->fecpriv_stat.rx_packets = FECSTAT_RMON_R_PACKETS(base_addr);
+       fp->fecpriv_stat.tx_packets = FECSTAT_RMON_T_PACKETS(base_addr);
+       fp->fecpriv_stat.rx_bytes = FECSTAT_RMON_R_OCTETS(base_addr);
+@@ -651,7 +618,10 @@ struct net_device_stats * fec_get_stat(s
+       fp->fecpriv_stat.multicast = FECSTAT_RMON_R_MC_PKT(base_addr);
+       fp->fecpriv_stat.collisions = FECSTAT_RMON_T_COL(base_addr);
+-      fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) + FECSTAT_RMON_R_OVERSIZE(base_addr) + FECSTAT_RMON_R_FRAG(base_addr) + FECSTAT_RMON_R_JAB(base_addr);
++      fp->fecpriv_stat.rx_length_errors = FECSTAT_RMON_R_UNDERSIZE(base_addr) +
++              FECSTAT_RMON_R_OVERSIZE(base_addr) +
++              FECSTAT_RMON_R_FRAG(base_addr) +
++              FECSTAT_RMON_R_JAB(base_addr);
+       fp->fecpriv_stat.rx_crc_errors = FECSTAT_IEEE_R_CRC(base_addr);
+       fp->fecpriv_stat.rx_frame_errors = FECSTAT_IEEE_R_ALIGN(base_addr);
+       fp->fecpriv_stat.rx_over_errors = FECSTAT_IEEE_R_MACERR(base_addr);
+@@ -660,9 +630,18 @@ struct net_device_stats * fec_get_stat(s
+       fp->fecpriv_stat.tx_fifo_errors = FECSTAT_IEEE_T_MACERR(base_addr);
+       fp->fecpriv_stat.tx_window_errors = FECSTAT_IEEE_T_LCOL(base_addr);
+-      // I hope that one frame doesn't have more than one error
+-      fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors + fp->fecpriv_stat.rx_crc_errors + fp->fecpriv_stat.rx_frame_errors + fp->fecpriv_stat.rx_over_errors + fp->fecpriv_stat.rx_dropped;
+-      fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors + fp->fecpriv_stat.tx_fifo_errors + fp->fecpriv_stat.tx_window_errors + fp->fecpriv_stat.tx_aborted_errors + fp->fecpriv_stat.tx_heartbeat_errors + fp->fecpriv_stat.tx_dropped;
++      /* I hope that one frame doesn't have more than one error */
++      fp->fecpriv_stat.rx_errors = fp->fecpriv_stat.rx_length_errors +
++              fp->fecpriv_stat.rx_crc_errors +
++              fp->fecpriv_stat.rx_frame_errors +
++              fp->fecpriv_stat.rx_over_errors +
++              fp->fecpriv_stat.rx_dropped;
++      fp->fecpriv_stat.tx_errors = fp->fecpriv_stat.tx_carrier_errors +
++              fp->fecpriv_stat.tx_fifo_errors +
++              fp->fecpriv_stat.tx_window_errors +
++              fp->fecpriv_stat.tx_aborted_errors +
++              fp->fecpriv_stat.tx_heartbeat_errors +
++              fp->fecpriv_stat.tx_dropped;
+       return &fp->fecpriv_stat;
+ }
+@@ -674,59 +653,47 @@ struct net_device_stats * fec_get_stat(s
+ *************************************************************************/
+ void fec_set_multicast_list(struct net_device *dev)
+ {
+-      // Pointer to the address list
+       struct dev_mc_list *dmi;
+-
+       unsigned int crc, data;
+       int i, j, k;
+-
+-      // Receive the base address
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-      if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI)
+-      {
+-              // Allow all incoming frames
++      if (dev->flags & IFF_PROMISC || dev->flags & IFF_ALLMULTI) {
++              /* Allow all incoming frames */
+               FEC_GALR(base_addr) = 0xFFFFFFFF;
+               FEC_GAUR(base_addr) = 0xFFFFFFFF;
+               return;
+       }
+-      // Reset the group address register
++
++      /* Reset the group address register */
+       FEC_GALR(base_addr) = 0x00000000;
+       FEC_GAUR(base_addr) = 0x00000000;
+-      // Process all addresses
+-      for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next)
+-      {
+-              // Processing must be only for the group addresses
++      /* Process all addresses */
++      for (i = 0, dmi = dev->mc_list; i < dev->mc_count; i++, dmi = dmi->next) {
++              /* Processing must be only for the group addresses */
+               if (!(dmi->dmi_addr[0] & 1))
+                       continue;
+-              // Calculate crc value for the current address
++              /* Calculate crc value for the current address */
+               crc = 0xFFFFFFFF;
+-              for (j = 0; j < dmi->dmi_addrlen; j++)
+-              {
+-
+-                      for (k = 0, data = dmi->dmi_addr[j]; k < 8;  k++, data >>= 1)
+-                      {
++              for (j = 0; j < dmi->dmi_addrlen; j++) {
++                      for (k = 0, data = dmi->dmi_addr[j]; k < 8;  k++, data >>= 1) {
+                               if ((crc ^ data) & 1)
+                                       crc = (crc >> 1) ^ FEC_CRCPOL;
+                               else
+                                       crc >>= 1;
+-
+                       }
+-
+               }
+-              // Add this value
++              /* Add this value */
+               crc >>= 26;
+               crc &= 0x3F;
+               if (crc > 31)
+                       FEC_GAUR(base_addr) |= 0x1 << (crc - 32);
+               else
+                       FEC_GALR(base_addr) |= 0x1 << crc;
+-
+       }
+-
+ }
+ /************************************************************************
+@@ -736,26 +703,27 @@ void fec_set_multicast_list(struct net_d
+ *************************************************************************/
+ int fec_set_mac_address(struct net_device *dev, void *p)
+ {
+-      //Receive the pointer to the private structure
+       struct fec_priv *fp = netdev_priv(dev);
+-
+-      // Receive the base address
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-
+       struct sockaddr *addr = p;
+       if (netif_running(dev))
+               return -EBUSY;
+-      // Copy a new address to the device structure
++      /* Copy a new address to the device structure */
+       memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+-      // Copy a new address to the private structure
++      /* Copy a new address to the private structure */
+       memcpy(fp->fecpriv_mac_addr, addr->sa_data, 6);
+-      // Set the address to the registers
+-      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) | (fp->fecpriv_mac_addr[1] << 16) | (fp->fecpriv_mac_addr[2] << 8) | fp->fecpriv_mac_addr[3];
+-      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) | (fp->fecpriv_mac_addr[5] << 16) | 0x8808;
++      /* Set the address to the registers */
++      FEC_PALR(base_addr) = (fp->fecpriv_mac_addr[0] << 24) |
++              (fp->fecpriv_mac_addr[1] << 16) |
++              (fp->fecpriv_mac_addr[2] << 8) |
++              fp->fecpriv_mac_addr[3];
++      FEC_PAUR(base_addr) = (fp->fecpriv_mac_addr[4] << 24) |
++              (fp->fecpriv_mac_addr[5] << 16) |
++              0x8808;
+       return 0;
+ }
+@@ -769,27 +737,24 @@ int fec_set_mac_address(struct net_devic
+ *************************************************************************/
+ int fec_tx(struct sk_buff *skb, struct net_device *dev)
+ {
+-
+-      //Receive the pointer to the private structure
+       struct fec_priv *fp = netdev_priv(dev);
+-
+       void *data, *data_aligned;
+       int offset;
+       data = kmalloc(skb->len + 15, GFP_DMA | GFP_ATOMIC);
+-      if (!data)
+-      {
++      if (!data) {
+               fp->fecpriv_stat.tx_dropped++;
+               dev_kfree_skb(skb);
+               return 0;
+       }
+-      offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) - (unsigned long)virt_to_phys(data);
++      offset = (((unsigned long)virt_to_phys(data) + 15) & 0xFFFFFFF0) -
++              (unsigned long)virt_to_phys(data);
+       data_aligned = (void*)((unsigned long)data + offset);
+       memcpy(data_aligned, skb->data, skb->len);
+-      // flush data cache before initializing the descriptor and starting DMA
++      /* flush data cache before initializing the descriptor and starting DMA */
+ #if 0
+ /* JKM -- currently running with cache turned off */
+       DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(data_aligned), skb->len);
+@@ -797,7 +762,7 @@ int fec_tx(struct sk_buff *skb, struct n
+       spin_lock_irq(&fp->fecpriv_lock);
+-      // Initialize the descriptor
++      /* Initialize the descriptor */
+       fp->fecpriv_txbuf[fp->fecpriv_next_tx] = data;
+       fp->fecpriv_txdesc[fp->fecpriv_next_tx].dataPointer = (unsigned int) virt_to_phys(data_aligned);
+       fp->fecpriv_txdesc[fp->fecpriv_next_tx].length = skb->len;
+@@ -809,7 +774,7 @@ int fec_tx(struct sk_buff *skb, struct n
+       spin_unlock_irq(&fp->fecpriv_lock);
+-      // Tell the DMA to continue the transmission
++      /* Tell the DMA to continue the transmission */
+       MCD_continDma(fp->fecpriv_fec_tx_channel);
+       dev_kfree_skb(skb);
+@@ -835,14 +800,10 @@ void fec_tx_timeout(struct net_device *d
+       spin_lock_irq(&fp->fecpriv_lock);
+       MCD_killDma(fp->fecpriv_fec_tx_channel);
+-      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
+-      {
+-              if (fp->fecpriv_txbuf[i])
+-              {
+-
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
++              if (fp->fecpriv_txbuf[i]) {
+                       kfree(fp->fecpriv_txbuf[i]);
+                       fp->fecpriv_txbuf[i] = NULL;
+-
+               }
+               fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
+       }
+@@ -850,14 +811,14 @@ void fec_tx_timeout(struct net_device *d
+       fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
+-    // Reset FIFOs
++    /* Reset FIFOs */
+     FEC_FECFRST(base_addr) |= FEC_SW_RST;
+     FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
+-      // Reset and disable FEC
++      /* Reset and disable FEC */
+ //    FEC_ECR(base_addr) = FEC_ECR_RESET;
+-      // Enable FEC
++      /* Enable FEC */
+       FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
+       MCD_startDma(fp->fecpriv_fec_tx_channel, (char *) fp->fecpriv_txdesc, 0,
+@@ -883,23 +844,22 @@ int fec_read_mii(unsigned int base_addr,
+ {
+       unsigned long time;
+-      // Clear the MII interrupt bit
++      /* Clear the MII interrupt bit */
+       FEC_EIR(base_addr) = FEC_EIR_MII;
+-      // Write to the MII management frame register
++      /* Write to the MII management frame register */
+       FEC_MMFR(base_addr) = FEC_MMFR_READ | (pa << 23) | (ra << 18);
+       time = jiffies;
+-      // Wait for the reading
+-      while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
+-      {
++      /* Wait for the reading */
++      while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) {
+               if (jiffies - time > FEC_MII_TIMEOUT * HZ)
+                       return -ETIME;
+               schedule();
+       }
+-      // Clear the MII interrupt bit
++      /* Clear the MII interrupt bit */
+       FEC_EIR(base_addr) = FEC_EIR_MII;
+       *data = FEC_MMFR(base_addr) & 0x0000FFFF;
+@@ -918,25 +878,22 @@ int fec_write_mii(unsigned int base_addr
+ {
+       unsigned long time;
+-      // Clear the MII interrupt bit
++      /* Clear the MII interrupt bit */
+       FEC_EIR(base_addr) = FEC_EIR_MII;
+-      // Write to the MII management frame register
++      /* Write to the MII management frame register */
+       FEC_MMFR(base_addr) = FEC_MMFR_WRITE | (pa << 23) | (ra << 18) | data;
+       time = jiffies;
+-      // Wait for the writing
+-
+-      while (!(FEC_EIR(base_addr) & FEC_EIR_MII))
+-      {
++      /* Wait for the writing */
++      while (!(FEC_EIR(base_addr) & FEC_EIR_MII)) {
+               if (jiffies - time > FEC_MII_TIMEOUT * HZ)
+                       return -ETIME;
+-
+               schedule();
+       }
+-      // Clear the MII interrupt bit
++      /* Clear the MII interrupt bit */
+       FEC_EIR(base_addr) = FEC_EIR_MII;
+       return 0;
+@@ -953,27 +910,24 @@ void fec_interrupt_fec_tx_handler(struct
+ {
+       struct fec_priv *fp = netdev_priv(dev);
+-      //Release the socket buffer
+-      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
+-      {
++      /* Release the socket buffer */
++      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) {
+               kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
+               fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
+       }
+       fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK;
+-      if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE)
+-              for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK)
+-              {
+-                      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx])
+-                      {
++      if (MCD_dmaStatus(fp->fecpriv_fec_tx_channel) == MCD_DONE) {
++              for (; fp->fecpriv_current_tx != fp->fecpriv_next_tx; fp->fecpriv_current_tx = (fp->fecpriv_current_tx + 1) & FEC_TX_INDEX_MASK) {
++                      if(fp->fecpriv_txbuf[fp->fecpriv_current_tx]) {
+                               kfree(fp->fecpriv_txbuf[fp->fecpriv_current_tx]);
+                               fp->fecpriv_txbuf[fp->fecpriv_current_tx] = NULL;
+                       }
+               }
++      }
+       if (netif_queue_stopped(dev))
+               netif_wake_queue(dev);
+-
+ }
+ /************************************************************************
+@@ -1008,49 +962,41 @@ void fec_interrupt_fec_rx_handler(struct
+               }
+       }
+ */
+-      for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK)
+-      {
++      for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) {
+           if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) &&
+-                  (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) // --tym--
+-          {
++                  (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */
+               skb = fp->askb_rx[fp->fecpriv_current_rx];
+               if (!skb)
+-              {
+-                  fp->fecpriv_stat.rx_dropped++;
+-            }
+-              else
+-              {
+-                  // flush data cache before initializing the descriptor and starting DMA
++                      fp->fecpriv_stat.rx_dropped++;
++              else {
++                  /* flush data cache before initializing the descriptor and starting DMA */
+ //                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), fp->askb_rx[fp->fecpriv_current_rx]->len);
+                       skb_put(skb, fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length - 4);
+-//                            skb->dev = dev;
+                       skb->protocol = eth_type_trans(skb, dev);
+                       netif_rx(skb);
+-              }
+-                  fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME;
+-              // allocate new skbuff
++              }
++              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl &= ~MCD_FEC_END_FRAME;
++              /* allocate new skbuff */
+               fp->askb_rx[fp->fecpriv_current_rx] = alloc_skb(FEC_MAXBUF_SIZE + 16, /*GFP_ATOMIC |*/ GFP_DMA);
+-                  if (!fp->askb_rx[fp->fecpriv_current_rx])
+-          {
+-                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0;
+-                  fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0;
+-                  fp->fecpriv_stat.rx_dropped++;
+-                  }
+-              else
+-              {
+-                  skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16);
+-                      fp->askb_rx[fp->fecpriv_current_rx]->dev = dev;
++              if (!fp->askb_rx[fp->fecpriv_current_rx]) {
++                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = 0;
++                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = 0;
++                      fp->fecpriv_stat.rx_dropped++;
++              }
++              else {
++                      skb_reserve(fp->askb_rx[fp->fecpriv_current_rx], 16);
++                      fp->askb_rx[fp->fecpriv_current_rx]->dev = dev;
+-                  // flush data cache before initializing the descriptor and starting DMA
++                      /* flush data cache before initializing the descriptor and starting DMA */
+ #if 0
+ /* JKM -- currently running with cache turned off */
+-                  DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
++                      DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
+ #endif
+               fp->fecpriv_rxdesc[fp->fecpriv_current_rx].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail);
+               fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length = FEC_MAXBUF_SIZE;
+-                      fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY;
++              fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl |= MCD_FEC_BUF_READY;
+                   // flush data cache before initializing the descriptor and starting DMA
+ //                DcacheFlushInvalidateCacheBlock((void*)virt_to_phys(fp->askb_rx[fp->fecpriv_current_rx]->tail), FEC_MAXBUF_SIZE);
+@@ -1059,11 +1005,10 @@ void fec_interrupt_fec_rx_handler(struct
+       }
+-      // Tell the DMA to continue the reception
++      /* Tell the DMA to continue the reception */
+       MCD_continDma(fp->fecpriv_fec_rx_channel);
+       fp->fecpriv_rxflag = 0;
+-
+ }
+ /************************************************************************
+@@ -1080,76 +1025,70 @@ irqreturn_t fec_interrupt_handler(int ir
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+       unsigned long events;
+-      // Read and clear the events
++      /* Read and clear the events */
+       events = FEC_EIR(base_addr) & FEC_EIMR(base_addr);
+-      if (events & FEC_EIR_HBERR)
+-      {
++      if (events & FEC_EIR_HBERR) {
+               fp->fecpriv_stat.tx_heartbeat_errors++;
+-      FEC_EIR(base_addr) = FEC_EIR_HBERR;
++              FEC_EIR(base_addr) = FEC_EIR_HBERR;
+       }
+-    // receive/transmit FIFO error
+-    if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0))
+-    {
+-        // kill DMA receive channel
+-        MCD_killDma (fp->fecpriv_fec_rx_channel);
+-        // kill running transmission by DMA
+-        MCD_killDma (fp->fecpriv_fec_tx_channel);
+-
+-        // Reset FIFOs
+-        FEC_FECFRST(base_addr) |= FEC_SW_RST;
+-        FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
+-
+-        // reset receive FIFO status register
+-        FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE
+-                                 | FEC_FECRFSR_RXW
+-                                 | FEC_FECRFSR_UF;
+-
+-        // reset transmit FIFO status register
+-        FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE
+-                                 | FEC_FECTFSR_TXW
+-                                 | FEC_FECTFSR_UF
+-                                 | FEC_FECTFSR_OF;
++      /* receive/transmit FIFO error */
++      if (((events & FEC_EIR_RFERR) != 0) || ((events & FEC_EIR_XFERR) != 0)) {
++              /* kill DMA receive channel */
++              MCD_killDma (fp->fecpriv_fec_rx_channel);
+-        // reset RFERR and XFERR event
+-        FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR;
++              /* kill running transmission by DMA */
++              MCD_killDma (fp->fecpriv_fec_tx_channel);
+-      // stop queue
+-      netif_stop_queue(dev);
+-      
+-        // execute reinitialization as tasklet
+-      tasklet_schedule(&fp->fecpriv_tasklet_reinit);
++              /* Reset FIFOs */
++              FEC_FECFRST(base_addr) |= FEC_SW_RST;
++              FEC_FECFRST(base_addr) &= ~FEC_SW_RST;
+-        fp->fecpriv_stat.rx_dropped++;
++              /* reset receive FIFO status register */
++              FEC_FECRFSR(base_addr) = FEC_FECRFSR_FAE |
++                                       FEC_FECRFSR_RXW |
++                                       FEC_FECRFSR_UF;
+-    }
++              /* reset transmit FIFO status register */
++              FEC_FECTFSR(base_addr) = FEC_FECTFSR_FAE |
++                                       FEC_FECTFSR_TXW |
++                                       FEC_FECTFSR_UF |
++                                       FEC_FECTFSR_OF;
+-    // transmit FIFO underrun
+-    if ((events & FEC_EIR_XFUN) != 0)
+-    {
+-        // reset XFUN event
+-        FEC_EIR(base_addr) = FEC_EIR_XFUN;
+-              fp->fecpriv_stat.tx_aborted_errors++;
+-    }
++              /* reset RFERR and XFERR event */
++              FEC_EIR(base_addr) = FEC_EIR_RFERR | FEC_EIR_XFERR;
++
++              /* stop queue */
++              netif_stop_queue(dev);
++      
++              /* execute reinitialization as tasklet */
++              tasklet_schedule(&fp->fecpriv_tasklet_reinit);
++
++              fp->fecpriv_stat.rx_dropped++;
++      }
+-    // late collision
+-    if ((events & FEC_EIR_LC) != 0)
+-    {
+-        // reset LC event
+-        FEC_EIR(base_addr) = FEC_EIR_LC;
++      /* transmit FIFO underrun */
++      if ((events & FEC_EIR_XFUN) != 0) {
++              /* reset XFUN event */
++              FEC_EIR(base_addr) = FEC_EIR_XFUN;
+               fp->fecpriv_stat.tx_aborted_errors++;
+-    }
++      }
+-    // collision retry limit
+-    if ((events & FEC_EIR_RL) != 0)
+-    {
+-        // reset RL event
+-        FEC_EIR(base_addr) = FEC_EIR_RL;
++      /* late collision */
++      if ((events & FEC_EIR_LC) != 0) {
++              /* reset LC event */
++              FEC_EIR(base_addr) = FEC_EIR_LC;
+               fp->fecpriv_stat.tx_aborted_errors++;
+-    }
++      }
+-    return 0;
++      /* collision retry limit */
++      if ((events & FEC_EIR_RL) != 0) {
++              /* reset RL event */
++              FEC_EIR(base_addr) = FEC_EIR_RL;
++              fp->fecpriv_stat.tx_aborted_errors++;
++      }
++      return 0;
+ }
+ /************************************************************************
+@@ -1166,52 +1105,46 @@ void fec_interrupt_fec_reinit(unsigned l
+       struct fec_priv *fp = netdev_priv(dev);
+       unsigned long base_addr = (unsigned long) dev->base_addr;
+-      // Initialize reception descriptors and start DMA for the reception
+-      for (i = 0; i < FEC_RX_BUF_NUMBER; i++)
+-      {
+-              if (!fp->askb_rx[i])
+-              {
+-              fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA);
+-              if (!fp->askb_rx[i])
+-                  {
+-                      fp->fecpriv_rxdesc[i].dataPointer = 0;
+-                      fp->fecpriv_rxdesc[i].statCtrl = 0;
+-              fp->fecpriv_rxdesc[i].length = 0;
+-              continue;
+-              }
++      /* Initialize reception descriptors and start DMA for the reception */
++      for (i = 0; i < FEC_RX_BUF_NUMBER; i++) {
++              if (!fp->askb_rx[i]) {
++                      fp->askb_rx[i] = alloc_skb(FEC_MAXBUF_SIZE + 16, GFP_ATOMIC | GFP_DMA);
++                      if (!fp->askb_rx[i]) {
++                              fp->fecpriv_rxdesc[i].dataPointer = 0;
++                              fp->fecpriv_rxdesc[i].statCtrl = 0;
++                              fp->fecpriv_rxdesc[i].length = 0;
++                              continue;
++                      }
+                       fp->askb_rx[i]->dev = dev;
+-          skb_reserve(fp->askb_rx[i], 16);
+-          }
+-          fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
++                      skb_reserve(fp->askb_rx[i], 16);
++              }
++              fp->fecpriv_rxdesc[i].dataPointer = (unsigned int) virt_to_phys(fp->askb_rx[i]->tail);
+               fp->fecpriv_rxdesc[i].statCtrl = MCD_FEC_BUF_READY | MCD_FEC_INTERRUPT;
+-      fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
++              fp->fecpriv_rxdesc[i].length = FEC_MAXBUF_SIZE;
+       }
+       fp->fecpriv_rxdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
+       fp->fecpriv_current_rx = 0;
+-    // restart frame transmission
+-      for (i = 0; i < FEC_TX_BUF_NUMBER; i++)
+-      {
+-              if (fp->fecpriv_txbuf[i])
+-              {
+-
++      /* restart frame transmission */
++      for (i = 0; i < FEC_TX_BUF_NUMBER; i++) {
++              if (fp->fecpriv_txbuf[i]) {
+                       kfree(fp->fecpriv_txbuf[i]);
+                       fp->fecpriv_txbuf[i] = NULL;
+-              fp->fecpriv_stat.tx_dropped++;
++                      fp->fecpriv_stat.tx_dropped++;
+               }
+               fp->fecpriv_txdesc[i].statCtrl = MCD_FEC_INTERRUPT;
+       }
+       fp->fecpriv_txdesc[i - 1].statCtrl |= MCD_FEC_WRAP;
+       fp->fecpriv_current_tx = fp->fecpriv_next_tx = 0;
+-      // flush entire data cache before restarting the DMA
++      /* flush entire data cache before restarting the DMA */
+ #if 0
+ /* JKM -- currently running with cache turned off */
+       DcacheFlushInvalidate();
+ #endif
+       
+-    // restart DMA from beginning
++      /* restart DMA from beginning */
+       MCD_startDma(fp->fecpriv_fec_rx_channel,
+                    (char *) fp->fecpriv_rxdesc, 0,
+                    (unsigned char *) &(FEC_FECRFDR(base_addr)), 0,
+@@ -1225,11 +1158,10 @@ void fec_interrupt_fec_reinit(unsigned l
+                    FEC_TX_DMA_PRI, MCD_FECTX_DMA | MCD_INTERRUPT,
+                    MCD_NO_CSUM | MCD_NO_BYTE_SWAP);
+-    // Enable FEC
+-    FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
++      /* Enable FEC */
++      FEC_ECR(base_addr) |= FEC_ECR_ETHEREN;
+       netif_wake_queue(dev);
+-
+ }
+ /************************************************************************
+@@ -1284,8 +1216,8 @@ void fec_interrupt_fec_rx_handler_fec1(v
+ }
+ #endif
+-#ifndef MODULE
++#ifndef MODULE
+ /************************************************************************
+ * NAME: fec_mac_setup0
+ *
+@@ -1300,7 +1232,6 @@ int __init fec_mac_setup0(char *s)
+       if(fec_str_to_mac(s, fec_mac_addr_fec0))
+               printk("The MAC address of FEC0 cannot be set from command line");
+       return 1;
+-
+ }
+ #ifdef   FEC_2
+@@ -1316,11 +1247,9 @@ int __init fec_mac_setup1(char *s)
+       if(!s || !*s)
+               return 1;
+-
+       if(fec_str_to_mac(s, fec_mac_addr_fec1))
+               printk("The MAC address of FEC1 cannot be set from command line");
+       return 1;
+-
+ }
+ #endif
+@@ -1332,52 +1261,46 @@ int __init fec_mac_setup1(char *s)
+ *************************************************************************/
+ int fec_str_to_mac( char *str_mac, unsigned char* addr)
+ {
+-    unsigned long val;
++      unsigned long val;
+       char c;
+       unsigned long octet[6], *octetptr = octet;
+       int i;
+-again:
++again:
+       val = 0;
+-      while ((c = *str_mac) != '\0')
+-      {
+-              if ((c>='0')&&(c<='9'))
+-              {
++      while ((c = *str_mac) != '\0') {
++              if ((c>='0')&&(c<='9')) {
+                       val = (val * 16) + (c - '0');
+                       str_mac++;
+                       continue;
+               }
+-              else
+-              if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F')))
+-              {
++              else if (((c>='a')&&(c<='f'))||((c>='A')&&(c<='F'))) {
+                       val = (val << 4) + (c + 10 - (((c>='a')&&(c<='f')) ? 'a' : 'A'));
+                       str_mac++;
+                       continue;
+               }
+               break;
+       }
+-      if (*str_mac == ':')
+-      {
++      if (*str_mac == ':') {
+               *octetptr++ = val, str_mac++;
+               if (octetptr >= octet + 6)
+                       return 1;
+               goto again;
+       }
+-       //Check for trailing characters.
++      /* Check for trailing characters */
+       if (*str_mac && !(*str_mac==' '))
+               return 1;
++
+       *octetptr++ = val;
+-      if ((octetptr - octet)==6)
+-      {
+-         for(i=0;i<=6;i++)
+-            addr[i]=octet[i];
++      if ((octetptr - octet)==6) {
++              for(i=0;i<=6;i++)
++                      addr[i]=octet[i];
+       }
+-    else
++      else
+               return 1;
+       return 0;
+-
+ }
+ #endif
diff --git a/target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch b/target/linux/coldfire/patches/048-m547x_8x_internal_rename.patch
new file mode 100644 (file)
index 0000000..eda1df0
--- /dev/null
@@ -0,0 +1,22 @@
+From 62c2649ed2362a5f0478df60d56ed35414ac81ea Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 13 Mar 2008 22:06:35 -0600
+Subject: [PATCH] Change internal name rigo to m548x_7x
+
+LTIBName: m547x-8x-internal-rename
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -53,7 +53,7 @@
+ #define __FINIT               .previous
+ #endif
+-/* JKM -- REVISE DOCS FOR RIGO and PHYS MAPPING */
++/* JKM -- REVISE DOCS FOR M547x_8x and PHYS MAPPING */
+ /*
+  * Setup ACR mappings to provide the following memory map:
+  *   Data
diff --git a/target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch b/target/linux/coldfire/patches/049-mcfv4e_linker_bss_cleanup.patch
new file mode 100644 (file)
index 0000000..06a68aa
--- /dev/null
@@ -0,0 +1,72 @@
+From 4e16f08c800d57b986217e0d39d4a06b5bdf641d Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 19 Mar 2008 17:37:44 -0600
+Subject: [PATCH] Move BSS section in linker script and zero it on boot.
+
+To work with the latest round of toolchains the bss section
+in the linker script needed to be moved to the end (due to
+the linker thinking there were overlapping sections).
+
+The BSS section needs to be manually zeroed.
+
+LTIBName: mcfv4e-linker-bss-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S         |   11 +++++++++++
+ arch/m68k/coldfire/vmlinux-cf.lds |   11 ++++++++---
+ 2 files changed, 19 insertions(+), 3 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -321,6 +321,17 @@ ENTRY(__start)
+       movec   %d0, %acr3
+       nop
++#ifdef CONFIG_COLDFIRE
++/* zero bss */
++      lea     _sbss,%a0
++      lea     _ebss,%a1
++      clrl    %d0
++_loop_bss:
++      movel   %d0,(%a0)+
++      cmpl    %a0,%a1
++      bne     _loop_bss
++#endif
++
+       /* If you change the memory size to another value make a matching 
+          change in paging_init(cf-mmu.c) to zones_size[]. */
+--- a/arch/m68k/coldfire/vmlinux-cf.lds
++++ b/arch/m68k/coldfire/vmlinux-cf.lds
+@@ -51,9 +51,6 @@ SECTIONS
+       CONSTRUCTORS
+   } :data
+-  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {               /* BSS */
+-      *(.bss)
+-  }
+   . = ALIGN(16);
+   .data.cacheline_aligned : AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET ) {
+@@ -62,6 +59,8 @@ SECTIONS
+   _edata = .;                 /* End of data section */
++  NOTES                               /* support ld --build-id */
++
+   . = ALIGN(8192);            /* Initrd */
+   .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
+       __init_begin = .;
+@@ -111,6 +110,12 @@ SECTIONS
+       *(.data.init_task)      /* The initial task and kernel stack */
+   }
++  _sbss = .;
++  .bss : AT(ADDR(.bss) - LOAD_OFFSET) {               /* BSS */
++      *(.bss)
++  }
++  _ebss = .;
++
+   _end = . ;
+   /* Sections to be discarded */
diff --git a/target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch b/target/linux/coldfire/patches/050-mcfv4e_irq_magic_bit.patch
new file mode 100644 (file)
index 0000000..61d746b
--- /dev/null
@@ -0,0 +1,31 @@
+From 3487b77acbb12f4174f46237f942918651b23aa7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 15 Apr 2008 17:14:55 -0600
+Subject: [PATCH] Fix setting low 31 interrupts to deal with magic bit 0
+ of the IMRL register.
+
+LTIBName: mcfv4e-irq-magic-bit
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/ints.c |    9 ++++++---
+ 1 files changed, 6 insertions(+), 3 deletions(-)
+
+--- a/arch/m68k/coldfire/ints.c
++++ b/arch/m68k/coldfire/ints.c
+@@ -420,10 +420,13 @@ void m547x_8x_irq_enable(unsigned int ir
+       }
+ #endif
+-      if (irq < 32)
+-              MCF_IMRL &= ~(1 << irq);
+-      else
++      if (irq < 32) {
++              /* *grumble* don't set low bit of IMRL */
++              MCF_IMRL &= (~(1 << irq) & 0xfffffffe);
++      }
++      else {
+               MCF_IMRH &= ~(1 << (irq - 32));
++      }
+ }
+ void m547x_8x_irq_disable(unsigned int irq)
diff --git a/target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch b/target/linux/coldfire/patches/051-m547x_8x_mcdma_1.0.patch
new file mode 100644 (file)
index 0000000..817fb1b
--- /dev/null
@@ -0,0 +1,3726 @@
+From 6c9df5dff79b6d09d1a31681067e7fbd85285f80 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 30 Apr 2008 12:22:03 -0600
+Subject: [PATCH] Update MultiChannel DMA to code version 1.0.
+
+Changes since previous:
+- Updated FEC RX task to work around bug where it would not update
+  the RX buffer descriptors correctly and adjusted size accordingly.
+- Added flag MCD_TT_FLAGS_PI for use with DSPI on MCD547x/8x.
+- Fixed cleanup of paused tasks in MCD_killDma.
+- Cosmetic changes to cleanup MCD_dmaApi.c.
+
+LTIBName: m547x-8x-mcdma-1.0
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/Makefile       |    3 +-
+ arch/m68k/coldfire/dma.c          |  532 ----
+ arch/m68k/coldfire/m547x_8x-dma.c |  516 ++++
+ drivers/dma/MCD_dma.h             |  786 +++---
+ drivers/dma/MCD_dmaApi.c          |  417 ++--
+ drivers/dma/MCD_progCheck.h       |   45 +-
+ drivers/dma/MCD_tasks.c           | 4917 +++++++++++++++++++------------------
+ drivers/dma/MCD_tasksInit.c       |  402 ++--
+ drivers/dma/MCD_tasksInit.h       |   49 +-
+ 9 files changed, 3785 insertions(+), 3882 deletions(-)
+ delete mode 100644 arch/m68k/coldfire/dma.c
+ create mode 100644 arch/m68k/coldfire/m547x_8x-dma.c
+
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -10,5 +10,4 @@ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+ obj-$(CONFIG_M54455)  += mcf5445x-devices.o
+-
+-obj-$(CONFIG_MCD_DMA) += dma.o
++obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
+--- a/arch/m68k/coldfire/dma.c
++++ /dev/null
+@@ -1,532 +0,0 @@
+-#include <linux/kernel.h>
+-#include <linux/sched.h>
+-#include <linux/mm.h>
+-#include <linux/init.h>
+-#include <linux/interrupt.h>
+-#include <asm/io.h>
+-#include <asm/irq.h>
+-#include <asm/dma.h>
+-#include <asm/coldfire.h>
+-#include <asm/m5485sram.h>
+-#include <asm/mcfsim.h>
+-
+-
+-
+-void dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs);
+-
+-/* 
+- * This global keeps track of which initiators have been
+- * used of the available assignments.  Initiators 0-15 are
+- * hardwired.  Initiators 16-31 are multiplexed and controlled
+- * via the Initiatior Mux Control Registe (IMCR).  The
+- * assigned requestor is stored with the associated initiator
+- * number.
+- */
+-static int used_reqs[32] = {
+-      DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0,
+-      DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1,
+-      DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX,
+-      DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX,
+-      0, 0, 0, 0,
+-      0, 0, 0, 0,
+-      0, 0, 0, 0,
+-      0, 0, 0, 0
+-};
+-
+-/*
+- * This global keeps track of which channels have been assigned
+- * to tasks.  This methology assumes that no single initiator
+- * will be tied to more than one task/channel
+- */
+-static char used_channel[16] = {
+-      -1, -1, -1, -1, -1, -1, -1, -1,
+-      -1, -1, -1, -1, -1, -1, -1, -1
+-};
+-
+-unsigned int connected_channel[16] = {
+-      0, 0, 0, 0, 0, 0, 0, 0,
+-      0, 0, 0, 0, 0, 0, 0, 0
+-};
+-
+-/********************************************************************/
+-/*
+- * Attempt to enable the provided Initiator in the Initiator
+- * Mux Control Register
+- *
+- * Parameters:
+- *  initiator   Initiator identifier
+- *
+- * Return Value:
+- *  1   if unable to make the assignment
+- *  0   successful
+- */
+-int
+-dma_set_initiator(int initiator)
+-{
+-      switch (initiator) {    /*
+-                               * These initiators are always active 
+-                               */
+-      case DMA_ALWAYS:
+-      case DMA_DSPI_RX:
+-      case DMA_DSPI_TX:
+-      case DMA_DREQ0:
+-      case DMA_PSC0_RX:
+-      case DMA_PSC0_TX:
+-      case DMA_USBEP0:
+-      case DMA_USBEP1:
+-      case DMA_USBEP2:
+-      case DMA_USBEP3:
+-      case DMA_PCI_TX:
+-      case DMA_PCI_RX:
+-      case DMA_PSC1_RX:
+-      case DMA_PSC1_TX:
+-      case DMA_I2C_RX:
+-      case DMA_I2C_TX:
+-              break;
+-
+-      case DMA_FEC0_RX:
+-              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3))
+-                  | MCF_DMA_IMCR_SRC16_FEC0RX;
+-              used_reqs[16] = DMA_FEC0_RX;
+-              break;
+-
+-      case DMA_FEC0_TX:
+-              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3))
+-                  | MCF_DMA_IMCR_SRC17_FEC0TX;
+-              used_reqs[17] = DMA_FEC0_TX;
+-              break;
+-
+-      case DMA_FEC1_RX:
+-              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3))
+-                  | MCF_DMA_IMCR_SRC20_FEC1RX;
+-              used_reqs[20] = DMA_FEC1_RX;
+-              break;
+-
+-      case DMA_FEC1_TX:
+-              if (used_reqs[21] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
+-                          | MCF_DMA_IMCR_SRC21_FEC1TX;
+-                      used_reqs[21] = DMA_FEC1_TX;
+-              } else if (used_reqs[25] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
+-                          | MCF_DMA_IMCR_SRC25_FEC1TX;
+-                      used_reqs[25] = DMA_FEC1_TX;
+-              } else if (used_reqs[31] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
+-                          | MCF_DMA_IMCR_SRC31_FEC1TX;
+-                      used_reqs[31] = DMA_FEC1_TX;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_DREQ1:
+-              if (used_reqs[29] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
+-                          | MCF_DMA_IMCR_SRC29_DREQ1;
+-                      used_reqs[29] = DMA_DREQ1;
+-              } else if (used_reqs[21] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
+-                          | MCF_DMA_IMCR_SRC21_DREQ1;
+-                      used_reqs[21] = DMA_DREQ1;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM0:
+-              if (used_reqs[24] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3))
+-                          | MCF_DMA_IMCR_SRC24_CTM0;
+-                      used_reqs[24] = DMA_CTM0;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM1:
+-              if (used_reqs[25] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
+-                          | MCF_DMA_IMCR_SRC25_CTM1;
+-                      used_reqs[25] = DMA_CTM1;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM2:
+-              if (used_reqs[26] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
+-                          | MCF_DMA_IMCR_SRC26_CTM2;
+-                      used_reqs[26] = DMA_CTM2;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM3:
+-              if (used_reqs[27] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
+-                          | MCF_DMA_IMCR_SRC27_CTM3;
+-                      used_reqs[27] = DMA_CTM3;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM4:
+-              if (used_reqs[28] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
+-                          | MCF_DMA_IMCR_SRC28_CTM4;
+-                      used_reqs[28] = DMA_CTM4;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM5:
+-              if (used_reqs[29] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
+-                          | MCF_DMA_IMCR_SRC29_CTM5;
+-                      used_reqs[29] = DMA_CTM5;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM6:
+-              if (used_reqs[30] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
+-                          | MCF_DMA_IMCR_SRC30_CTM6;
+-                      used_reqs[30] = DMA_CTM6;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_CTM7:
+-              if (used_reqs[31] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
+-                          | MCF_DMA_IMCR_SRC31_CTM7;
+-                      used_reqs[31] = DMA_CTM7;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_USBEP4:
+-              if (used_reqs[26] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
+-                          | MCF_DMA_IMCR_SRC26_USBEP4;
+-                      used_reqs[26] = DMA_USBEP4;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_USBEP5:
+-              if (used_reqs[27] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
+-                          | MCF_DMA_IMCR_SRC27_USBEP5;
+-                      used_reqs[27] = DMA_USBEP5;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_USBEP6:
+-              if (used_reqs[28] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
+-                          | MCF_DMA_IMCR_SRC28_USBEP6;
+-                      used_reqs[28] = DMA_USBEP6;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_PSC2_RX:
+-              if (used_reqs[28] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
+-                          | MCF_DMA_IMCR_SRC28_PSC2RX;
+-                      used_reqs[28] = DMA_PSC2_RX;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_PSC2_TX:
+-              if (used_reqs[29] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
+-                          | MCF_DMA_IMCR_SRC29_PSC2TX;
+-                      used_reqs[29] = DMA_PSC2_TX;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_PSC3_RX:
+-              if (used_reqs[30] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
+-                          | MCF_DMA_IMCR_SRC30_PSC3RX;
+-                      used_reqs[30] = DMA_PSC3_RX;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      case DMA_PSC3_TX:
+-              if (used_reqs[31] == 0) {
+-                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
+-                          | MCF_DMA_IMCR_SRC31_PSC3TX;
+-                      used_reqs[31] = DMA_PSC3_TX;
+-              } else          /* No empty slots */
+-                      return 1;
+-              break;
+-
+-      default:
+-              return 1;
+-      }
+-      return 0;
+-}
+-
+-/********************************************************************/
+-/*
+- * Return the initiator number for the given requestor
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- *
+- * Return Value:
+- *  The initiator number (0-31) if initiator has been assigned
+- *  0 (always initiator) otherwise
+- */
+-unsigned int
+-dma_get_initiator(int requestor)
+-{
+-      u32 i;
+-
+-      for (i = 0; i < sizeof (used_reqs); ++i) {
+-              if (used_reqs[i] == requestor)
+-                      return i;
+-      }
+-      return 0;
+-}
+-
+-/********************************************************************/
+-/*
+- * Remove the given initiator from the active list
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- */
+-void
+-dma_remove_initiator(int requestor)
+-{
+-      u32 i;
+-
+-      for (i = 0; i < sizeof (used_reqs); ++i) {
+-              if (used_reqs[i] == requestor) {
+-                      used_reqs[i] = -1;
+-                      break;
+-              }
+-      }
+-}
+-
+-/********************************************************************/
+-/*
+- * Attempt to find an available channel for FEC and mark is as used
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- *
+- * Return Value:
+- *  First available channel (from 0 to 5) or -1 if they are all occupied
+- */
+-int
+-dma_set_channel_fec(int requestor)
+-{
+-      u32 i, t;
+-
+-#ifdef CONFIG_FEC_548x_ENABLE_FEC2
+-      t = 4;
+-#else
+-      t = 2;
+-#endif
+-
+-
+-
+-      for (i = 0; i < t ; ++i)
+-              if (used_channel[i] == -1) {
+-                      used_channel[i] = requestor;
+-                      return i;
+-              }
+-      /* All channels taken */
+-      return -1;
+-}
+-
+-/********************************************************************/
+-/*
+- * Attempt to find an available channel and mark is as used
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- *
+- * Return Value:
+- *  First available channel (from 6 to 15) or -1 if they are all occupied
+- */
+-int
+-dma_set_channel(int requestor)
+-{
+-      u32 i;
+-#ifdef CONFIG_NET_FEC2
+-      i = 4;
+-#else
+-      i = 2;
+-#endif                                
+-
+-      for (; i < 16; ++i)
+-              if (used_channel[i] == -1) {
+-                      used_channel[i] = requestor;
+-                      return i;
+-              }
+-
+-      /* All channels taken */
+-      return -1;
+-}
+-
+-/********************************************************************/
+-/*
+- * Return the channel being initiated by the given requestor
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- */
+-int
+-dma_get_channel(int requestor)
+-{
+-      u32 i;
+-
+-      for (i = 0; i < sizeof (used_channel); ++i) {
+-              if (used_channel[i] == requestor)
+-                      return i;
+-      }
+-      return -1;
+-}
+-
+-/********************************************************************/
+-/*
+- * Connects a channel with reference on your data 
+- *
+- * Parameters:
+- *  channel   channel number
+- *  reference addres of your data
+-  */
+-int
+-dma_connect(int channel, int address)
+-{
+-      if ((channel < 16) && (channel >= 0))
+-              connected_channel[channel] = address;
+-      else
+-              return -1;
+-      return 0;
+-}
+-
+-/********************************************************************/
+-/*
+- * Disconnects a channel with reference on your data 
+- *
+- * Parameters:
+- *  channel   channel number
+-*/
+-int
+-dma_disconnect(int channel)
+-{
+-      if ((channel < 16) && (channel >= 0))
+-              connected_channel[channel] = 0;
+-      else
+-              return -1;
+-      return 0;
+-}
+-
+-/********************************************************************/
+-/*
+- * Remove the channel being initiated by the given requestor from 
+- * the active list
+- *
+- * Parameters:
+- *  requestor   Initiator/Requestor identifier
+- */
+-void
+-dma_remove_channel(int requestor)
+-{
+-      u32 i;
+-
+-      for (i = 0; i < sizeof (used_channel); ++i) {
+-              if (used_channel[i] == requestor) {
+-                      used_channel[i] = -1;
+-                      break;
+-              }
+-      }
+-}
+-
+-/********************************************************************/
+-/* 
+- * This is the catch-all interrupt handler for the mult-channel DMA 
+- */
+-volatile u8 dma_iflag[16];
+-u32 tx = 0;
+-
+-void
+-dma_interrupt_handler(int irq, void *dev_id, struct pt_regs *regs)
+-{
+-      u32 i, interrupts/*, mask, temp*/;
+-
+-      /*
+-       * Determine which interrupt(s) triggered by AND'ing the 
+-       * pending interrupts with those that aren't masked.            
+-       */
+-/*    mask = MCF_DMA_DIMR;
+-      MCF_DMA_DIMR = 0xffffffff;
+-*/
+-      interrupts = MCF_DMA_DIPR;
+-      MCF_DMA_DIPR |= interrupts;
+-//    temp = interrupts;
+-
+-      //MCF_DMA_DIPR = interrupts;
+-      for (i = 0; i < 16; ++i, interrupts >>= 1)
+-              if (interrupts & 0x1)
+-                      if (connected_channel[i] != 0)
+-                              ((void (*)(void)) (connected_channel[i])) ();
+-
+-/*    MCF_DMA_DIPR |= temp;
+-      MCF_DMA_DIMR = mask;*/
+-}
+-
+-void
+-dma_remove_channel_by_number(int channel)
+-{
+-      if (channel < sizeof (used_channel) && channel >= 0)
+-              used_channel[channel] = -1;
+-}
+-
+-int __devinit
+-dma_init()
+-{
+-      int result;
+-      char *dma_version_str;
+-
+-      MCD_getVersion(&dma_version_str);
+-      printk("Initialize %s\n", dma_version_str);
+-
+-      if (request_irq
+-          (64 + ISC_DMA, 
+-           dma_interrupt_handler, 
+-           IRQF_DISABLED, 
+-           "MCD-DMA", 
+-           NULL)) {
+-              printk("Cannot allocate the DMA IRQ(48)\n");
+-              return 1;
+-      }
+-
+-      MCF_DMA_DIMR = 0;
+-      MCF_DMA_DIPR = 0xFFFFFFFF;
+-
+-      MCF_ICR(ISC_DMA) = ILP_DMA;
+-
+-      result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
+-                      (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
+-      if (result != MCD_OK) {
+-              printk("Cannot perform DMA initialization\n");
+-              free_irq(64 + ISC_DMA, NULL);
+-              return 1;
+-      }
+-
+-      return 0;
+-}
+-
+-device_initcall(dma_init);
+-
+--- /dev/null
++++ b/arch/m68k/coldfire/m547x_8x-dma.c
+@@ -0,0 +1,516 @@
++/*
++ * arch/m68k/coldfire/m547x_8x-dma.c
++ *
++ * Coldfire M547x/M548x DMA
++ *
++ * Copyright (c) 2008 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ *
++ * This code is based on patches from the Freescale M547x_8x BSP
++ * release mcf547x_8x-20070107-ltib.iso
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++#include <linux/kernel.h>
++#include <linux/sched.h>
++#include <linux/mm.h>
++#include <linux/init.h>
++#include <linux/interrupt.h>
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/dma.h>
++#include <asm/coldfire.h>
++#include <asm/m5485sram.h>
++#include <asm/mcfsim.h>
++
++/*
++ * This global keeps track of which initiators have been
++ * used of the available assignments.  Initiators 0-15 are
++ * hardwired.  Initiators 16-31 are multiplexed and controlled
++ * via the Initiatior Mux Control Registe (IMCR).  The
++ * assigned requestor is stored with the associated initiator
++ * number.
++ */
++static int used_reqs[32] = {
++      DMA_ALWAYS, DMA_DSPI_RX, DMA_DSPI_TX, DMA_DREQ0,
++      DMA_PSC0_RX, DMA_PSC0_TX, DMA_USBEP0, DMA_USBEP1,
++      DMA_USBEP2, DMA_USBEP3, DMA_PCI_TX, DMA_PCI_RX,
++      DMA_PSC1_RX, DMA_PSC1_TX, DMA_I2C_RX, DMA_I2C_TX,
++      0, 0, 0, 0,
++      0, 0, 0, 0,
++      0, 0, 0, 0,
++      0, 0, 0, 0
++};
++
++/*
++ * This global keeps track of which channels have been assigned
++ * to tasks.  This methology assumes that no single initiator
++ * will be tied to more than one task/channel
++ */
++static char used_channel[16] = {
++      -1, -1, -1, -1, -1, -1, -1, -1,
++      -1, -1, -1, -1, -1, -1, -1, -1
++};
++
++unsigned int connected_channel[16] = {
++      0, 0, 0, 0, 0, 0, 0, 0,
++      0, 0, 0, 0, 0, 0, 0, 0
++};
++
++/**
++ * dma_set_initiator - enable initiator
++ * @initiator: initiator identifier
++ *
++ * Returns 0 of successful, non-zero otherwise
++ *
++ * Attempt to enable the provided Initiator in the Initiator
++ * Mux Control Register.
++ */
++int dma_set_initiator(int initiator)
++{
++      switch (initiator) {
++      case DMA_ALWAYS:
++      case DMA_DSPI_RX:
++      case DMA_DSPI_TX:
++      case DMA_DREQ0:
++      case DMA_PSC0_RX:
++      case DMA_PSC0_TX:
++      case DMA_USBEP0:
++      case DMA_USBEP1:
++      case DMA_USBEP2:
++      case DMA_USBEP3:
++      case DMA_PCI_TX:
++      case DMA_PCI_RX:
++      case DMA_PSC1_RX:
++      case DMA_PSC1_TX:
++      case DMA_I2C_RX:
++      case DMA_I2C_TX:
++              /*
++               * These initiators are always active
++               */
++              break;
++
++      case DMA_FEC0_RX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC16(3))
++                  | MCF_DMA_IMCR_SRC16_FEC0RX;
++              used_reqs[16] = DMA_FEC0_RX;
++              break;
++
++      case DMA_FEC0_TX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC17(3))
++                  | MCF_DMA_IMCR_SRC17_FEC0TX;
++              used_reqs[17] = DMA_FEC0_TX;
++              break;
++
++      case DMA_FEC1_RX:
++              MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC20(3))
++                  | MCF_DMA_IMCR_SRC20_FEC1RX;
++              used_reqs[20] = DMA_FEC1_RX;
++              break;
++
++      case DMA_FEC1_TX:
++              if (used_reqs[21] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
++                          | MCF_DMA_IMCR_SRC21_FEC1TX;
++                      used_reqs[21] = DMA_FEC1_TX;
++              } else if (used_reqs[25] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
++                          | MCF_DMA_IMCR_SRC25_FEC1TX;
++                      used_reqs[25] = DMA_FEC1_TX;
++              } else if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_FEC1TX;
++                      used_reqs[31] = DMA_FEC1_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_DREQ1:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_DREQ1;
++                      used_reqs[29] = DMA_DREQ1;
++              } else if (used_reqs[21] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC21(3))
++                          | MCF_DMA_IMCR_SRC21_DREQ1;
++                      used_reqs[21] = DMA_DREQ1;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM0:
++              if (used_reqs[24] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC24(3))
++                          | MCF_DMA_IMCR_SRC24_CTM0;
++                      used_reqs[24] = DMA_CTM0;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM1:
++              if (used_reqs[25] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC25(3))
++                          | MCF_DMA_IMCR_SRC25_CTM1;
++                      used_reqs[25] = DMA_CTM1;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM2:
++              if (used_reqs[26] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
++                          | MCF_DMA_IMCR_SRC26_CTM2;
++                      used_reqs[26] = DMA_CTM2;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM3:
++              if (used_reqs[27] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
++                          | MCF_DMA_IMCR_SRC27_CTM3;
++                      used_reqs[27] = DMA_CTM3;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM4:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_CTM4;
++                      used_reqs[28] = DMA_CTM4;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM5:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_CTM5;
++                      used_reqs[29] = DMA_CTM5;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM6:
++              if (used_reqs[30] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
++                          | MCF_DMA_IMCR_SRC30_CTM6;
++                      used_reqs[30] = DMA_CTM6;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_CTM7:
++              if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_CTM7;
++                      used_reqs[31] = DMA_CTM7;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP4:
++              if (used_reqs[26] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC26(3))
++                          | MCF_DMA_IMCR_SRC26_USBEP4;
++                      used_reqs[26] = DMA_USBEP4;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP5:
++              if (used_reqs[27] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC27(3))
++                          | MCF_DMA_IMCR_SRC27_USBEP5;
++                      used_reqs[27] = DMA_USBEP5;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_USBEP6:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_USBEP6;
++                      used_reqs[28] = DMA_USBEP6;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC2_RX:
++              if (used_reqs[28] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC28(3))
++                          | MCF_DMA_IMCR_SRC28_PSC2RX;
++                      used_reqs[28] = DMA_PSC2_RX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC2_TX:
++              if (used_reqs[29] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC29(3))
++                          | MCF_DMA_IMCR_SRC29_PSC2TX;
++                      used_reqs[29] = DMA_PSC2_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC3_RX:
++              if (used_reqs[30] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC30(3))
++                          | MCF_DMA_IMCR_SRC30_PSC3RX;
++                      used_reqs[30] = DMA_PSC3_RX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      case DMA_PSC3_TX:
++              if (used_reqs[31] == 0) {
++                      MCF_DMA_IMCR = (MCF_DMA_IMCR & ~MCF_DMA_IMCR_SRC31(3))
++                          | MCF_DMA_IMCR_SRC31_PSC3TX;
++                      used_reqs[31] = DMA_PSC3_TX;
++              } else          /* No empty slots */
++                      return 1;
++              break;
++
++      default:
++              return 1;
++      }
++      return 0;
++}
++
++/**
++ * dma_get_initiator - get the initiator for the given requestor
++ * @requestor: initiator identifier
++ *
++ * Returns initiator number (0-31) if assigned or just 0
++ */
++unsigned int dma_get_initiator(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof(used_reqs); ++i) {
++              if (used_reqs[i] == requestor)
++                      return i;
++      }
++      return 0;
++}
++
++/**
++ * dma_remove_initiator - remove the given initiator from active list
++ * @requestor: requestor to remove
++ */
++void dma_remove_initiator(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof(used_reqs); ++i) {
++              if (used_reqs[i] == requestor) {
++                      used_reqs[i] = -1;
++                      break;
++              }
++      }
++}
++
++/**
++ * dma_set_channel_fec: find available channel for fec and mark
++ * @requestor: initiator/requestor identifier
++ *
++ * Returns first avaialble channel (0-5) or -1 if all occupied
++ */
++int dma_set_channel_fec(int requestor)
++{
++      u32 i, t;
++
++#ifdef CONFIG_FEC_548x_ENABLE_FEC2
++      t = 4;
++#else
++      t = 2;
++#endif
++
++      for (i = 0; i < t ; ++i) {
++              if (used_channel[i] == -1) {
++                      used_channel[i] = requestor;
++                      return i;
++              }
++      }
++      /* All channels taken */
++      return -1;
++}
++
++/**
++ * dma_set_channel - find an available channel and mark as used
++ * @requestor: initiator/requestor identifier
++ *
++ * Returns first available channel (6-15) or -1 if all occupied
++ */
++int dma_set_channel(int requestor)
++{
++      u32 i;
++#ifdef CONFIG_NET_FEC2
++      i = 4;
++#else
++      i = 2;
++#endif
++
++      for (; i < 16; ++i)
++              if (used_channel[i] == -1) {
++                      used_channel[i] = requestor;
++                      return i;
++              }
++
++      /* All channels taken */
++      return -1;
++}
++
++/**
++ * dma_get_channel - get the channel being initiated by the requestor
++ * @requestor: initiator/requestor identifier
++ *
++ * Returns Initiator for requestor or -1 if not found
++ */
++int dma_get_channel(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof(used_channel); ++i) {
++              if (used_channel[i] == requestor)
++                      return i;
++      }
++      return -1;
++}
++
++/**
++ * dma_connect - connect a channel with reference on data
++ * @channel: channel number
++ * @address: reference address of data
++ *
++ * Returns 0 if success or -1 if invalid channel
++ */
++int dma_connect(int channel, int address)
++{
++      if ((channel < 16) && (channel >= 0)) {
++              connected_channel[channel] = address;
++              return 0;
++      }
++      return -1;
++}
++
++/**
++ * dma_disconnect - disconnect a channel
++ * @channel: channel number
++ *
++ * Returns 0 if success or -1 if invalid channel
++ */
++int dma_disconnect(int channel)
++{
++      if ((channel < 16) && (channel >= 0)) {
++              connected_channel[channel] = 0;
++              return 0;
++      }
++      return -1;
++}
++
++/**
++ * dma_remove_channel - remove channel from the active list
++ * @requestor: initiator/requestor identifier
++ */
++void dma_remove_channel(int requestor)
++{
++      u32 i;
++
++      for (i = 0; i < sizeof(used_channel); ++i) {
++              if (used_channel[i] == requestor) {
++                      used_channel[i] = -1;
++                      break;
++              }
++      }
++}
++
++/**
++ * dma_interrupt_handler - dma interrupt handler
++ * @irq: interrupt number
++ * @dev_id: data
++ *
++ * Returns IRQ_HANDLED
++ */
++irqreturn_t dma_interrupt_handler(int irq, void *dev_id)
++{
++      u32 i, interrupts;
++
++      /*
++       * Determine which interrupt(s) triggered by AND'ing the
++       * pending interrupts with those that aren't masked.
++       */
++      interrupts = MCF_DMA_DIPR;
++      MCF_DMA_DIPR |= interrupts;
++
++      for (i = 0; i < 16; ++i, interrupts >>= 1) {
++              if (interrupts & 0x1)
++                      if (connected_channel[i] != 0)
++                              ((void (*)(void)) (connected_channel[i])) ();
++      }
++
++      return IRQ_HANDLED;
++}
++
++/**
++ * dma_remove_channel_by_number - clear dma channel
++ * @channel: channel number to clear
++ */
++void dma_remove_channel_by_number(int channel)
++{
++      if ((channel < sizeof(used_channel)) && (channel >= 0))
++              used_channel[channel] = -1;
++}
++
++/**
++ * dma_init - initialize the dma subsystem
++ *
++ * Returns 0 if success non-zero if failure
++ *
++ * Handles the DMA initialization during device setup.
++ */
++int __devinit dma_init()
++{
++      int result;
++      char *dma_version_str;
++
++      MCD_getVersion(&dma_version_str);
++      printk(KERN_INFO "m547x_8x DMA: Initialize %s\n", dma_version_str);
++
++      /* attempt to setup dma interrupt handler */
++      if (request_irq(64 + ISC_DMA, dma_interrupt_handler, IRQF_DISABLED,
++                      "MCD-DMA", NULL)) {
++              printk(KERN_ERR "MCD-DMA: Cannot allocate the DMA IRQ(48)\n");
++              return 1;
++      }
++
++      MCF_DMA_DIMR = 0;
++      MCF_DMA_DIPR = 0xFFFFFFFF;
++
++      MCF_ICR(ISC_DMA) = ILP_DMA;
++
++      result = MCD_initDma((dmaRegs *) (MCF_MBAR + 0x8000),
++                      (void *) SYS_SRAM_DMA_START, MCD_RELOC_TASKS);
++      if (result != MCD_OK) {
++              printk(KERN_ERR "MCD-DMA: Cannot perform DMA initialization\n");
++              free_irq(64 + ISC_DMA, NULL);
++              return 1;
++      }
++
++      return 0;
++}
++device_initcall(dma_init);
+--- a/drivers/dma/MCD_dma.h
++++ b/drivers/dma/MCD_dma.h
+@@ -1,45 +1,27 @@
+-/*********************************************************************
+- *
+- * Copyright (C) 2004  Motorola, Inc.
+- *  MOTOROLA, INC. All Rights Reserved.
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This
+- *  software is provided on an "AS IS" basis and without warranty.
++/*
++ * drivers/dma/MCD_dma.h
+  *
+- *  To the maximum extent permitted by applicable law, MOTOROLA
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
+- *  ACCOMPANYING WRITTEN MATERIALS.
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ * 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.
+  *
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
+-
+-/*
+- * File:        MCD_dma.h
+- * Purpose:     Main header file for multi-channel DMA API.
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
+- * Notes:
+- *
+- * Modifications:
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
+  */
+ #ifndef _MCD_API_H
+ #define _MCD_API_H
+-#include <asm/types.h>
+-
+ /*
+  * Turn Execution Unit tasks ON (#define) or OFF (#undef)
+  */
+@@ -79,26 +61,13 @@
+ /*
+  * Portability typedefs
+  */
+- /*
+-#ifndef s32
+ typedef int s32;
+-#endif
+-#ifndef u32
+ typedef unsigned int u32;
+-#endif
+-#ifndef s16
+ typedef short s16;
+-#endif
+-#ifndef u16
+ typedef unsigned short u16;
+-#endif
+-#ifndef s8
+ typedef char s8;
+-#endif
+-#ifndef u8
+ typedef unsigned char u8;
+-#endif
+-*/
++
+ /*
+  * These structures represent the internal registers of the
+  * multi-channel DMA
+@@ -233,6 +202,7 @@ typedef volatile struct dmaRegs_s dmaReg
+ #define MCD_TT_FLAGS_RL   0x00000001 /* Read line */
+ #define MCD_TT_FLAGS_CW   0x00000002 /* Combine Writes */
+ #define MCD_TT_FLAGS_SP   0x00000004 /* Speculative prefetch(XLB) MCF547x/548x ONLY  */
++#define MCD_TT_FLAGS_PI   0x00000040 /* Precise Increment */
+ #define MCD_TT_FLAGS_MASK 0x000000ff
+ #define MCD_TT_FLAGS_DEF  (MCD_TT_FLAGS_RL | MCD_TT_FLAGS_CW)
+--- a/drivers/dma/MCD_dmaApi.c
++++ b/drivers/dma/MCD_dmaApi.c
+@@ -1,46 +1,26 @@
+-/*********************************************************************
+- *
+- * Copyright (C) 2004  Motorola, Inc.
+- *  MOTOROLA, INC. All Rights Reserved.
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This
+- *  software is provided on an "AS IS" basis and without warranty.
+- *
+- *  To the maximum extent permitted by applicable law, MOTOROLA
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
+- *  ACCOMPANYING WRITTEN MATERIALS.
+- *
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
+- *
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
+-
+ /*
+- * File:        MCD_dmaApi.c
+- * Purpose:     Main C file for multi-channel DMA API.
+- *
+- * Notes:
++ * drivers/dma/MCD_dmaApi.c
+  *
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
+- * Modifications:
++ * 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.
+  *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
+  */
+-#include <asm/types.h>
+-#include <asm/MCD_dma.h>
+-#include <asm/virtconvert.h>
++
++#include "MCD_dma.h"
+ #include "MCD_tasksInit.h"
+ #include "MCD_progCheck.h"
+@@ -148,7 +128,6 @@ MCD_bufDesc *MCD_relocBuffDesc;
+ /*
+  * Structure to remember which variant is on which channel
+- * TBD- need this?
+  */
+ typedef struct MCD_remVariants_struct MCD_remVariant;
+ struct MCD_remVariants_struct
+@@ -164,6 +143,7 @@ struct MCD_remVariants_struct
+  * Structure to remember the startDma parameters for each channel
+  */
+ MCD_remVariant MCD_remVariants;
++
+ /********************************************************************/
+ /*
+  * Function: MCD_initDma
+@@ -185,15 +165,14 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+     int i;
+     TaskTableEntry *entryPtr;
+-    /* setup the local pointer to register set */
++    /* Setup the local pointer to register set */
+     MCD_dmaBar = dmaBarAddr;
+-    /* do we need to move/create a task table */
++    /* Do we need to move/create a task table */
+     if ((flags & MCD_RELOC_TASKS) != 0)
+     {
+         int fixedSize;
+         u32 *fixedPtr;
+-        /*int *tablePtr = taskTableDest;TBD*/
+         int varTabsOffset, funcDescTabsOffset, contextSavesOffset;
+         int taskDescTabsOffset;
+         int taskTableSize, varTabsSize, funcDescTabsSize, contextSavesSize;
+@@ -201,7 +180,7 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+         int i;
+-        /* check if physical address is aligned on 512 byte boundary */
++        /* Check if physical address is aligned on 512 byte boundary */
+         if (((u32)taskTableDest & 0x000001ff) != 0)
+             return(MCD_TABLE_UNALIGNED);
+@@ -215,13 +194,12 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+          * - copy over model task table with the the actual task descriptor
+          *   tables
+          */
+-
+         taskTableSize = NCHANNELS * sizeof(TaskTableEntry);
+-        /* align variable tables to size */
++        /* Align variable tables to size */
+         varTabsOffset = taskTableSize + (u32)taskTableDest;
+         if ((varTabsOffset & (VAR_TAB_SIZE - 1)) != 0)
+             varTabsOffset = (varTabsOffset + VAR_TAB_SIZE) & (~VAR_TAB_SIZE);
+-        /* align function descriptor tables */
++        /* Align function descriptor tables */
+         varTabsSize = NCHANNELS * VAR_TAB_SIZE;
+         funcDescTabsOffset = varTabsOffset + varTabsSize;
+@@ -235,13 +213,13 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+         fixedSize = taskTableSize + varTabsSize + funcDescTabsSize +
+                     contextSavesSize;
+-        /* zero the thing out */
++        /* Zero the thing out */
+         fixedPtr = (u32 *)taskTableDest;
+         for (i = 0;i<(fixedSize/4);i++)
+             fixedPtr[i] = 0;
+         entryPtr = (TaskTableEntry*)MCD_taskTable;
+-        /* set up fixed pointers */
++        /* Set up fixed pointers */
+         for (i = 0; i < NCHANNELS; i++)
+         {
+             entryPtr[i].varTab = (u32)varTabsOffset; /* update ptr to local value */
+@@ -253,25 +231,25 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+ #endif
+             contextSavesOffset += CONTEXT_SAVE_SIZE;
+         }
+-        /* copy over the function descriptor table */
++        /* Copy over the function descriptor table */
+         for ( i = 0; i < FUNCDESC_TAB_NUM; i++)
+         {
+             MCD_memcpy((void*)(entryPtr[i].FDTandFlags & ~MCD_TT_FLAGS_MASK),
+                        (void*)MCD_funcDescTab0, FUNCDESC_TAB_SIZE);
+         }
+-        /* copy model task table to where the context saves stuff leaves off*/
++        /* Copy model task table to where the context save stuff leaves off */
+         MCD_modelTaskTable = (TaskTableEntry*)contextSavesOffset;
+         MCD_memcpy ((void*)MCD_modelTaskTable, (void*)MCD_modelTaskTableSrc,
+                     NUMOFVARIANTS * sizeof(TaskTableEntry));
+-        entryPtr = MCD_modelTaskTable; /* point to local version of
+-                                                            model task table */
++        /* Point to local version of model task table */
++        entryPtr = MCD_modelTaskTable;
+         taskDescTabsOffset = (u32)MCD_modelTaskTable +
+                             (NUMOFVARIANTS * sizeof(TaskTableEntry));
+-        /* copy actual task code and update TDT ptrs in local model task table */
++        /* Copy actual task code and update TDT ptrs in local model task table */
+         for (i = 0; i < NUMOFVARIANTS; i++)
+         {
+             taskDescTabSize = entryPtr[i].TDTend - entryPtr[i].TDTstart + 4;
+@@ -280,25 +258,29 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+             taskDescTabsOffset += taskDescTabSize;
+             entryPtr[i].TDTend = (u32)taskDescTabsOffset - 4;
+         }
+-#ifdef MCD_INCLUDE_EU /* Tack single DMA BDs onto end of code so API controls
+-                         where they are since DMA might write to them */        
++#ifdef MCD_INCLUDE_EU 
++        /* 
++         * Tack single DMA BDs onto end of code so API controls where
++         * they are since DMA might write to them 
++         */
+         MCD_relocBuffDesc = (MCD_bufDesc*)(entryPtr[NUMOFVARIANTS - 1].TDTend + 4);
+-#else /* DMA does not touch them so they can be wherever and we don't need to 
+-         waste SRAM on them */
++#else 
++        /* 
++         * DMA does not touch them so they can be wherever and we don't need to
++         * waste SRAM on them 
++         */
+         MCD_relocBuffDesc = MCD_singleBufDescs;
+ #endif
+     }
+     else
+     {
+-        /* point the would-be relocated task tables and the
+-        buffer descriptors to the ones the linker generated */
+-
++        /* 
++         * Point the would-be relocated task tables and the buffer descriptors
++         * to the ones the linker generated
++         */
+         if (((u32)MCD_realTaskTableSrc & 0x000001ff) != 0)
+             return(MCD_TABLE_UNALIGNED);
+-        /* need to add code to make sure that every thing else is aligned properly TBD*/
+-        /* this is problematic if we init more than once or after running tasks,
+-            need to add variable to see if we have aleady init'd */
+         entryPtr = MCD_realTaskTableSrc;
+         for (i = 0; i < NCHANNELS; i++)
+         {
+@@ -312,9 +294,7 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+         MCD_relocBuffDesc = MCD_singleBufDescs;
+     }
+-
+-    /* Make all channels as totally inactive, and remember them as such: */
+-
++    /* Make all channels inactive, and remember them as such: */
+     MCD_dmaBar->taskbar = (u32) MCD_taskTable;
+     for (i = 0;  i < NCHANNELS;  i++)
+     {
+@@ -323,13 +303,12 @@ int MCD_initDma (dmaRegs *dmaBarAddr, vo
+     }
+    /* Set up pausing mechanism to inactive state: */
+-    MCD_dmaBar->debugComp1 = 0;  /* no particular values yet for either comparator registers */
++    MCD_dmaBar->debugComp1 = 0;
+     MCD_dmaBar->debugComp2 = 0;
+     MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
+     MCD_dmaBar->debugStatus = DBG_KILL_ALL_STAT;
+-    /* enable or disable commbus prefetch, really need an ifdef or
+-       something to keep from trying to set this in the 8220 */
++    /* Enable or disable commbus prefetch */
+     if ((flags & MCD_COMM_PREFETCH_EN) != 0)
+         MCD_dmaBar->ptdControl &= ~PTD_CTL_COMM_PREFETCH;
+     else
+@@ -354,8 +333,7 @@ int MCD_dmaStatus (int channel)
+     tcrValue = MCD_dmaBar->taskControl[channel];
+     if ((tcrValue & TASK_CTL_EN) == 0)
+-    {  /* nothing running */
+-        /* if last reported with task enabled */
++    {   /* Nothing running if last reported with task enabled */
+         if (   MCD_chStatus[channel] == MCD_RUNNING
+             || MCD_chStatus[channel] == MCD_IDLE)
+             MCD_chStatus[channel] = MCD_DONE;
+@@ -367,13 +345,12 @@ int MCD_dmaStatus (int channel)
+             || MCD_chStatus[channel] == MCD_IDLE)
+         {
+             MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT;
+-            /* This register is selected to know which initiator is
+-            actually asserted. */
++            /* Determine which initiator is asserted. */
+             if ((MCD_dmaBar->ptdDebug >> channel ) & 0x1 )
+                 MCD_chStatus[channel] = MCD_RUNNING;
+             else
+                 MCD_chStatus[channel] = MCD_IDLE;
+-        /* do not change the status if it is already paused. */
++            /* Do not change the status if it is already paused */
+         }
+     }
+     return MCD_chStatus[channel];
+@@ -414,67 +391,86 @@ int MCD_startDma (
+     if((channel < 0) || (channel >= NCHANNELS))
+         return(MCD_CHANNEL_INVALID);
+-        
+-    /* tbd - need to determine the proper response to a bad funcDesc when not 
+-       including EU functions, for now, assign a benign funcDesc, but maybe
+-       should return an error */
++
+ #ifndef MCD_INCLUDE_EU
+     funcDesc = MCD_FUNC_NOEU1;
+ #endif
+-        
++
+ #ifdef MCD_DEBUG
+ printf("startDma:Setting up params\n");
+ #endif
+-   /* Set us up for task-wise priority.  We don't technically need to do this on every start, but
+-      since the register involved is in the same longword as other registers that users are in control
+-      of, setting it more than once is probably preferable.  That since the documentation doesn't seem
+-      to be completely consistent about the nature of the PTD control register. */
++
++   /* Enable task-wise priority */
+     MCD_dmaBar->ptdControl |= (u16) 0x8000;
+-#if 1 /* Not sure what we need to keep here rtm TBD */
++
+     /* Calculate additional parameters to the regular DMA calls. */
+     srcRsdIncr = srcIncr < 0 ? -1 : (srcIncr > 0 ? 1 : 0);
+     destRsdIncr = destIncr < 0 ? -1 : (destIncr > 0 ? 1 : 0);
+-
+     xferSizeIncr = (xferSize & 0xffff) | 0x20000000;
+-    /* Remember for each channel which variant is running. */
++    /* Remember which variant is running for each channel */
+     MCD_remVariants.remSrcRsdIncr[channel] = srcRsdIncr;
+     MCD_remVariants.remDestRsdIncr[channel] = destRsdIncr;
+     MCD_remVariants.remDestIncr[channel] = destIncr;
+     MCD_remVariants.remSrcIncr[channel] = srcIncr;
+     MCD_remVariants.remXferSize[channel] = xferSize;
+-#endif
+-    cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) + CSAVE_OFFSET + CURRBD;
++    cSave = (int*)(MCD_taskTable[channel].contextSaveSpace) 
++            + CSAVE_OFFSET 
++            + CURRBD;
+-#ifdef MCD_INCLUDE_EU /* may move this to EU specific calls */
++#ifdef MCD_INCLUDE_EU
+     realFuncArray = (u32 *) (MCD_taskTable[channel].FDTandFlags & 0xffffff00);
+-    /* Modify the LURC's normal and byte-residue-loop functions according to parameter. */
+-    realFuncArray[(LURC*16)] = xferSize == 4 ?
+-                                 funcDesc : xferSize == 2 ?
+-                                     funcDesc & 0xfffff00f : funcDesc & 0xffff000f;
+-    realFuncArray[(LURC*16+1)] = (funcDesc & MCD_BYTE_SWAP_KILLER) | MCD_NO_BYTE_SWAP_ATALL;
+-#endif
+-   /* Write the initiator field in the TCR, and also set the initiator-hold
+-      bit.  Note that,due to a hardware quirk, this could collide with an
+-      MDE access to the initiator-register file, so we have to verify that the write
+-      reads back correctly. */
+-    MCD_dmaBar->taskControl[channel] =
+-        (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
++    /* 
++     * Modify the LURC's normal and byte-residue-loop functions 
++     * according to parameter. 
++     */
++    switch (xferSize)
++    {
++        case 4:
++            realFuncArray[(LURC*16)] = funcDesc;
++            break;
++        case 2:
++            realFuncArray[(LURC*16)] = funcDesc & 0xfffff00f;
++            break;
++        case 1:
++        default:
++            realFuncArray[(LURC*16)] = funcDesc & 0xffff000f;
++            break;
++    }
++    realFuncArray[(LURC*16+1)] = 0
++        | (funcDesc & MCD_BYTE_SWAP_KILLER) 
++        | MCD_NO_BYTE_SWAP_ATALL;
++#endif
++
++   /* Write the initiator field in the TCR and set the initiator-hold bit*/
++    MCD_dmaBar->taskControl[channel] = 0
++        | (initiator << 8)
++        | TASK_CTL_HIPRITSKEN
++        | TASK_CTL_HLDINITNUM;
++
++    /* 
++     * Current versions of the MPC8220 MCD have a hardware quirk that could
++     * cause the write to the TCR to collide with an MDE access to the 
++     * initiator-register file, so we have to verify that the write occurred
++     * correctly by reading back the value.  On MCF547x/8x devices and any
++     * future revisions of the MPC8220, this loop will not be entered.
++     */
+     while(((MCD_dmaBar->taskControl[channel] & 0x1fff) !=
+           ((initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM)) &&
+             (tcrCount < 1000))
+     {
+         tcrCount++;
+-        /*MCD_dmaBar->ptd_tcr[channel] = (initiator << 8) | 0x0020;*/
+-        MCD_dmaBar->taskControl[channel] =
+-            (initiator << 8) | TASK_CTL_HIPRITSKEN | TASK_CTL_HLDINITNUM;
++        MCD_dmaBar->taskControl[channel] = 0
++            | (initiator << 8)
++            | TASK_CTL_HIPRITSKEN
++            | TASK_CTL_HLDINITNUM;
+     }
+     MCD_dmaBar->priority[channel] = (u8)priority & PRIORITY_PRI_MASK;
+-    /* should be albe to handle this stuff with only one write to ts reg - tbd */
++
+     if (channel < 8 && channel >= 0)
+     {
+         MCD_dmaBar->taskSize0 &= ~(0xf << (7-channel)*4);
+@@ -488,7 +484,7 @@ printf("startDma:Setting up params\n");
+         MCD_dmaBar->taskSize1 |= (xferSize & 3) << ((15 - channel)*4);
+     }
+-    /* setup task table flags/options which mostly control the line buffers */
++    /* Setup task table flags/options */
+     MCD_taskTable[channel].FDTandFlags &= ~MCD_TT_FLAGS_MASK;
+     MCD_taskTable[channel].FDTandFlags |= (MCD_TT_FLAGS_MASK & flags);
+@@ -508,79 +504,86 @@ printf("startDma:Setting up params\n");
+     }
+     else if(flags & MCD_SINGLE_DMA)
+     {
+-        /* this buffer descriptor is used for storing off initial parameters for later
+-           progress query calculation and for the DMA to write the resulting checksum
+-           The DMA does not use this to determine how to operate, that info is passed
+-           with the init routine*/
++        /* 
++         * This buffer descriptor is used for storing off initial parameters 
++         * for later progress query calculation and for the DMA to write the 
++         * resulting checksum. The DMA does not use this to determine how to 
++         * operate, that info is passed with the init routine
++         */
+         MCD_relocBuffDesc[channel].srcAddr = srcAddr;
+         MCD_relocBuffDesc[channel].destAddr = destAddr;
+-        MCD_relocBuffDesc[channel].lastDestAddr = destAddr;  /* definitely not its final value */
++        MCD_relocBuffDesc[channel].lastDestAddr = destAddr;
+         MCD_relocBuffDesc[channel].dmaSize = dmaSize;
+         MCD_relocBuffDesc[channel].flags = 0;       /* not used */
+         MCD_relocBuffDesc[channel].csumResult = 0;  /* not used */
+         MCD_relocBuffDesc[channel].next = 0;        /* not used */
+         /* Initialize the progress-querying stuff to show no progress:*/
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] = (int)srcAddr;
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] = (int)destAddr;
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] =
+-                                             (u32) &(MCD_relocBuffDesc[channel]);
+-        /* tbd - need to keep the user from trying to call the EU routine
+-           when MCD_INCLUDE_EU is not defined */
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET] 
++            = (int)srcAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET] 
++            = (int)destAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] 
++            = 0;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] 
++            = (u32) &(MCD_relocBuffDesc[channel]);
++
+         if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
+         {
+-           /* TDTStart and TDTEnd */
+-           MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart;
+-           MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend;
+-           MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
+-                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
+-                                MCD_taskTable, channel);
++            /* TDTStart and TDTEnd */
++            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLENOEU].TDTstart;
++            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLENOEU].TDTend;
++            MCD_startDmaSingleNoEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize,
++                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), 
++                                cSave, MCD_taskTable, channel);
+         }
+         else
+         {
+-           /* TDTStart and TDTEnd */
+-           MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart;
+-           MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend;
+-           MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize, dmaSize,
+-                              xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), cSave,
+-                              MCD_taskTable, channel);
++            /* TDTStart and TDTEnd */
++            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_SINGLEEU].TDTstart;
++            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_SINGLEEU].TDTend;
++            MCD_startDmaSingleEu(srcAddr, srcIncr, destAddr, destIncr, dmaSize,
++                                xferSizeIncr, flags, (int *)&(MCD_relocBuffDesc[channel]), 
++                                cSave, MCD_taskTable, channel);
+         }
+     }
+-    else
+-    { /* chained DMAS */
++    else /* Chained DMA */
++    {
+         /* Initialize the progress-querying stuff to show no progress:*/
+ #if 1 /* (!defined(MCD_NEED_ADDR_TRANS)) */
+         ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
+-          = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->srcAddr;
++            = (int)((MCD_bufDesc*) srcAddr)->srcAddr;
+         ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
+-          = (int)((MCD_bufDesc*) phys_to_virt(srcAddr))->destAddr;
++            = (int)((MCD_bufDesc*) srcAddr)->destAddr;
+ #else /* if using address translation, need the virtual addr of the first buffdesc */
+         ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET]
+           = (int)((MCD_bufDesc*) srcAddrVirt)->srcAddr;
+         ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DESTPTR + CSAVE_OFFSET]
+           = (int)((MCD_bufDesc*) srcAddrVirt)->destAddr;
+ #endif
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] = 0;
+-        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] = (u32) srcAddr;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET] 
++          = 0;
++        ((volatile int *)MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET] 
++          = (u32) srcAddr;
+         if( funcDesc == MCD_FUNC_NOEU1 || funcDesc == MCD_FUNC_NOEU2)
+         {
+-          /*TDTStart and TDTEnd*/
+-          MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart;
+-          MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend;
+-          MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize,
++            /* TDTStart and TDTEnd */
++            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINNOEU].TDTstart;
++            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINNOEU].TDTend;
++            MCD_startDmaChainNoEu((int *)srcAddr, srcIncr, destIncr, xferSize,
+                                     xferSizeIncr, cSave, MCD_taskTable, channel);
+         }
+         else
+         {
+-          /*TDTStart and TDTEnd*/
+-          MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart;
+-          MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend;
+-          MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize,
++            /* TDTStart and TDTEnd */
++            MCD_taskTable[channel].TDTstart = MCD_modelTaskTable[TASK_CHAINEU].TDTstart;
++            MCD_taskTable[channel].TDTend = MCD_modelTaskTable[TASK_CHAINEU].TDTend;
++            MCD_startDmaChainEu((int *)srcAddr, srcIncr, destIncr, xferSize,
+                                  xferSizeIncr, cSave, MCD_taskTable, channel);
+         }
+     }
++
+     MCD_chStatus[channel] = MCD_IDLE;
+     return(MCD_OK);
+ }
+@@ -597,7 +600,7 @@ printf("startDma:Setting up params\n");
+  * Notes:
+  *  MCD_XferProgrQuery() upon completing or after aborting a DMA, or
+  *  while the DMA is in progress, this function returns the first
+- *  DMA-destination address not (or not yet) used in the DMA. When 
++ *  DMA-destination address not (or not yet) used in the DMA. When
+  *  encountering a non-ready buffer descriptor, the information for
+  *  the last completed descriptor is returned.
+  *
+@@ -642,11 +645,13 @@ int MCD_XferProgrQuery (int channel, MCD
+     prevRep.dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
+     prevRep.currBufDesc =
+           (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
++
+     /* Repeatedly reread those values until they match previous values: */
+     do {
+-        /* Waste a little bit of time to ensure stability: */
++        /* Take a little bit of time to ensure stability: */
+         for (i = 0;  i < STABTIME;  i++)
+-            i += i >> 2;  /* make sure this loop does something so that it doesn't get optimized out */
++            i += i >> 2;  /* make sure this loop does something so that it 
++                             doesn't get optimized out */
+         /* Check them again: */
+         progRep->lastSrcAddr =
+             (s8 *) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[SRCPTR + CSAVE_OFFSET];
+@@ -655,31 +660,33 @@ int MCD_XferProgrQuery (int channel, MCD
+         progRep->dmaSize = ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[DCOUNT + CSAVE_OFFSET];
+         progRep->currBufDesc =
+             (MCD_bufDesc*) ((volatile int*) MCD_taskTable[channel].contextSaveSpace)[CURRBD + CSAVE_OFFSET];
+-       /* See if they match: */
+-       if (   prevRep.lastSrcAddr != progRep->lastSrcAddr
+-           || prevRep.lastDestAddr != progRep->lastDestAddr
+-           || prevRep.dmaSize != progRep->dmaSize
+-           || prevRep.currBufDesc != progRep->currBufDesc)
+-       {
+-          /* If they don't match, remember previous values and try again:*/
+-          prevRep.lastSrcAddr = progRep->lastSrcAddr;
+-          prevRep.lastDestAddr = progRep->lastDestAddr;
+-          prevRep.dmaSize = progRep->dmaSize;
+-          prevRep.currBufDesc = progRep->currBufDesc;
+-          again = MCD_TRUE;
+-       }
+-       else
++
++        /* See if they match: */
++        if (   prevRep.lastSrcAddr  != progRep->lastSrcAddr
++            || prevRep.lastDestAddr != progRep->lastDestAddr
++            || prevRep.dmaSize      != progRep->dmaSize
++            || prevRep.currBufDesc  != progRep->currBufDesc)
++        {
++            /* If they don't match, remember previous values and try again:*/
++            prevRep.lastSrcAddr = progRep->lastSrcAddr;
++            prevRep.lastDestAddr = progRep->lastDestAddr;
++            prevRep.dmaSize = progRep->dmaSize;
++            prevRep.currBufDesc = progRep->currBufDesc;
++            again = MCD_TRUE;
++        }
++        else
+           again = MCD_FALSE;
+     } while (again == MCD_TRUE);
+-    /* Update the dCount, srcAddr and destAddr */
+-    /* To calculate dmaCount, we consider destination address. C
+-       overs M1,P1,Z for destination */
+-    switch(MCD_remVariants.remDestRsdIncr[channel]) {
++    /* Update dmaSize and lastDestAddr */
++    switch(MCD_remVariants.remDestRsdIncr[channel]) 
++    {
+         case MINUS1:
+-           subModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
+-           addModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++           subModVal = ((int)progRep->lastDestAddr) 
++                        & ((MCD_remVariants.remXferSize[channel]) - 1);
++           addModVal = ((int)progRep->currBufDesc->destAddr) 
++                        & ((MCD_remVariants.remXferSize[channel]) - 1);
+            LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - addModVal;
+            LWAlignedCurrDestAddr = (progRep->lastDestAddr) - subModVal;
+            destDiffBytes = LWAlignedInitDestAddr - LWAlignedCurrDestAddr;
+@@ -692,25 +699,28 @@ int MCD_XferProgrQuery (int channel, MCD
+            progRep->lastDestAddr = progRep->currBufDesc->destAddr;
+            break;
+         case PLUS1:
+-           /* This value has to be subtracted from the final calculated dCount. */
+-           subModVal = ((int)progRep->currBufDesc->destAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++           /* This value has to be subtracted from the final calculated dmaSize. */
++            subModVal = ((int)progRep->currBufDesc->destAddr) 
++                        & ((MCD_remVariants.remXferSize[channel]) - 1);
+            /* These bytes are already in lastDestAddr. */
+-            addModVal = ((int)progRep->lastDestAddr) & ((MCD_remVariants.remXferSize[channel]) - 1);
++            addModVal = ((int)progRep->lastDestAddr) 
++                        & ((MCD_remVariants.remXferSize[channel]) - 1);
+             LWAlignedInitDestAddr = (progRep->currBufDesc->destAddr) - subModVal;
+             LWAlignedCurrDestAddr = (progRep->lastDestAddr) - addModVal;
+             destDiffBytes = (progRep->lastDestAddr - LWAlignedInitDestAddr);
+             numIterations = ( LWAlignedCurrDestAddr - LWAlignedInitDestAddr)/MCD_remVariants.remDestIncr[channel];
+             bytesNotXfered =  numIterations *
+-                ( MCD_remVariants.remDestIncr[channel]
+-                  - MCD_remVariants.remXferSize[channel]);
+-           progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal;
+-           break;
++                              (MCD_remVariants.remDestIncr[channel]
++                             - MCD_remVariants.remXferSize[channel]);
++            progRep->dmaSize = destDiffBytes - bytesNotXfered - subModVal;
++            break;
+         default:
+-           break;
++            break;
+     }
+     /* This covers M1,P1,Z for source */
+-    switch(MCD_remVariants.remSrcRsdIncr[channel]) {
++    switch(MCD_remVariants.remSrcRsdIncr[channel]) 
++    {
+         case MINUS1:
+             progRep->lastSrcAddr =
+                 progRep->currBufDesc->srcAddr +
+@@ -720,13 +730,14 @@ int MCD_XferProgrQuery (int channel, MCD
+         case ZERO:
+             progRep->lastSrcAddr = progRep->currBufDesc->srcAddr;
+             break;
+-       case PLUS1:
++        case PLUS1:
+             progRep->lastSrcAddr =
+                 progRep->currBufDesc->srcAddr +
+                  ( MCD_remVariants.remSrcIncr[channel] *
+                    (progRep->dmaSize/MCD_remVariants.remXferSize[channel]));
+-          break;
+-       default: break;
++            break;
++        default: 
++            break;
+     }
+     return(MCD_OK);
+@@ -744,8 +755,10 @@ static void MCD_resmActions (int channel
+ {
+    MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
+    MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;
+-   MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; /* This register is selected to know
+-                                        which initiator is actually asserted. */
++
++   /* Determine which initiators are asserted */
++   MCD_dmaBar->ptdDebug = PTD_DBG_TSK_VLD_INIT; 
++
+    if((MCD_dmaBar->ptdDebug >> channel ) & 0x1)
+        MCD_chStatus[channel] = MCD_RUNNING;
+    else
+@@ -767,27 +780,20 @@ static void MCD_resmActions (int channel
+  */
+ int MCD_killDma (int channel)
+ {
+-   /* MCD_XferProg progRep; */
+-
+     if((channel < 0) || (channel >= NCHANNELS))
+         return(MCD_CHANNEL_INVALID);
+     MCD_dmaBar->taskControl[channel] = 0x0;
+-    MCD_resumeDma (channel);
+-    /*
+-     * This must be after the write to the TCR so that the task doesn't
+-     * start up again momentarily, and before the status assignment so
+-     * as to override whatever MCD_resumeDma() may do to the channel
+-     * status.
+-     */
++    
++    /* Clean up after a paused task */
++    if (MCD_chStatus[channel] == MCD_PAUSED)
++    {
++        MCD_dmaBar->debugControl = DBG_CTL_DISABLE;
++        MCD_dmaBar->debugStatus = MCD_dmaBar->debugStatus;        
++    }
++     
+     MCD_chStatus[channel] = MCD_HALTED;
+-    /*
+-     * Update the current buffer descriptor's lastDestAddr field
+-     *
+-     * MCD_XferProgrQuery (channel, &progRep);
+-     * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
+-     */
+     return(MCD_OK);
+ }
+ /************************ End of MCD_killDma() **********************/
+@@ -843,7 +849,7 @@ int MCD_continDma (int channel)
+  * this means that bits 14 and 0 must enable debug functions before
+  * bits 1 and 2, respectively, have any effect.
+  *
+- * NOTE: It's extremely important to not pause more than one DMA channel 
++ * NOTE: It's extremely important to not pause more than one DMA channel
+  *  at a time.
+  ********************************************************************/
+@@ -856,8 +862,6 @@ int MCD_continDma (int channel)
+  */
+ int MCD_pauseDma (int channel)
+ {
+-    /* MCD_XferProg progRep; */
+-
+     if((channel < 0) || (channel >= NCHANNELS))
+         return(MCD_CHANNEL_INVALID);
+@@ -866,13 +870,6 @@ int MCD_pauseDma (int channel)
+         MCD_dmaBar->debugComp1 = channel;
+         MCD_dmaBar->debugControl = DBG_CTL_ENABLE | (1 << (channel + 16));
+         MCD_chStatus[channel] = MCD_PAUSED;
+-
+-        /*
+-         * Update the current buffer descriptor's lastDestAddr field
+-         *
+-         * MCD_XferProgrQuery (channel, &progRep);
+-         * progRep.currBufDesc->lastDestAddr = progRep.lastDestAddr;
+-         */
+     }
+     return(MCD_OK);
+ }
+@@ -929,9 +926,9 @@ int MCD_csumQuery (int channel, u32 *csu
+ int MCD_getCodeSize(void)
+ {
+ #ifdef MCD_INCLUDE_EU
+-    return(0x2b5c);
++    return(0x2b64);
+ #else
+-    return(0x173c);
++    return(0x1744);
+ #endif
+ }
+ /********************** End of MCD_getCodeSize() ********************/
+@@ -943,9 +940,9 @@ int MCD_getCodeSize(void)
+  *                    which points to the version string
+  * Returns:     Version number and version string (by reference)
+  */
+-char MCD_versionString[] = "Multi-channel DMA API Alpha v0.3 (2004-04-26)";
+-#define MCD_REV_MAJOR   0x00
+-#define MCD_REV_MINOR   0x03
++char MCD_versionString[] = "Multi-channel DMA API v1.0";
++#define MCD_REV_MAJOR   0x01
++#define MCD_REV_MINOR   0x00
+ int MCD_getVersion(char **longVersion)
+ {
+--- a/drivers/dma/MCD_progCheck.h
++++ b/drivers/dma/MCD_progCheck.h
+@@ -1,32 +1,27 @@
+-/*********************************************************************
++/*
++ * drivers/dma/MCD_progCheck.h
+  *
+- * Copyright (C) 2004  Motorola, Inc.
+- *  MOTOROLA, INC. All Rights Reserved.
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This
+- *  software is provided on an "AS IS" basis and without warranty.
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
+- *  To the maximum extent permitted by applicable law, MOTOROLA
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
+- *  ACCOMPANYING WRITTEN MATERIALS.
++ * 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.
+  *
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
+- /* This file is autogenerated. Do not change */
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
++
++/* This file is autogenerated. Do not change */
++
+ #define CURRBD 4
+ #define DCOUNT 6
+ #define DESTPTR 5
+--- a/drivers/dma/MCD_tasks.c
++++ b/drivers/dma/MCD_tasks.c
+@@ -1,44 +1,26 @@
+-/*********************************************************************
+- *
+- * Copyright (C) 2004  Motorola, Inc.
+- *  MOTOROLA, INC. All Rights Reserved.
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This
+- *  software is provided on an "AS IS" basis and without warranty.
+- *
+- *  To the maximum extent permitted by applicable law, MOTOROLA
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
+- *  ACCOMPANYING WRITTEN MATERIALS.
+- *
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
+- *
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
+ /*
+- * File:        MCD_tasks.c
+- * Purpose:     Contains task code and structures for Multi-channel DMA
+- *
+- * Notes:
++ * drivers/dma/MCD_tasks.c
+  *
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
+- * Modifications:
++ * 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.
+  *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
+  */
+-#include <asm/MCD_dma.h>
++#include "MCD_dma.h"
+ u32 MCD_varTab0[];
+ u32 MCD_varTab1[];
+@@ -922,13 +904,13 @@ u32 MCD_funcDescTab0[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ #ifdef MCD_INCLUDE_EU
+@@ -991,13 +973,13 @@ u32 MCD_funcDescTab1[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab2[]=
+@@ -1059,13 +1041,13 @@ u32 MCD_funcDescTab2[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab3[]=
+@@ -1127,13 +1109,13 @@ u32 MCD_funcDescTab3[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab4[]=
+@@ -1195,13 +1177,13 @@ u32 MCD_funcDescTab4[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab5[]=
+@@ -1263,13 +1245,13 @@ u32 MCD_funcDescTab5[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab6[]=
+@@ -1331,13 +1313,13 @@ u32 MCD_funcDescTab6[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab7[]=
+@@ -1399,13 +1381,13 @@ u32 MCD_funcDescTab7[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab8[]=
+@@ -1467,13 +1449,13 @@ u32 MCD_funcDescTab8[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab9[]=
+@@ -1535,13 +1517,13 @@ u32 MCD_funcDescTab9[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab10[]=
+@@ -1603,13 +1585,13 @@ u32 MCD_funcDescTab10[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab11[]=
+@@ -1671,13 +1653,13 @@ u32 MCD_funcDescTab11[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab12[]=
+@@ -1739,13 +1721,13 @@ u32 MCD_funcDescTab12[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab13[]=
+@@ -1807,13 +1789,13 @@ u32 MCD_funcDescTab13[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab14[]=
+@@ -1875,13 +1857,13 @@ u32 MCD_funcDescTab14[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ u32 MCD_funcDescTab15[]=
+@@ -1943,13 +1925,13 @@ u32 MCD_funcDescTab15[]=
+     0x20400000, /* add(), EU# 3 */
+     0x20500000, /* sub(), EU# 3 */
+     0x205a0000, /* andNot(), EU# 3 */
++    0x20a00000, /* shiftR(), EU# 3 */
+     0x202fa000, /* andReadyBit(), EU# 3 */
+     0x202f9000, /* andNotReadyBit(), EU# 3 */
+     0x202ea000, /* andWrapBit(), EU# 3 */
+-    0x202da000, /* andEndFrameBit(), EU# 3 */
++    0x202da000, /* andLastBit(), EU# 3 */
+     0x202e2000, /* andInterruptBit(), EU# 3 */
+-    0x202f2000, /* andLoopBit(), EU# 3 */
+-    0x2020a000, /* andCrcRestartBit(), EU# 3 */
++    0x202f2000, /* andCrcRestartBit(), EU# 3 */
+ };
+ #endif /*MCD_INCLUDE_EU*/
+@@ -1970,7 +1952,6 @@ u32 MCD_contextSave13[128]; /* Task 13 c
+ u32 MCD_contextSave14[128]; /* Task 14 context save space */
+ u32 MCD_contextSave15[128]; /* Task 15 context save space */
+-/* Task Descriptor Tables - the guts */
+ u32 MCD_ChainNoEu_TDT[];
+ u32 MCD_SingleNoEu_TDT[];
+ #ifdef MCD_INCLUDE_EU
+@@ -1983,7 +1964,7 @@ u32 MCD_ENetXmit_TDT[];
+ u32 MCD_modelTaskTableSrc[]=
+ {
+     (u32)MCD_ChainNoEu_TDT,
+-    (u32)&((u8*)MCD_ChainNoEu_TDT)[0x00000178],
++    (u32)&((u8*)MCD_ChainNoEu_TDT)[0x0000016c],
+     0x00000000,
+     0x00000000,
+     0x00000000,
+@@ -2000,7 +1981,7 @@ u32 MCD_modelTaskTableSrc[]=
+     0x00000000,
+ #ifdef MCD_INCLUDE_EU
+     (u32)MCD_ChainEu_TDT,
+-    (u32)&((u8*)MCD_ChainEu_TDT)[0x00000180],
++    (u32)&((u8*)MCD_ChainEu_TDT)[0x000001b4],
+     0x00000000,
+     0x00000000,
+     0x00000000,
+@@ -2008,7 +1989,7 @@ u32 MCD_modelTaskTableSrc[]=
+     0x00000000,
+     0x00000000,
+     (u32)MCD_SingleEu_TDT,
+-    (u32)&((u8*)MCD_SingleEu_TDT)[0x000000dc],
++    (u32)&((u8*)MCD_SingleEu_TDT)[0x00000124],
+     0x00000000,
+     0x00000000,
+     0x00000000,
+@@ -2017,7 +1998,7 @@ u32 MCD_modelTaskTableSrc[]=
+     0x00000000,
+ #endif
+     (u32)MCD_ENetRcv_TDT,
+-    (u32)&((u8*)MCD_ENetRcv_TDT)[0x0000009C],
++    (u32)&((u8*)MCD_ENetRcv_TDT)[0x000000a4],
+     0x00000000,
+     0x00000000,
+     0x00000000,
+@@ -2033,420 +2014,452 @@ u32 MCD_modelTaskTableSrc[]=
+     0x00000000,
+     0x00000000,
+ };
+-
+ u32 MCD_ChainNoEu_TDT[]=
+ {
+     0x80004000, /* 0000(:370):  LCDEXT: idx0 = 0x00000000; ; */
+     0x8118801b, /* 0004(:370):  LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0xb8ca0018, /* 0008(:371):    LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
+-    0x10004b10, /* 000C(:372):      DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x7000000c, /* 0010(:373):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x024cf89f, /* 0014(:373):      DRD2B1: var9 = EU3(); EU3(idx2)  */
+-    0x60000009, /* 0018(:374):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
++    0xb8c60018, /* 0008(:371):    LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */
++    0x10002b10, /* 000C(:372):      DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000d, /* 0010(:373):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x018cf89f, /* 0014(:373):      DRD2B1: var6 = EU3(); EU3(idx2)  */
++    0x6000000a, /* 0018(:374):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
+     0x080cf89f, /* 001C(:374):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
+     0x000001f8, /* 0020(:0):    NOP */
+-    0x98180524, /* 0024(:378):  LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
++    0x98180364, /* 0024(:378):  LCD: idx0 = idx0; idx0 == var13; idx0 += inc4 */
+     0x8118801b, /* 0028(:380):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0xf8ca001a, /* 002C(:381):      LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
+-    0xb8ca601b, /* 0030(:382):      LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
+-    0x10004310, /* 0034(:384):        DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x00001718, /* 0038(:385):        DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
+-    0xb8ca001d, /* 003C(:387):      LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
+-    0x10001f10, /* 0040(:388):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0xf8c6001a, /* 002C(:381):      LCDEXT: idx2 = *(idx1 + var12 + 8); idx2 once var0; idx2 += inc3 */
++    0xb8c6601b, /* 0030(:382):      LCD: idx3 = *(idx1 + var12 + 12); ; idx3 += inc3 */
++    0x10002710, /* 0034(:384):        DRD1A: var9 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x00000f18, /* 0038(:385):        DRD1A: var3 = idx3; FN=0 init=0 WS=0 RS=0 */
++    0xb8c6001d, /* 003C(:387):      LCD: idx2 = *(idx1 + var12 + 20); idx2 once var0; idx2 += inc3 */
++    0x10001310, /* 0040(:388):        DRD1A: var4 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+     0x60000007, /* 0044(:389):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
+-    0x020cf893, /* 0048(:389):        DRD2B1: var8 = EU3(); EU3(idx2,var19)  */
+-    0x98ca001c, /* 004C(:391):      LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
++    0x014cf88b, /* 0048(:389):        DRD2B1: var5 = EU3(); EU3(idx2,var11)  */
++    0x98c6001c, /* 004C(:391):      LCD: idx2 = idx1 + var12 + 4; idx2 once var0; idx2 += inc3 */
+     0x00000710, /* 0050(:392):        DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
+-    0x98ca8018, /* 0054(:393):      LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
+-    0x10002b10, /* 0058(:394):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x0000c828, /* 005C(:395):        DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
++    0x98c70018, /* 0054(:393):      LCD: idx2 = idx1 + var14; idx2 once var0; idx2 += inc3 */
++    0x10001f10, /* 0058(:394):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c818, /* 005C(:395):        DRD1A: *idx2 = var3; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 0060(:0):      NOP */
+-    0xc14ae018, /* 0064(:399):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
+-    0xc004a51d, /* 0068(:399):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
++    0xc1476018, /* 0064(:399):    LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */
++    0xc003231d, /* 0068(:399):    LCDEXT: idx2 = var0, idx3 = var6; idx3 == var12; idx2 += inc3, idx3 += inc5 */
+     0x811a601b, /* 006C(:400):    LCD: idx4 = var2; ; idx4 += inc3 */
+-    0xc28a21c2, /* 0070(:403):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
+-    0x881be009, /* 0074(:403):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0xc1862102, /* 0070(:403):      LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */
++    0x849be009, /* 0074(:403):      LCD: idx7 = var9; ; idx7 += inc1 */
+     0x03fed7b8, /* 0078(:406):        DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
+     0xda9b001b, /* 007C(:408):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+     0x9b9be01b, /* 0080(:408):      LCD: idx7 = idx7; ; idx7 += inc3 */
+     0x1000cb20, /* 0084(:409):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 0088(:410):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 008C(:410):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 008C(:410):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb28, /* 0090(:411):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 0094(:412):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 0098(:412):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 0098(:412):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb30, /* 009C(:413):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 00A0(:414):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00A4(:414):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 00A4(:414):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb38, /* 00A8(:415):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
+     0x0000c728, /* 00AC(:416):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 00B0(:0):      NOP */
+-    0xc14ae018, /* 00B4(:420):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
+-    0xc004a5dd, /* 00B8(:420):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
++    0xc1476018, /* 00B4(:420):    LCDEXT: idx1 = var2 + var14; ; idx1 += inc3 */
++    0xc003241d, /* 00B8(:420):    LCDEXT: idx2 = var0, idx3 = var6; idx3 == var16; idx2 += inc3, idx3 += inc5 */
+     0x811a601b, /* 00BC(:421):    LCD: idx4 = var2; ; idx4 += inc3 */
+     0xda9b001b, /* 00C0(:424):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+     0x9b9be01b, /* 00C4(:424):      LCD: idx7 = idx7; ; idx7 += inc3 */
+     0x0000d3a0, /* 00C8(:425):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
+-    0xc28a21c2, /* 00CC(:427):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
+-    0x881be009, /* 00D0(:427):      LCD: idx7 = var16; ; idx7 += inc1 */
++    0xc1862102, /* 00CC(:427):      LCDEXT: idx5 = var3, idx6 = var12; idx6 < var4; idx5 += inc0, idx6 += inc2 */
++    0x849be009, /* 00D0(:427):      LCD: idx7 = var9; ; idx7 += inc1 */
+     0x0bfed7b8, /* 00D4(:430):        DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
+     0xda9b001b, /* 00D8(:432):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+     0x9b9be01b, /* 00DC(:432):      LCD: idx7 = idx7; ; idx7 += inc3 */
+     0x1000cb20, /* 00E0(:433):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 00E4(:434):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00E8(:434):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 00E8(:434):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb28, /* 00EC(:435):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 00F0(:436):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00F4(:436):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 00F4(:436):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb30, /* 00F8(:437):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+     0x70000006, /* 00FC(:438):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 0100(:438):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
++    0x088cf88f, /* 0100(:438):        DRD2B1: idx2 = EU3(); EU3(idx2,var15)  */
+     0x1000cb38, /* 0104(:439):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
+     0x0000c728, /* 0108(:440):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 010C(:0):      NOP */
+     0x8118801b, /* 0110(:444):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0x8a19001b, /* 0114(:446):      LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
+-    0x6000000e, /* 0118(:447):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
+-    0x088cf49f, /* 011C(:447):        DRD2B1: idx2 = EU3(); EU3(var18)  */
+-    0xd9190536, /* 0120(:448):      LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
+-    0x98ca0018, /* 0124(:448):      LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
+-    0x6000000a, /* 0128(:450):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
+-    0x0cccfcdf, /* 012C(:450):        DRD2B1: *idx3 = EU3(); EU3(*idx3)  */
+-    0x000001f8, /* 0130(:0):      NOP */
+-    0xa14a001e, /* 0134(:453):    LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
+-    0x10000b08, /* 0138(:454):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x10002c90, /* 013C(:455):      DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
+-    0xb8ca0018, /* 0140(:456):      LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
+-    0x10004b10, /* 0144(:457):        DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000009, /* 0148(:458):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
+-    0x080cf89f, /* 014C(:458):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
+-    0x6000000c, /* 0150(:459):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
+-    0x024cf89f, /* 0154(:459):        DRD2B1: var9 = EU3(); EU3(idx2)  */
+-    0x000001f8, /* 0158(:0):      NOP */
+-    0x8a18801b, /* 015C(:465):    LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
+-    0x7000000d, /* 0160(:466):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
+-    0x084cf2df, /* 0164(:466):      DRD2B1: idx1 = EU3(); EU3(var11)  */
+-    0xd899053f, /* 0168(:467):      LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
+-    0x8019801b, /* 016C(:467):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
+-    0x040001f8, /* 0170(:468):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+-    0x000001f8, /* 0174(:0):      NOP */
+-    0x000001f8, /* 0178(:0):    NOP */
++    0xd8c60018, /* 0114(:446):      LCDEXT: idx2 = idx1 + var12; idx2 once var0; idx2 += inc3 */
++    0x98c6601c, /* 0118(:446):      LCD: idx3 = idx1 + var12 + 4; ; idx3 += inc3 */
++    0x6000000b, /* 011C(:447):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
++    0x0c8cfc9f, /* 0120(:447):        DRD2B1: *idx2 = EU3(); EU3(*idx2)  */
++    0x000001f8, /* 0124(:0):      NOP */
++    0xa146001e, /* 0128(:450):    LCD: idx1 = *(var2 + var12 + 24); idx1 once var0; idx1 += inc3 */
++    0x10000b08, /* 012C(:451):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x10002050, /* 0130(:452):      DRD1A: var8 = var10; FN=0 MORE init=0 WS=0 RS=0 */
++    0xb8c60018, /* 0134(:453):      LCD: idx2 = *(idx1 + var12); idx2 once var0; idx2 += inc3 */
++    0x10002b10, /* 0138(:454):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000a, /* 013C(:455):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf89f, /* 0140(:455):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x6000000d, /* 0144(:456):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x018cf89f, /* 0148(:456):        DRD2B1: var6 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 014C(:0):      NOP */
++    0x8618801b, /* 0150(:462):    LCD: idx1 = var12; idx1 once var0; idx1 += inc3 */
++    0x7000000e, /* 0154(:463):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
++    0x084cf21f, /* 0158(:463):      DRD2B1: idx1 = EU3(); EU3(var8)  */
++    0xd8990336, /* 015C(:464):      LCDEXT: idx2 = idx1; idx2 > var12; idx2 += inc6 */
++    0x8019801b, /* 0160(:464):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x040001f8, /* 0164(:465):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 0168(:0):      NOP */
++    0x000001f8, /* 016C(:0):    NOP */
+ };
+ u32 MCD_SingleNoEu_TDT[]=
+ {
+-    0x8318001b, /* 0000(:646):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
+-    0x7000000c, /* 0004(:647):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x080cf81f, /* 0008(:647):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
+-    0x8318801b, /* 000C(:648):    LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
+-    0x6000000d, /* 0010(:649):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
+-    0x084cf85f, /* 0014(:649):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
++    0x8198001b, /* 0000(:657):  LCD: idx0 = var3; idx0 once var0; idx0 += inc3 */
++    0x7000000d, /* 0004(:658):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf81f, /* 0008(:658):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
++    0x8198801b, /* 000C(:659):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
++    0x6000000e, /* 0010(:660):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x084cf85f, /* 0014(:660):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
+     0x000001f8, /* 0018(:0):    NOP */
+-    0x8498001b, /* 001C(:653):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
+-    0x7000000c, /* 0020(:654):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x020cf81f, /* 0024(:654):    DRD2B1: var8 = EU3(); EU3(idx0)  */
+-    0x6000000d, /* 0028(:655):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
+-    0x028cf81f, /* 002C(:655):    DRD2B1: var10 = EU3(); EU3(idx0)  */
+-    0xc404601b, /* 0030(:658):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
+-    0xc00423dc, /* 0034(:658):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
+-    0x809a601b, /* 0038(:659):  LCD: idx4 = var1; ; idx4 += inc3 */
+-    0xc207a182, /* 003C(:662):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
+-    0x869be009, /* 0040(:662):    LCD: idx7 = var13; ; idx7 += inc1 */
+-    0x03fed7b8, /* 0044(:665):      DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
+-    0xda9b001b, /* 0048(:667):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 004C(:667):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x70000006, /* 0050(:669):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 0054(:669):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb28, /* 0058(:670):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 005C(:671):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 0060(:671):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb30, /* 0064(:672):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 0068(:673):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 006C(:673):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x0000cb38, /* 0070(:674):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x8298001b, /* 001C(:664):  LCD: idx0 = var5; idx0 once var0; idx0 += inc3 */
++    0x7000000d, /* 0020(:665):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x010cf81f, /* 0024(:665):    DRD2B1: var4 = EU3(); EU3(idx0)  */
++    0x6000000e, /* 0028(:666):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x018cf81f, /* 002C(:666):    DRD2B1: var6 = EU3(); EU3(idx0)  */
++    0xc202601b, /* 0030(:669):  LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */
++    0xc002221c, /* 0034(:669):  LCDEXT: idx2 = var0, idx3 = var4; idx3 == var8; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0038(:670):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xc10420c2, /* 003C(:673):    LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */
++    0x839be009, /* 0040(:673):    LCD: idx7 = var7; ; idx7 += inc1 */
++    0x03fed7b8, /* 0044(:676):      DRD1A: *idx7; FN=0 init=31 WS=3 RS=3 */
++    0xda9b001b, /* 0048(:678):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 004C(:678):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 0050(:680):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 0054(:680):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x1000cb28, /* 0058(:681):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 005C(:682):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 0060(:682):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x1000cb30, /* 0064(:683):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0068(:684):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 006C(:684):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x0000cb38, /* 0070(:685):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 0074(:0):    NOP */
+-    0xc404601b, /* 0078(:678):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
+-    0xc004245c, /* 007C(:678):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
+-    0x809a601b, /* 0080(:679):  LCD: idx4 = var1; ; idx4 += inc3 */
+-    0xda9b001b, /* 0084(:682):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 0088(:682):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x0000d3a0, /* 008C(:683):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
+-    0xc207a182, /* 0090(:685):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
+-    0x869be009, /* 0094(:685):    LCD: idx7 = var13; ; idx7 += inc1 */
+-    0x0bfed7b8, /* 0098(:688):      DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
+-    0xda9b001b, /* 009C(:690):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 00A0(:690):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x70000006, /* 00A4(:692):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00A8(:692):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb28, /* 00AC(:693):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00B0(:694):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00B4(:694):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb30, /* 00B8(:695):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00BC(:696):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00C0(:696):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x0000cb38, /* 00C4(:697):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0xc202601b, /* 0078(:689):  LCDEXT: idx0 = var4, idx1 = var4; ; idx0 += inc3, idx1 += inc3 */
++    0xc002229c, /* 007C(:689):  LCDEXT: idx2 = var0, idx3 = var4; idx3 == var10; idx2 += inc3, idx3 += inc4 */
++    0x809a601b, /* 0080(:690):  LCD: idx4 = var1; ; idx4 += inc3 */
++    0xda9b001b, /* 0084(:693):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0088(:693):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 008C(:694):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc10420c2, /* 0090(:696):    LCDEXT: idx5 = var2, idx6 = var8; idx6 < var3; idx5 += inc0, idx6 += inc2 */
++    0x839be009, /* 0094(:696):    LCD: idx7 = var7; ; idx7 += inc1 */
++    0x0bfed7b8, /* 0098(:699):      DRD1A: *idx7; FN=0 TFD init=31 WS=3 RS=3 */
++    0xda9b001b, /* 009C(:701):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00A0(:701):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000006, /* 00A4(:703):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 00A8(:703):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x1000cb28, /* 00AC(:704):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00B0(:705):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 00B4(:705):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x1000cb30, /* 00B8(:706):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00BC(:707):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf889, /* 00C0(:707):      DRD2B1: idx2 = EU3(); EU3(idx2,var9)  */
++    0x0000cb38, /* 00C4(:708):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 00C8(:0):    NOP */
+-    0xc51803ed, /* 00CC(:701):  LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
+-    0x8018801b, /* 00D0(:701):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
+-    0x040001f8, /* 00D4(:702):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0xc318022d, /* 00CC(:712):  LCDEXT: idx0 = var6; idx0 > var8; idx0 += inc5 */
++    0x8018801b, /* 00D0(:712):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
++    0x040001f8, /* 00D4(:713):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+ };
+ #ifdef MCD_INCLUDE_EU
+ u32 MCD_ChainEu_TDT[]=
+ {
+-    0x80004000, /* 0000(:928):  LCDEXT: idx0 = 0x00000000; ; */
+-    0x8118801b, /* 0004(:928):  LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0xb8ca0018, /* 0008(:929):    LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
+-    0x10004b10, /* 000C(:930):      DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x7000000c, /* 0010(:931):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x024cf89f, /* 0014(:931):      DRD2B1: var9 = EU3(); EU3(idx2)  */
+-    0x60000009, /* 0018(:932):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
+-    0x080cf89f, /* 001C(:932):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x80004000, /* 0000(:947):  LCDEXT: idx0 = 0x00000000; ; */
++    0x8198801b, /* 0004(:947):  LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
++    0xb8c68018, /* 0008(:948):    LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */
++    0x10002f10, /* 000C(:949):      DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000d, /* 0010(:950):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x01ccf89f, /* 0014(:950):      DRD2B1: var7 = EU3(); EU3(idx2)  */
++    0x6000000a, /* 0018(:951):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x080cf89f, /* 001C(:951):      DRD2B1: idx0 = EU3(); EU3(idx2)  */
+     0x000001f8, /* 0020(:0):    NOP */
+-    0x98180524, /* 0024(:936):  LCD: idx0 = idx0; idx0 != var20; idx0 += inc4 */
+-    0x8118801b, /* 0028(:938):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0xf8ca001a, /* 002C(:939):      LCDEXT: idx2 = *(idx1 + var20 + 8); idx2 once var0; idx2 += inc3 */
+-    0xb8ca601b, /* 0030(:940):      LCD: idx3 = *(idx1 + var20 + 12); ; idx3 += inc3 */
+-    0x10004310, /* 0034(:942):        DRD1A: var16 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x00001718, /* 0038(:943):        DRD1A: var5 = idx3; FN=0 init=0 WS=0 RS=0 */
+-    0xb8ca001d, /* 003C(:945):      LCD: idx2 = *(idx1 + var20 + 20); idx2 once var0; idx2 += inc3 */
+-    0x10001f10, /* 0040(:946):        DRD1A: var7 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000007, /* 0044(:947):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
+-    0x020cf893, /* 0048(:947):        DRD2B1: var8 = EU3(); EU3(idx2,var19)  */
+-    0x98ca001c, /* 004C(:949):      LCD: idx2 = idx1 + var20 + 4; idx2 once var0; idx2 += inc3 */
+-    0x00000710, /* 0050(:950):        DRD1A: var1 = idx2; FN=0 init=0 WS=0 RS=0 */
+-    0x98ca8018, /* 0054(:951):      LCD: idx2 = idx1 + var21; idx2 once var0; idx2 += inc3 */
+-    0x10002b10, /* 0058(:952):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x0000c828, /* 005C(:953):        DRD1A: *idx2 = var5; FN=0 init=0 WS=0 RS=0 */
++    0x981803a4, /* 0024(:955):  LCD: idx0 = idx0; idx0 == var14; idx0 += inc4 */
++    0x8198801b, /* 0028(:957):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
++    0xf8c6801a, /* 002C(:958):      LCDEXT: idx2 = *(idx1 + var13 + 8); idx2 once var0; idx2 += inc3 */
++    0xb8c6e01b, /* 0030(:959):      LCD: idx3 = *(idx1 + var13 + 12); ; idx3 += inc3 */
++    0x10002b10, /* 0034(:961):        DRD1A: var10 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x00001318, /* 0038(:962):        DRD1A: var4 = idx3; FN=0 init=0 WS=0 RS=0 */
++    0xb8c6801d, /* 003C(:964):      LCD: idx2 = *(idx1 + var13 + 20); idx2 once var0; idx2 += inc3 */
++    0x10001710, /* 0040(:965):        DRD1A: var5 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000007, /* 0044(:966):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=7 EXT init=0 WS=0 RS=0 */
++    0x018cf88c, /* 0048(:966):        DRD2B1: var6 = EU3(); EU3(idx2,var12)  */
++    0x98c6801c, /* 004C(:968):      LCD: idx2 = idx1 + var13 + 4; idx2 once var0; idx2 += inc3 */
++    0x00000b10, /* 0050(:969):        DRD1A: var2 = idx2; FN=0 init=0 WS=0 RS=0 */
++    0x98c78018, /* 0054(:970):      LCD: idx2 = idx1 + var15; idx2 once var0; idx2 += inc3 */
++    0x10002310, /* 0058(:971):        DRD1A: var8 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c820, /* 005C(:972):        DRD1A: *idx2 = var4; FN=0 init=0 WS=0 RS=0 */
+     0x000001f8, /* 0060(:0):      NOP */
+-    0xc14ae018, /* 0064(:957):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
+-    0xc004a51d, /* 0068(:957):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var20; idx2 += inc3, idx3 += inc5 */
+-    0x811a601b, /* 006C(:958):    LCD: idx4 = var2; ; idx4 += inc3 */
+-    0xc28a21c2, /* 0070(:961):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
+-    0x881be009, /* 0074(:961):      LCD: idx7 = var16; ; idx7 += inc1 */
+-    0x63fe0000, /* 0078(:964):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
+-    0x0d4cfddf, /* 007C(:964):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
+-    0xda9b001b, /* 0080(:966):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 0084(:966):      LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x1000cb20, /* 0088(:967):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 008C(:968):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 0090(:968):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb28, /* 0094(:969):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 0098(:970):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 009C(:970):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb30, /* 00A0(:971):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00A4(:972):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00A8(:972):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb38, /* 00AC(:973):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x0000c728, /* 00B0(:974):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
+-    0x000001f8, /* 00B4(:0):      NOP */
+-    0xc14ae018, /* 00B8(:978):    LCDEXT: idx1 = var2 + var21; ; idx1 += inc3 */
+-    0xc004a5dd, /* 00BC(:978):    LCDEXT: idx2 = var0, idx3 = var9; idx3 == var23; idx2 += inc3, idx3 += inc5 */
+-    0x811a601b, /* 00C0(:979):    LCD: idx4 = var2; ; idx4 += inc3 */
+-    0xda9b001b, /* 00C4(:982):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 00C8(:982):      LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x0000d3a0, /* 00CC(:983):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
+-    0xc28a21c2, /* 00D0(:985):      LCDEXT: idx5 = var5, idx6 = var20; idx6 < var7; idx5 += inc0, idx6 += inc2 */
+-    0x881be009, /* 00D4(:985):      LCD: idx7 = var16; ; idx7 += inc1 */
+-    0x6bfe0000, /* 00D8(:988):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
+-    0x0d4cfddf, /* 00DC(:988):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
+-    0xda9b001b, /* 00E0(:990):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 00E4(:990):      LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x1000cb20, /* 00E8(:991):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00EC(:992):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00F0(:992):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb28, /* 00F4(:993):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00F8(:994):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 00FC(:994):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb30, /* 0100(:995):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 0104(:996):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf896, /* 0108(:996):        DRD2B1: idx2 = EU3(); EU3(idx2,var22)  */
+-    0x1000cb38, /* 010C(:997):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x0000c728, /* 0110(:998):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
+-    0x000001f8, /* 0114(:0):      NOP */
+-    0x8118801b, /* 0118(:1002):    LCD: idx1 = var2; idx1 once var0; idx1 += inc3 */
+-    0x8a19001b, /* 011C(:1004):      LCD: idx2 = var20; idx2 once var0; idx2 += inc3 */
+-    0x6000000e, /* 0120(:1005):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
+-    0x088cf49f, /* 0124(:1005):        DRD2B1: idx2 = EU3(); EU3(var18)  */
+-    0xd9190536, /* 0128(:1006):      LCDEXT: idx2 = idx2; idx2 == var20; idx2 += inc6 */
+-    0x98ca0018, /* 012C(:1006):      LCD: idx3 = idx1 + var20; idx3 once var0; idx3 += inc3 */
+-    0x6000000a, /* 0130(:1008):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
+-    0x0cccfcdf, /* 0134(:1008):        DRD2B1: *idx3 = EU3(); EU3(*idx3)  */
+-    0x000001f8, /* 0138(:0):      NOP */
+-    0xa14a001e, /* 013C(:1011):    LCD: idx1 = *(var2 + var20 + 24); idx1 once var0; idx1 += inc3 */
+-    0x10000b08, /* 0140(:1012):      DRD1A: var2 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x10002c90, /* 0144(:1013):      DRD1A: var11 = var18; FN=0 MORE init=0 WS=0 RS=0 */
+-    0xb8ca0018, /* 0148(:1014):      LCD: idx2 = *(idx1 + var20); idx2 once var0; idx2 += inc3 */
+-    0x10004b10, /* 014C(:1015):        DRD1A: var18 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000009, /* 0150(:1016):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT MORE init=0 WS=0 RS=0 */
+-    0x080cf89f, /* 0154(:1016):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
+-    0x6000000c, /* 0158(:1017):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT init=0 WS=0 RS=0 */
+-    0x024cf89f, /* 015C(:1017):        DRD2B1: var9 = EU3(); EU3(idx2)  */
+-    0x000001f8, /* 0160(:0):      NOP */
+-    0x8a18801b, /* 0164(:1023):    LCD: idx1 = var20; idx1 once var0; idx1 += inc3 */
+-    0x7000000d, /* 0168(:1024):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
+-    0x084cf2df, /* 016C(:1024):      DRD2B1: idx1 = EU3(); EU3(var11)  */
+-    0xd899053f, /* 0170(:1025):      LCDEXT: idx2 = idx1; idx2 > var20; idx2 += inc7 */
+-    0x8019801b, /* 0174(:1025):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
+-    0x040001f8, /* 0178(:1026):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+-    0x000001f8, /* 017C(:0):      NOP */
+-    0x000001f8, /* 0180(:0):    NOP */
++    0x8698801b, /* 0064(:976):    LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */
++    0x7000000f, /* 0068(:977):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */
++    0x084cf2df, /* 006C(:977):      DRD2B1: idx1 = EU3(); EU3(var11)  */
++    0xd899042d, /* 0070(:978):      LCDEXT: idx2 = idx1; idx2 >= var16; idx2 += inc5 */
++    0x8019801b, /* 0074(:978):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x60000003, /* 0078(:979):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
++    0x2cd7c7df, /* 007C(:979):        DRD2B2: EU3(var13)  */
++    0xd8990364, /* 0080(:980):      LCDEXT: idx2 = idx1; idx2 == var13; idx2 += inc4 */
++    0x8019801b, /* 0084(:980):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x60000003, /* 0088(:981):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
++    0x2c17c7df, /* 008C(:981):        DRD2B2: EU3(var1)  */
++    0x000001f8, /* 0090(:0):      NOP */
++    0xc1c7e018, /* 0094(:984):    LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */
++    0xc003a35e, /* 0098(:984):    LCDEXT: idx2 = var0, idx3 = var7; idx3 == var13; idx2 += inc3, idx3 += inc6 */
++    0x819a601b, /* 009C(:985):    LCD: idx4 = var3; ; idx4 += inc3 */
++    0xc206a142, /* 00A0(:988):      LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */
++    0x851be009, /* 00A4(:988):      LCD: idx7 = var10; ; idx7 += inc1 */
++    0x63fe0000, /* 00A8(:991):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 00AC(:991):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 00B0(:993):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00B4(:993):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000002, /* 00B8(:994):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf81f, /* 00BC(:994):        DRD2B1: var1 = EU3(); EU3(idx0)  */
++    0x1000cb20, /* 00C0(:995):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00C4(:996):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 00C8(:996):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb28, /* 00CC(:997):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00D0(:998):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 00D4(:998):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb30, /* 00D8(:999):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00DC(:1000):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 00E0(:1000):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb38, /* 00E4(:1001):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 00E8(:1002):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00EC(:0):      NOP */
++    0xc1c7e018, /* 00F0(:1006):    LCDEXT: idx1 = var3 + var15; ; idx1 += inc3 */
++    0xc003a49e, /* 00F4(:1006):    LCDEXT: idx2 = var0, idx3 = var7; idx3 == var18; idx2 += inc3, idx3 += inc6 */
++    0x819a601b, /* 00F8(:1007):    LCD: idx4 = var3; ; idx4 += inc3 */
++    0xda9b001b, /* 00FC(:1010):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0100(:1010):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 0104(:1011):        DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc206a142, /* 0108(:1013):      LCDEXT: idx5 = var4, idx6 = var13; idx6 < var5; idx5 += inc0, idx6 += inc2 */
++    0x851be009, /* 010C(:1013):      LCD: idx7 = var10; ; idx7 += inc1 */
++    0x6bfe0000, /* 0110(:1016):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 0114(:1016):        DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 0118(:1018):      LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 011C(:1018):      LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000002, /* 0120(:1019):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf81f, /* 0124(:1019):        DRD2B1: var1 = EU3(); EU3(idx0)  */
++    0x1000cb20, /* 0128(:1020):        DRD1A: *idx2 = idx4; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 012C(:1021):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 0130(:1021):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb28, /* 0134(:1022):        DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0138(:1023):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 013C(:1023):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb30, /* 0140(:1024):        DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0144(:1025):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf891, /* 0148(:1025):        DRD2B1: idx2 = EU3(); EU3(idx2,var17)  */
++    0x1000cb38, /* 014C(:1026):        DRD1A: *idx2 = idx7; FN=0 MORE init=0 WS=0 RS=0 */
++    0x0000c728, /* 0150(:1027):        DRD1A: *idx1 = idx5; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0154(:0):      NOP */
++    0x8198801b, /* 0158(:1031):    LCD: idx1 = var3; idx1 once var0; idx1 += inc3 */
++    0xd8c68018, /* 015C(:1033):      LCDEXT: idx2 = idx1 + var13; idx2 once var0; idx2 += inc3 */
++    0x98c6e01c, /* 0160(:1033):      LCD: idx3 = idx1 + var13 + 4; ; idx3 += inc3 */
++    0x6000000b, /* 0164(:1034):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
++    0x0c8cfc9f, /* 0168(:1034):        DRD2B1: *idx2 = EU3(); EU3(*idx2)  */
++    0x0000cc08, /* 016C(:1035):      DRD1A: *idx3 = var1; FN=0 init=0 WS=0 RS=0 */
++    0xa1c6801e, /* 0170(:1038):    LCD: idx1 = *(var3 + var13 + 24); idx1 once var0; idx1 += inc3 */
++    0x10000f08, /* 0174(:1039):      DRD1A: var3 = idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x10002458, /* 0178(:1040):      DRD1A: var9 = var11; FN=0 MORE init=0 WS=0 RS=0 */
++    0xb8c68018, /* 017C(:1041):      LCD: idx2 = *(idx1 + var13); idx2 once var0; idx2 += inc3 */
++    0x10002f10, /* 0180(:1042):        DRD1A: var11 = idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x7000000a, /* 0184(:1043):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf89f, /* 0188(:1043):        DRD2B1: idx0 = EU3(); EU3(idx2)  */
++    0x6000000d, /* 018C(:1044):        DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
++    0x01ccf89f, /* 0190(:1044):        DRD2B1: var7 = EU3(); EU3(idx2)  */
++    0x000001f8, /* 0194(:0):      NOP */
++    0x8698801b, /* 0198(:1050):    LCD: idx1 = var13; idx1 once var0; idx1 += inc3 */
++    0x7000000e, /* 019C(:1051):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
++    0x084cf25f, /* 01A0(:1051):      DRD2B1: idx1 = EU3(); EU3(var9)  */
++    0xd899037f, /* 01A4(:1052):      LCDEXT: idx2 = idx1; idx2 > var13; idx2 += inc7 */
++    0x8019801b, /* 01A8(:1052):      LCD: idx3 = var0; idx3 once var0; idx3 += inc3 */
++    0x040001f8, /* 01AC(:1053):        DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 01B0(:0):      NOP */
++    0x000001f8, /* 01B4(:0):    NOP */
+ };
+ u32 MCD_SingleEu_TDT[]=
+ {
+-    0x8318001b, /* 0000(:1204):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
+-    0x7000000c, /* 0004(:1205):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x080cf81f, /* 0008(:1205):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
+-    0x8318801b, /* 000C(:1206):    LCD: idx1 = var6; idx1 once var0; idx1 += inc3 */
+-    0x6000000d, /* 0010(:1207):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
+-    0x084cf85f, /* 0014(:1207):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
++    0x8218001b, /* 0000(:1248):  LCD: idx0 = var4; idx0 once var0; idx0 += inc3 */
++    0x7000000d, /* 0004(:1249):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf81f, /* 0008(:1249):    DRD2B1: idx0 = EU3(); EU3(idx0)  */
++    0x8218801b, /* 000C(:1250):    LCD: idx1 = var4; idx1 once var0; idx1 += inc3 */
++    0x6000000e, /* 0010(:1251):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x084cf85f, /* 0014(:1251):      DRD2B1: idx1 = EU3(); EU3(idx1)  */
+     0x000001f8, /* 0018(:0):    NOP */
+-    0x8498001b, /* 001C(:1211):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
+-    0x7000000c, /* 0020(:1212):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x020cf81f, /* 0024(:1212):    DRD2B1: var8 = EU3(); EU3(idx0)  */
+-    0x6000000d, /* 0028(:1213):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT init=0 WS=0 RS=0 */
+-    0x028cf81f, /* 002C(:1213):    DRD2B1: var10 = EU3(); EU3(idx0)  */
+-    0xc404601b, /* 0030(:1216):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
+-    0xc00423dc, /* 0034(:1216):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var15; idx2 += inc3, idx3 += inc4 */
+-    0x809a601b, /* 0038(:1217):  LCD: idx4 = var1; ; idx4 += inc3 */
+-    0xc207a182, /* 003C(:1220):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
+-    0x869be009, /* 0040(:1220):    LCD: idx7 = var13; ; idx7 += inc1 */
+-    0x63fe0000, /* 0044(:1223):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
+-    0x0d4cfddf, /* 0048(:1223):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
+-    0xda9b001b, /* 004C(:1225):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 0050(:1225):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x70000006, /* 0054(:1227):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 0058(:1227):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb28, /* 005C(:1228):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 0060(:1229):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 0064(:1229):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb30, /* 0068(:1230):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 006C(:1231):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 0070(:1231):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x0000cb38, /* 0074(:1232):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
+-    0x000001f8, /* 0078(:0):    NOP */
+-    0xc404601b, /* 007C(:1236):  LCDEXT: idx0 = var8, idx1 = var8; ; idx0 += inc3, idx1 += inc3 */
+-    0xc004245c, /* 0080(:1236):  LCDEXT: idx2 = var0, idx3 = var8; idx3 == var17; idx2 += inc3, idx3 += inc4 */
+-    0x809a601b, /* 0084(:1237):  LCD: idx4 = var1; ; idx4 += inc3 */
+-    0xda9b001b, /* 0088(:1240):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 008C(:1240):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x0000d3a0, /* 0090(:1241):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
+-    0xc207a182, /* 0094(:1243):    LCDEXT: idx5 = var4, idx6 = var15; idx6 < var6; idx5 += inc0, idx6 += inc2 */
+-    0x869be009, /* 0098(:1243):    LCD: idx7 = var13; ; idx7 += inc1 */
+-    0x6bfe0000, /* 009C(:1246):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
+-    0x0d4cfddf, /* 00A0(:1246):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
+-    0xda9b001b, /* 00A4(:1248):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
+-    0x9b9be01b, /* 00A8(:1248):    LCD: idx7 = idx7; ; idx7 += inc3 */
+-    0x70000006, /* 00AC(:1250):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00B0(:1250):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb28, /* 00B4(:1251):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00B8(:1252):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00BC(:1252):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x1000cb30, /* 00C0(:1253):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x70000006, /* 00C4(:1254):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
+-    0x088cf890, /* 00C8(:1254):      DRD2B1: idx2 = EU3(); EU3(idx2,var16)  */
+-    0x0000cb38, /* 00CC(:1255):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
+-    0x000001f8, /* 00D0(:0):    NOP */
+-    0xc51803ed, /* 00D4(:1259):  LCDEXT: idx0 = var10; idx0 > var15; idx0 += inc5 */
+-    0x8018801b, /* 00D8(:1259):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
+-    0x040001f8, /* 00DC(:1260):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x8318001b, /* 001C(:1255):  LCD: idx0 = var6; idx0 once var0; idx0 += inc3 */
++    0x7000000d, /* 0020(:1256):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x014cf81f, /* 0024(:1256):    DRD2B1: var5 = EU3(); EU3(idx0)  */
++    0x6000000e, /* 0028(:1257):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT init=0 WS=0 RS=0 */
++    0x01ccf81f, /* 002C(:1257):    DRD2B1: var7 = EU3(); EU3(idx0)  */
++    0x8498001b, /* 0030(:1260):  LCD: idx0 = var9; idx0 once var0; idx0 += inc3 */
++    0x7000000f, /* 0034(:1261):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=15 EXT MORE init=0 WS=0 RS=0 */
++    0x080cf19f, /* 0038(:1261):    DRD2B1: idx0 = EU3(); EU3(var6)  */
++    0xd81882a4, /* 003C(:1262):    LCDEXT: idx1 = idx0; idx1 >= var10; idx1 += inc4 */
++    0x8019001b, /* 0040(:1262):    LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */
++    0x60000003, /* 0044(:1263):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
++    0x2c97c7df, /* 0048(:1263):      DRD2B2: EU3(var9)  */
++    0xd818826d, /* 004C(:1264):    LCDEXT: idx1 = idx0; idx1 == var9; idx1 += inc5 */
++    0x8019001b, /* 0050(:1264):    LCD: idx2 = var0; idx2 once var0; idx2 += inc3 */
++    0x60000003, /* 0054(:1265):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=3 EXT init=0 WS=0 RS=0 */
++    0x2c17c7df, /* 0058(:1265):      DRD2B2: EU3(var1)  */
++    0x000001f8, /* 005C(:0):    NOP */
++    0xc282e01b, /* 0060(:1268):  LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */
++    0xc002a25e, /* 0064(:1268):  LCDEXT: idx2 = var0, idx3 = var5; idx3 == var9; idx2 += inc3, idx3 += inc6 */
++    0x811a601b, /* 0068(:1269):  LCD: idx4 = var2; ; idx4 += inc3 */
++    0xc184a102, /* 006C(:1272):    LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */
++    0x841be009, /* 0070(:1272):    LCD: idx7 = var8; ; idx7 += inc1 */
++    0x63fe0000, /* 0074(:1275):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 0078(:1275):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 007C(:1277):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 0080(:1277):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000002, /* 0084(:1279):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf99f, /* 0088(:1279):      DRD2B1: var1 = EU3(); EU3(idx6)  */
++    0x70000006, /* 008C(:1280):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 0090(:1280):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x1000cb28, /* 0094(:1281):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0098(:1282):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 009C(:1282):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x1000cb30, /* 00A0(:1283):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00A4(:1284):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 00A8(:1284):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x0000cb38, /* 00AC(:1285):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 00B0(:0):    NOP */
++    0xc282e01b, /* 00B4(:1289):  LCDEXT: idx0 = var5, idx1 = var5; ; idx0 += inc3, idx1 += inc3 */
++    0xc002a31e, /* 00B8(:1289):  LCDEXT: idx2 = var0, idx3 = var5; idx3 == var12; idx2 += inc3, idx3 += inc6 */
++    0x811a601b, /* 00BC(:1290):  LCD: idx4 = var2; ; idx4 += inc3 */
++    0xda9b001b, /* 00C0(:1293):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00C4(:1293):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x0000d3a0, /* 00C8(:1294):      DRD1A: *idx4; FN=0 init=0 WS=0 RS=0 */
++    0xc184a102, /* 00CC(:1296):    LCDEXT: idx5 = var3, idx6 = var9; idx6 < var4; idx5 += inc0, idx6 += inc2 */
++    0x841be009, /* 00D0(:1296):    LCD: idx7 = var8; ; idx7 += inc1 */
++    0x6bfe0000, /* 00D4(:1299):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=0 TFD EXT init=31 WS=3 RS=3 */
++    0x0d4cfddf, /* 00D8(:1299):      DRD2B1: *idx5 = EU3(); EU3(*idx7)  */
++    0xda9b001b, /* 00DC(:1301):    LCDEXT: idx5 = idx5, idx6 = idx6; idx5 once var0; idx5 += inc3, idx6 += inc3 */
++    0x9b9be01b, /* 00E0(:1301):    LCD: idx7 = idx7; ; idx7 += inc3 */
++    0x70000002, /* 00E4(:1303):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=2 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf99f, /* 00E8(:1303):      DRD2B1: var1 = EU3(); EU3(idx6)  */
++    0x70000006, /* 00EC(:1304):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 00F0(:1304):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x1000cb28, /* 00F4(:1305):      DRD1A: *idx2 = idx5; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 00F8(:1306):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 00FC(:1306):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x1000cb30, /* 0100(:1307):      DRD1A: *idx2 = idx6; FN=0 MORE init=0 WS=0 RS=0 */
++    0x70000006, /* 0104(:1308):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=6 EXT MORE init=0 WS=0 RS=0 */
++    0x088cf88b, /* 0108(:1308):      DRD2B1: idx2 = EU3(); EU3(idx2,var11)  */
++    0x0000cb38, /* 010C(:1309):      DRD1A: *idx2 = idx7; FN=0 init=0 WS=0 RS=0 */
++    0x000001f8, /* 0110(:0):    NOP */
++    0x8144801c, /* 0114(:1312):  LCD: idx0 = var2 + var9 + 4; idx0 once var0; idx0 += inc3 */
++    0x0000c008, /* 0118(:1313):    DRD1A: *idx0 = var1; FN=0 init=0 WS=0 RS=0 */
++    0xc398027f, /* 011C(:1315):  LCDEXT: idx0 = var7; idx0 > var9; idx0 += inc7 */
++    0x8018801b, /* 0120(:1315):  LCD: idx1 = var0; idx1 once var0; idx1 += inc3 */
++    0x040001f8, /* 0124(:1316):    DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+ };
+ #endif
+ u32 MCD_ENetRcv_TDT[]=
+ {
+-    0x80004000, /* 0000(:1334):  LCDEXT: idx0 = 0x00000000; ; */
+-    0x82188000, /* 0004(:1334):  LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
+-    0x10000788, /* 0008(:1335):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000009, /* 000C(:1336):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
+-    0x080cf05f, /* 0010(:1336):    DRD2B1: idx0 = EU3(); EU3(var1)  */
+-    0x98180249, /* 0014(:1339):  LCD: idx0 = idx0; idx0 != var9; idx0 += inc1 */
+-    0x82448004, /* 0018(:1341):    LCD: idx1 = var4 + var9 + 4; idx1 once var0; idx1 += inc0 */
+-    0x7000000d, /* 001C(:1342):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
+-    0x014cf05f, /* 0020(:1342):      DRD2B1: var5 = EU3(); EU3(var1)  */
+-    0x7000000b, /* 0024(:1343):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
+-    0x020cf05f, /* 0028(:1343):      DRD2B1: var8 = EU3(); EU3(var1)  */
+-    0x70000004, /* 002C(:1344):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
+-    0x018cf04a, /* 0030(:1344):      DRD2B1: var6 = EU3(); EU3(var1,var10)  */
+-    0x70000004, /* 0034(:1345):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
+-    0x004cf04b, /* 0038(:1345):      DRD2B1: var1 = EU3(); EU3(var1,var11)  */
+-    0x00000b88, /* 003C(:1348):      DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */
+-    0xc4838190, /* 0040(:1351):    LCDEXT: idx1 = var9, idx2 = var7; idx1 < var6; idx1 += inc2, idx2 += inc0 */
+-    0x8119e012, /* 0044(:1351):    LCD: idx3 = var2; ; idx3 += inc2 */
+-    0x03e0cf90, /* 0048(:1354):      DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */
+-    0x81188000, /* 004C(:1357):    LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */
+-    0x000ac788, /* 0050(:1358):      DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */
+-    0xc4838000, /* 0054(:1360):    LCDEXT: idx1 = var9, idx2 = var7; idx1 once var0; idx1 += inc0, idx2 += inc0 */
+-    0x8219e000, /* 0058(:1360):    LCD: idx3 = var4; ; idx3 += inc0 */
+-    0x70000004, /* 005C(:1368):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
+-    0x084cfc8c, /* 0060(:1368):      DRD2B1: idx1 = EU3(); EU3(*idx2,var12)  */
+-    0x60000005, /* 0064(:1371):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
+-    0x0cccf841, /* 0068(:1371):      DRD2B1: *idx3 = EU3(); EU3(idx1,var1)  */
+-    0x82468000, /* 006C(:1377):    LCD: idx1 = var4 + var13; idx1 once var0; idx1 += inc0 */
+-    0xc419025b, /* 0070(:1379):      LCDEXT: idx2 = var8; idx2 > var9; idx2 += inc3 */
+-    0x80198000, /* 0074(:1379):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
+-    0x00008400, /* 0078(:1380):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
+-    0x00001308, /* 007C(:1381):      DRD1A: var4 = idx1; FN=0 init=0 WS=0 RS=0 */
+-    0x82188000, /* 0080(:1384):    LCD: idx1 = var4; idx1 once var0; idx1 += inc0 */
+-    0x10000788, /* 0084(:1385):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000009, /* 0088(:1386):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
+-    0x080cf05f, /* 008C(:1386):      DRD2B1: idx0 = EU3(); EU3(var1)  */
+-    0xc2988249, /* 0090(:1389):    LCDEXT: idx1 = var5; idx1 != var9; idx1 += inc1 */
+-    0x80190000, /* 0094(:1389):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
+-    0x040001f8, /* 0098(:1390):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+-    0x000001f8, /* 009C(:0):    NOP */
++    0x80004000, /* 0000(:1389):  LCDEXT: idx0 = 0x00000000; ; */
++    0x81988000, /* 0004(:1389):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 0008(:1390):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x6000000a, /* 000C(:1391):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 0010(:1391):    DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0x98180209, /* 0014(:1394):  LCD: idx0 = idx0; idx0 != var8; idx0 += inc1 */
++    0x81c40004, /* 0018(:1396):    LCD: idx1 = var3 + var8 + 4; idx1 once var0; idx1 += inc0 */
++    0x7000000e, /* 001C(:1397):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
++    0x010cf05f, /* 0020(:1397):      DRD2B1: var4 = EU3(); EU3(var1)  */
++    0x7000000c, /* 0024(:1398):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x01ccf05f, /* 0028(:1398):      DRD2B1: var7 = EU3(); EU3(var1)  */
++    0x70000004, /* 002C(:1399):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x014cf049, /* 0030(:1399):      DRD2B1: var5 = EU3(); EU3(var1,var9)  */
++    0x70000004, /* 0034(:1400):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x004cf04a, /* 0038(:1400):      DRD2B1: var1 = EU3(); EU3(var1,var10)  */
++    0x00000b88, /* 003C(:1403):      DRD1A: var2 = *idx1; FN=0 init=0 WS=0 RS=0 */
++    0xc4030150, /* 0040(:1406):    LCDEXT: idx1 = var8, idx2 = var6; idx1 < var5; idx1 += inc2, idx2 += inc0 */
++    0x8119e012, /* 0044(:1406):    LCD: idx3 = var2; ; idx3 += inc2 */
++    0x03e0cf90, /* 0048(:1409):      DRD1A: *idx3 = *idx2; FN=0 init=31 WS=0 RS=0 */
++    0x81188000, /* 004C(:1412):    LCD: idx1 = var2; idx1 once var0; idx1 += inc0 */
++    0x000ac788, /* 0050(:1413):      DRD1A: *idx1 = *idx1; FN=0 init=0 WS=1 RS=1 */
++    0xc4030000, /* 0054(:1415):    LCDEXT: idx1 = var8, idx2 = var6; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x8199e000, /* 0058(:1415):    LCD: idx3 = var3; ; idx3 += inc0 */
++    0x63e00004, /* 005C(:1418):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=31 WS=0 RS=0 */
++    0x084cfc8b, /* 0060(:1418):      DRD2B1: idx1 = EU3(); EU3(*idx2,var11)  */
++    0xd8990000, /* 0064(:1421):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x9999e000, /* 0068(:1421):    LCD: idx3 = idx3; ; idx3 += inc0 */
++    0x60000005, /* 006C(:1422):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=5 EXT init=0 WS=0 RS=0 */
++    0x0cccf841, /* 0070(:1422):      DRD2B1: *idx3 = EU3(); EU3(idx1,var1)  */
++    0x81c60000, /* 0074(:1427):    LCD: idx1 = var3 + var12; idx1 once var0; idx1 += inc0 */
++    0xc399021b, /* 0078(:1429):      LCDEXT: idx2 = var7; idx2 > var8; idx2 += inc3 */
++    0x80198000, /* 007C(:1429):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
++    0x00008400, /* 0080(:1430):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
++    0x00000f08, /* 0084(:1431):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
++    0x81988000, /* 0088(:1434):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 008C(:1435):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x6000000a, /* 0090(:1436):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 0094(:1436):      DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0xc2188209, /* 0098(:1439):    LCDEXT: idx1 = var4; idx1 != var8; idx1 += inc1 */
++    0x80190000, /* 009C(:1439):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
++    0x040001f8, /* 00A0(:1440):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x000001f8, /* 00A4(:0):    NOP */
+ };
+ u32 MCD_ENetXmit_TDT[]=
+ {
+-    0x80004000, /* 0000(:1465):  LCDEXT: idx0 = 0x00000000; ; */
+-    0x81988000, /* 0004(:1465):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
+-    0x10000788, /* 0008(:1466):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000009, /* 000C(:1467):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
+-    0x080cf05f, /* 0010(:1467):    DRD2B1: idx0 = EU3(); EU3(var1)  */
+-    0x98180309, /* 0014(:1470):  LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */
+-    0x80004003, /* 0018(:1472):    LCDEXT: idx1 = 0x00000003; ; */
+-    0x81c60004, /* 001C(:1472):    LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */
+-    0x7000000d, /* 0020(:1473):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
+-    0x014cf05f, /* 0024(:1473):      DRD2B1: var5 = EU3(); EU3(var1)  */
+-    0x7000000b, /* 0028(:1474):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT MORE init=0 WS=0 RS=0 */
+-    0x028cf05f, /* 002C(:1474):      DRD2B1: var10 = EU3(); EU3(var1)  */
+-    0x7000000c, /* 0030(:1475):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
+-    0x018cf05f, /* 0034(:1475):      DRD2B1: var6 = EU3(); EU3(var1)  */
+-    0x70000004, /* 0038(:1476):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
+-    0x01ccf04d, /* 003C(:1476):      DRD2B1: var7 = EU3(); EU3(var1,var13)  */
+-    0x10000b90, /* 0040(:1477):      DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000004, /* 0044(:1478):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */
+-    0x020cf0a1, /* 0048(:1478):      DRD2B1: var8 = EU3(); EU3(var2,idx1)  */
+-    0xc3188312, /* 004C(:1481):    LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */
+-    0x83c70000, /* 0050(:1481):    LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */
+-    0x00001f10, /* 0054(:1482):      DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */
+-    0xc583a3c3, /* 0058(:1484):    LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */
+-    0x81042325, /* 005C(:1484):    LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */
+-    0x03e0c798, /* 0060(:1489):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */
+-    0xd8990000, /* 0064(:1492):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
+-    0x9999e000, /* 0068(:1492):    LCD: idx3 = idx3; ; idx3 += inc0 */
+-    0x000acf98, /* 006C(:1493):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
+-    0xd8992306, /* 0070(:1495):    LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */
+-    0x9999e03f, /* 0074(:1495):    LCD: idx3 = idx3; ; idx3 += inc7 */
+-    0x03eac798, /* 0078(:1498):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */
+-    0xd8990000, /* 007C(:1501):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
+-    0x9999e000, /* 0080(:1501):    LCD: idx3 = idx3; ; idx3 += inc0 */
+-    0x000acf98, /* 0084(:1502):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
+-    0xd8990000, /* 0088(:1504):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
+-    0x99832302, /* 008C(:1504):    LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */
+-    0x0beac798, /* 0090(:1507):      DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */
+-    0x81988000, /* 0094(:1509):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
+-    0x6000000a, /* 0098(:1510):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
+-    0x0c4cfc5f, /* 009C(:1510):      DRD2B1: *idx1 = EU3(); EU3(*idx1)  */
+-    0x81c80000, /* 00A0(:1512):    LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */
+-    0xc5190312, /* 00A4(:1514):      LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */
+-    0x80198000, /* 00A8(:1514):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
+-    0x00008400, /* 00AC(:1515):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
+-    0x00000f08, /* 00B0(:1516):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
+-    0x81988000, /* 00B4(:1519):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
+-    0x10000788, /* 00B8(:1520):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
+-    0x60000009, /* 00BC(:1521):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=9 EXT init=0 WS=0 RS=0 */
+-    0x080cf05f, /* 00C0(:1521):      DRD2B1: idx0 = EU3(); EU3(var1)  */
+-    0xc2988309, /* 00C4(:1524):    LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */
+-    0x80190000, /* 00C8(:1524):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
+-    0x040001f8, /* 00CC(:1525):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
++    0x80004000, /* 0000(:1515):  LCDEXT: idx0 = 0x00000000; ; */
++    0x81988000, /* 0004(:1515):  LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 0008(:1516):    DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x6000000a, /* 000C(:1517):    DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 0010(:1517):    DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0x98180309, /* 0014(:1520):  LCD: idx0 = idx0; idx0 != var12; idx0 += inc1 */
++    0x80004003, /* 0018(:1522):    LCDEXT: idx1 = 0x00000003; ; */
++    0x81c60004, /* 001C(:1522):    LCD: idx2 = var3 + var12 + 4; idx2 once var0; idx2 += inc0 */
++    0x7000000e, /* 0020(:1523):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=14 EXT MORE init=0 WS=0 RS=0 */
++    0x014cf05f, /* 0024(:1523):      DRD2B1: var5 = EU3(); EU3(var1)  */
++    0x7000000c, /* 0028(:1524):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=12 EXT MORE init=0 WS=0 RS=0 */
++    0x028cf05f, /* 002C(:1524):      DRD2B1: var10 = EU3(); EU3(var1)  */
++    0x7000000d, /* 0030(:1525):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=13 EXT MORE init=0 WS=0 RS=0 */
++    0x018cf05f, /* 0034(:1525):      DRD2B1: var6 = EU3(); EU3(var1)  */
++    0x70000004, /* 0038(:1526):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT MORE init=0 WS=0 RS=0 */
++    0x01ccf04d, /* 003C(:1526):      DRD2B1: var7 = EU3(); EU3(var1,var13)  */
++    0x10000b90, /* 0040(:1527):      DRD1A: var2 = *idx2; FN=0 MORE init=0 WS=0 RS=0 */
++    0x60000004, /* 0044(:1528):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=4 EXT init=0 WS=0 RS=0 */
++    0x020cf0a1, /* 0048(:1528):      DRD2B1: var8 = EU3(); EU3(var2,idx1)  */
++    0xc3188312, /* 004C(:1531):    LCDEXT: idx1 = var6; idx1 > var12; idx1 += inc2 */
++    0x83c70000, /* 0050(:1531):    LCD: idx2 = var7 + var14; idx2 once var0; idx2 += inc0 */
++    0x00001f10, /* 0054(:1532):      DRD1A: var7 = idx2; FN=0 init=0 WS=0 RS=0 */
++    0xc583a3c3, /* 0058(:1534):    LCDEXT: idx1 = var11, idx2 = var7; idx2 >= var15; idx1 += inc0, idx2 += inc3 */
++    0x81042325, /* 005C(:1534):    LCD: idx3 = var2, idx4 = var8; idx4 == var12; idx3 += inc4, idx4 += inc5 */
++    0x03e0c798, /* 0060(:1539):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=0 RS=0 */
++    0xd8990000, /* 0064(:1542):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x9999e000, /* 0068(:1542):    LCD: idx3 = idx3; ; idx3 += inc0 */
++    0x000acf98, /* 006C(:1543):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
++    0xd8992306, /* 0070(:1545):    LCDEXT: idx1 = idx1, idx2 = idx2; idx2 > var12; idx1 += inc0, idx2 += inc6 */
++    0x9999e03f, /* 0074(:1545):    LCD: idx3 = idx3; ; idx3 += inc7 */
++    0x03eac798, /* 0078(:1548):      DRD1A: *idx1 = *idx3; FN=0 init=31 WS=1 RS=1 */
++    0xd8990000, /* 007C(:1551):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x9999e000, /* 0080(:1551):    LCD: idx3 = idx3; ; idx3 += inc0 */
++    0x000acf98, /* 0084(:1552):      DRD1A: *idx3 = *idx3; FN=0 init=0 WS=1 RS=1 */
++    0xd8990000, /* 0088(:1554):    LCDEXT: idx1 = idx1, idx2 = idx2; idx1 once var0; idx1 += inc0, idx2 += inc0 */
++    0x99832302, /* 008C(:1554):    LCD: idx3 = idx3, idx4 = var6; idx4 > var12; idx3 += inc0, idx4 += inc2 */
++    0x0beac798, /* 0090(:1557):      DRD1A: *idx1 = *idx3; FN=0 TFD init=31 WS=1 RS=1 */
++    0x81988000, /* 0094(:1559):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x6000000b, /* 0098(:1560):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=11 EXT init=0 WS=0 RS=0 */
++    0x0c4cfc5f, /* 009C(:1560):      DRD2B1: *idx1 = EU3(); EU3(*idx1)  */
++    0x81c80000, /* 00A0(:1562):    LCD: idx1 = var3 + var16; idx1 once var0; idx1 += inc0 */
++    0xc5190312, /* 00A4(:1564):      LCDEXT: idx2 = var10; idx2 > var12; idx2 += inc2 */
++    0x80198000, /* 00A8(:1564):      LCD: idx3 = var0; idx3 once var0; idx3 += inc0 */
++    0x00008400, /* 00AC(:1565):        DRD1A: idx1 = var0; FN=0 init=0 WS=0 RS=0 */
++    0x00000f08, /* 00B0(:1566):      DRD1A: var3 = idx1; FN=0 init=0 WS=0 RS=0 */
++    0x81988000, /* 00B4(:1569):    LCD: idx1 = var3; idx1 once var0; idx1 += inc0 */
++    0x10000788, /* 00B8(:1570):      DRD1A: var1 = *idx1; FN=0 MORE init=0 WS=0 RS=0 */
++    0x6000000a, /* 00BC(:1571):      DRD2A: EU0=0 EU1=0 EU2=0 EU3=10 EXT init=0 WS=0 RS=0 */
++    0x080cf05f, /* 00C0(:1571):      DRD2B1: idx0 = EU3(); EU3(var1)  */
++    0xc2988309, /* 00C4(:1574):    LCDEXT: idx1 = var5; idx1 != var12; idx1 += inc1 */
++    0x80190000, /* 00C8(:1574):    LCD: idx2 = var0; idx2 once var0; idx2 += inc0 */
++    0x040001f8, /* 00CC(:1575):      DRD1A: FN=0 INT init=0 WS=0 RS=0 */
+     0x000001f8, /* 00D0(:0):    NOP */
+ };
++#ifdef MCD_INCLUDE_EU
++MCD_bufDesc MCD_singleBufDescs[NCHANNELS];
++#endif
+--- a/drivers/dma/MCD_tasksInit.c
++++ b/drivers/dma/MCD_tasksInit.c
+@@ -1,51 +1,34 @@
+-/*********************************************************************
+- *
+- * Copyright (C) 2004  Motorola, Inc.
+- *    MOTOROLA, INC. All Rights Reserved.  
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This 
+- *  software is provided on an "AS IS" basis and without warranty.
+- *
+- *  To the maximum extent permitted by applicable law, MOTOROLA 
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING 
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE 
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY 
+- *  ACCOMPANYING WRITTEN MATERIALS.
+- * 
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING 
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS 
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.   
+- * 
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
+ /*
+- * Do not edit!
+- */
+- /*
+- * File:              MCD_tasksInit.c
+- * Purpose:           Function for initialize variable tables of different
+- *              types of tasks.
++ * drivers/dma/MCD_tasksInit.c
+  *
+- * Notes:
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
++ * 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.
+  *
+- * Modifications:
+- *    
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
+- */ 
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
+-#include <asm/MCD_dma.h>
++/*
++ * Autogenerated - Do not edit!
++ */
++
++#include "MCD_dma.h"
+ extern dmaRegs *MCD_dmaBar;
++
+ /*
+  * Task 0
+  */
+@@ -53,232 +36,203 @@ extern dmaRegs *MCD_dmaBar;
+ void  MCD_startDmaChainNoEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize);      /* var[19] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
+-      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
+-      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000);    /* var[16] */
+-      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000);    /* var[17] */
+-      MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000);    /* var[18] */
+-      MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000);    /* var[20] */
+-      MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010);    /* var[21] */
+-      MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004);    /* var[22] */
+-      MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080);    /* var[23] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
+-      MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000);    /* inc[4] */
+-      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
+-      MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000);    /* inc[6] */
+-      MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 11, (u32)xferSize);  /* var[11] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000); /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++    MCD_SET_VAR(taskTable+channel, 13, (u32)0x80000000);    /* var[13] */
++    MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000010);    /* var[14] */
++    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
++    MCD_SET_VAR(taskTable+channel, 16, (u32)0x08000000);    /* var[16] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000);    /* inc[4] */
++    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
++    MCD_SET_VAR(taskTable+channel, 30, (u32)0x40000000);    /* inc[6] */
+     /* Set the task's Enable bit in its Task Control Register */
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
+-      
+-
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+ /*
+  * Task 1
+  */
+- 
+-void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++
++void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr);       /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr);       /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize);        /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize);       /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)flags);  /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
+-      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
+-      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004);    /* var[16] */
+-      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080);    /* var[17] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
+-      MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
+-      MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)srcAddr);    /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)destAddr);   /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 3, (u32)dmaSize);    /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)flags);  /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000004); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x08000000);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
++    MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
+-    /* enable the task */
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+ /*
+  * Task 2
+  */
+- 
++
+ void  MCD_startDmaChainEu(int *currBD, short srcIncr, short destIncr, int xferSize, short xferSizeIncr, int *cSave, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 19, (u32)xferSize);      /* var[19] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
+-      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
+-      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000000);    /* var[16] */
+-      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000000);    /* var[17] */
+-      MCD_SET_VAR(taskTable+channel, 18, (u32)0x00000000);    /* var[18] */
+-      MCD_SET_VAR(taskTable+channel, 20, (u32)0x00000000);    /* var[20] */
+-      MCD_SET_VAR(taskTable+channel, 21, (u32)0x00000010);    /* var[21] */
+-      MCD_SET_VAR(taskTable+channel, 22, (u32)0x00000004);    /* var[22] */
+-      MCD_SET_VAR(taskTable+channel, 23, (u32)0x00000080);    /* var[23] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
+-      MCD_SET_VAR(taskTable+channel, 28, (u32)0x60000000);    /* inc[4] */
+-      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000001);    /* inc[5] */
+-      MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000000);    /* inc[6] */
+-      MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
+-    /*enable the task*/
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 12, (u32)xferSize);  /* var[12] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
++    MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000000);    /* var[13] */
++    MCD_SET_VAR(taskTable+channel, 14, (u32)0x80000000);    /* var[14] */
++    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000010);    /* var[15] */
++    MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000001);    /* var[16] */
++    MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000004);    /* var[17] */
++    MCD_SET_VAR(taskTable+channel, 18, (u32)0x08000000);    /* var[18] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++    MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000000);    /* inc[4] */
++    MCD_SET_VAR(taskTable+channel, 29, (u32)0xc0000000);    /* inc[5] */
++    MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001);    /* inc[6] */
++    MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
++
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+ /*
+  * Task 3
+  */
+- 
+-void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
++
++void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)srcAddr);       /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)destAddr);       /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)dmaSize);        /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)dmaSizeMXferSize);       /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));      /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)flags);  /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)currBD); /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000000);    /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 14, (u32)0x00000000);    /* var[14] */
+-      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000000);    /* var[15] */
+-      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000004);    /* var[16] */
+-      MCD_SET_VAR(taskTable+channel, 17, (u32)0x00000080);    /* var[17] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
+-      MCD_SET_VAR(taskTable+channel, 28, (u32)0x80000001);    /* inc[4] */
+-      MCD_SET_VAR(taskTable+channel, 29, (u32)0x40000000);    /* inc[5] */
+-    /*enable the task*/
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++    MCD_SET_VAR(taskTable+channel, 8, (u32)srcAddr);    /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)(0xe000 << 16) | (0xffff & srcIncr));   /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 3, (u32)destAddr);   /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)(0xe000 << 16) | (0xffff & destIncr));  /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)dmaSize);    /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)(0x2000 << 16) | (0xffff & xferSizeIncr));  /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)flags);  /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)currBD); /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 0, (u32)cSave);  /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000001);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 11, (u32)0x00000004);    /* var[11] */
++    MCD_SET_VAR(taskTable+channel, 12, (u32)0x08000000);    /* var[12] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0x00000000);    /* inc[3] */
++    MCD_SET_VAR(taskTable+channel, 28, (u32)0xc0000000);    /* inc[4] */
++    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
++    MCD_SET_VAR(taskTable+channel, 30, (u32)0x80000001);    /* inc[6] */
++    MCD_SET_VAR(taskTable+channel, 31, (u32)0x40000000);    /* inc[7] */
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+ /*
+  * Task 4
+  */
+- 
++
+ void  MCD_startDmaENetRcv(char *bDBase, char *currBD, char *rcvFifoPtr, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)currBD); /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)rcvFifoPtr);     /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)0x00000000);     /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x0000ffff);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)0x30000000);    /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x0fffffff);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)0x00000008);    /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004);    /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000);    /* inc[3] */
+-    /*enable the task*/
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++    MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)rcvFifoPtr); /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x0000ffff); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x30000000);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 11, (u32)0x0fffffff);    /* var[11] */
++    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000008);    /* var[12] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)0x20000004);    /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0x40000000);    /* inc[3] */
++
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+ /*
+  * Task 5
+  */
+- 
++
+ void  MCD_startDmaENetXmit(char *bDBase, char *currBD, char *xmitFifoPtr, volatile TaskTableEntry *taskTable, int channel)
+ {
+-      
+-      MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
+-      MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
+-      MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr);   /* var[11] */
+-      MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000);     /* var[1] */
+-      MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000);     /* var[2] */
+-      MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000);     /* var[4] */
+-      MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000);     /* var[5] */
+-      MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000);     /* var[6] */
+-      MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000);     /* var[7] */
+-      MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000);     /* var[8] */
+-      MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000);     /* var[9] */
+-      MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
+-      MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
+-      MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff);    /* var[13] */
+-      MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff);    /* var[14] */
+-      MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
+-      MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008);    /* var[16] */
+-      MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
+-      MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
+-      MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000);    /* inc[2] */
+-      MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc);    /* inc[3] */
+-      MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004);    /* inc[4] */
+-      MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
+-      MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff);    /* inc[6] */
+-      MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001);    /* inc[7] */
+-    /*enable the task*/
+-    MCD_dmaBar->taskControl[channel] |= (u16)0x8000; /* add a MACRO HERE TBD*/
++    MCD_SET_VAR(taskTable+channel, 0, (u32)bDBase); /* var[0] */
++    MCD_SET_VAR(taskTable+channel, 3, (u32)currBD); /* var[3] */
++    MCD_SET_VAR(taskTable+channel, 11, (u32)xmitFifoPtr);   /* var[11] */
++    MCD_SET_VAR(taskTable+channel, 1, (u32)0x00000000); /* var[1] */
++    MCD_SET_VAR(taskTable+channel, 2, (u32)0x00000000); /* var[2] */
++    MCD_SET_VAR(taskTable+channel, 4, (u32)0x00000000); /* var[4] */
++    MCD_SET_VAR(taskTable+channel, 5, (u32)0x00000000); /* var[5] */
++    MCD_SET_VAR(taskTable+channel, 6, (u32)0x00000000); /* var[6] */
++    MCD_SET_VAR(taskTable+channel, 7, (u32)0x00000000); /* var[7] */
++    MCD_SET_VAR(taskTable+channel, 8, (u32)0x00000000); /* var[8] */
++    MCD_SET_VAR(taskTable+channel, 9, (u32)0x00000000); /* var[9] */
++    MCD_SET_VAR(taskTable+channel, 10, (u32)0x00000000);    /* var[10] */
++    MCD_SET_VAR(taskTable+channel, 12, (u32)0x00000000);    /* var[12] */
++    MCD_SET_VAR(taskTable+channel, 13, (u32)0x0000ffff);    /* var[13] */
++    MCD_SET_VAR(taskTable+channel, 14, (u32)0xffffffff);    /* var[14] */
++    MCD_SET_VAR(taskTable+channel, 15, (u32)0x00000004);    /* var[15] */
++    MCD_SET_VAR(taskTable+channel, 16, (u32)0x00000008);    /* var[16] */
++    MCD_SET_VAR(taskTable+channel, 24, (u32)0x00000000);    /* inc[0] */
++    MCD_SET_VAR(taskTable+channel, 25, (u32)0x60000000);    /* inc[1] */
++    MCD_SET_VAR(taskTable+channel, 26, (u32)0x40000000);    /* inc[2] */
++    MCD_SET_VAR(taskTable+channel, 27, (u32)0xc000fffc);    /* inc[3] */
++    MCD_SET_VAR(taskTable+channel, 28, (u32)0xe0000004);    /* inc[4] */
++    MCD_SET_VAR(taskTable+channel, 29, (u32)0x80000000);    /* inc[5] */
++    MCD_SET_VAR(taskTable+channel, 30, (u32)0x4000ffff);    /* inc[6] */
++    MCD_SET_VAR(taskTable+channel, 31, (u32)0xe0000001);    /* inc[7] */
++    /* Set the task's Enable bit in its Task Control Register */
++    MCD_dmaBar->taskControl[channel] |= (u16)0x8000;
+ }
+--- a/drivers/dma/MCD_tasksInit.h
++++ b/drivers/dma/MCD_tasksInit.h
+@@ -1,40 +1,31 @@
+-/*********************************************************************
++/*
++ * drivers/dma/MCD_tasksInit.h
+  *
+- * Copyright (C) 2004  Motorola, Inc.
+- *  MOTOROLA, INC. All Rights Reserved.
+- *  You are hereby granted a copyright license to use
+- *  the SOFTWARE so long as this entire notice is
+- *  retained without alteration in any modified and/or redistributed
+- *  versions, and that such modified versions are clearly identified
+- *  as such. No licenses are granted by implication, estoppel or
+- *  otherwise under any patents or trademarks of Motorola, Inc. This
+- *  software is provided on an "AS IS" basis and without warranty.
++ * Copyright (C) 2004-2008 Freescale Semiconductor, Inc.
++ *     Kurt Mahan <kmahan@freescale.com>
+  *
+- *  To the maximum extent permitted by applicable law, MOTOROLA
+- *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
+- *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+- *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
+- *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
+- *  ACCOMPANYING WRITTEN MATERIALS.
++ * 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.
+  *
+- *  To the maximum extent permitted by applicable law, IN NO EVENT
+- *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
+- *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
+- *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
+- *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
+  *
+- *  Motorola assumes no responsibility for the maintenance and support
+- *  of this software
+- ********************************************************************/
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
++ * MA 02111-1307 USA
++ */
+ #ifndef MCD_TSK_INIT_H
+ #define MCD_TSK_INIT_H 1
+ /*
+- * Do not edit!
++ * Autogenerated - Do not edit!
+  */
+-
+-
+ /*
+  * Task 0
+  */
+@@ -44,7 +35,7 @@ void  MCD_startDmaChainNoEu(int *currBD,
+ /*
+  * Task 1
+  */
+-void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++void  MCD_startDmaSingleNoEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
+ /*
+@@ -56,7 +47,7 @@ void  MCD_startDmaChainEu(int *currBD, s
+ /*
+  * Task 3
+  */
+-void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, int dmaSizeMXferSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
++void  MCD_startDmaSingleEu(char *srcAddr, short srcIncr, char *destAddr, short destIncr, int dmaSize, short xferSizeIncr, int flags, int *currBD, int *cSave, volatile TaskTableEntry *taskTable, int channel);
+ /*
diff --git a/target/linux/coldfire/patches/052-m547x_8x_dspi.patch b/target/linux/coldfire/patches/052-m547x_8x_dspi.patch
new file mode 100644 (file)
index 0000000..c9277f8
--- /dev/null
@@ -0,0 +1,1137 @@
+From acc2bc0cd419c176820d4a384eb36498a066366d Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 30 Apr 2008 14:20:48 -0600
+Subject: [PATCH] DSPI support for M547x/M548x.
+
+LTIBName: m547x-8x-dspi
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/Makefile           |    1 +
+ arch/m68k/coldfire/m547x_8x-devices.c |  150 +++++++++++++
+ drivers/spi/Makefile                  |    3 +-
+ drivers/spi/spi_coldfire.c            |  382 ++++++++++++++++-----------------
+ include/asm-m68k/m5485dspi.h          |  144 +++++++++++++
+ include/asm-m68k/mcfqspi.h            |    1 +
+ include/asm-m68k/mcfsim.h             |    1 +
+ 7 files changed, 485 insertions(+), 197 deletions(-)
+ create mode 100644 arch/m68k/coldfire/m547x_8x-devices.c
+ create mode 100644 include/asm-m68k/m5485dspi.h
+
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -10,4 +10,5 @@ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+ obj-$(CONFIG_M54455)  += mcf5445x-devices.o
++obj-$(CONFIG_M547X_8X)        += m547x_8x-devices.o
+ obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
+--- /dev/null
++++ b/arch/m68k/coldfire/m547x_8x-devices.c
+@@ -0,0 +1,150 @@
++/*
++ * arch/m68k/coldfire/m547x_8x-devices.c
++ *
++ * Coldfire M547x/M548x Platform Device Configuration
++ *
++ * Copyright (c) 2008 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/fsl_devices.h>
++#include <linux/spi/spi.h>
++
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++#include <asm/mcfqspi.h>
++
++
++#ifdef CONFIG_SPI
++/*
++ *
++ * DSPI
++ *
++ */
++
++/* number of supported SPI selects */
++#define SPI_NUM_CHIPSELECTS   4
++
++void coldfire_spi_cs_control(u8 cs, u8 command)
++{
++      /* nothing special required */
++}
++
++static struct spi_board_info spi_board_info[] = {
++      /* no board info */
++};
++
++static int spi_irq_list[] = {
++      /* IRQ, ICR Offset, ICR Val, Mask */
++      64 + ISC_DSPI_OVRFW, 0, 0, 0,
++      64 + ISC_DSPI_RFOF,  0, 0, 0,
++      64 + ISC_DSPI_RFDF,  0, 0, 0,
++      64 + ISC_DSPI_TFUF,  0, 0, 0,
++      64 + ISC_DSPI_TCF,   0, 0, 0,
++      64 + ISC_DSPI_TFFF,  0, 0, 0,
++      64 + ISC_DSPI_EOQF,  0, 0, 0,
++      0,0,0,0,
++};
++
++static struct coldfire_spi_master coldfire_master_info = {
++      .bus_num = 1,
++      .num_chipselect = SPI_NUM_CHIPSELECTS,
++      .irq_list = spi_irq_list,
++      .irq_source = 0,        /* not used */
++      .irq_vector = 0,        /* not used */
++      .irq_mask = 0,          /* not used */
++      .irq_lp = 0,            /* not used */
++      .par_val = 0,           /* not used */
++      .cs_control = coldfire_spi_cs_control,
++};
++
++static struct resource coldfire_spi_resources[] = {
++      [0] = {
++              .name = "spi-par",
++              .start = MCF_MBAR + 0x00000a50, /* PAR_DSPI */
++              .end = MCF_MBAR + 0x00000a50,   /* PAR_DSPI */
++              .flags = IORESOURCE_MEM
++      },
++
++      [1] = {
++              .name = "spi-module",
++              .start = MCF_MBAR + 0x00008a00, /* DSPI MCR Base */
++              .end = MCF_MBAR + 0x00008ab8,   /* DSPI mem map end */
++              .flags = IORESOURCE_MEM
++      },
++
++      [2] = {
++              .name = "spi-int-level",
++              .start = MCF_MBAR + 0x740,               /* ICR start */
++              .end = MCF_MBAR + 0x740 + ISC_DSPI_EOQF, /* ICR end */
++              .flags = IORESOURCE_MEM
++      },
++
++      [3] = {
++              .name = "spi-int-mask",
++              .start = MCF_MBAR + 0x70c,      /* IMRL */
++              .end = MCF_MBAR + 0x70c,        /* IMRL */
++              .flags = IORESOURCE_MEM
++      }
++};
++
++static struct platform_device coldfire_spi = {
++      .name = "spi_coldfire",
++      .id = -1,
++      .resource = coldfire_spi_resources,
++      .num_resources = ARRAY_SIZE(coldfire_spi_resources),
++      .dev = {
++              .platform_data = &coldfire_master_info,
++      }
++};
++
++/**
++ * m547x_8x_spi_init - Initialize SPI
++ */
++static int __init m547x_8x_spi_init(void)
++{
++      int retval;
++
++      /* initialize the DSPI PAR */
++      MCF_GPIO_PAR_DSPI = (MCF_GPIO_PAR_DSPI_PAR_CS5 |
++                           MCF_GPIO_PAR_DSPI_PAR_CS3_DSPICS |
++                           MCF_GPIO_PAR_DSPI_PAR_CS2_DSPICS |
++                           MCF_GPIO_PAR_DSPI_PAR_CS0_DSPICS |
++                           MCF_GPIO_PAR_DSPI_PAR_SCK_SCK |
++                           MCF_GPIO_PAR_DSPI_PAR_SIN_SIN |
++                           MCF_GPIO_PAR_DSPI_PAR_SOUT_SOUT);
++
++      /* register device */
++      retval = platform_device_register(&coldfire_spi);
++      if (retval < 0) {
++              printk(KERN_ERR "SPI-m547x_8x: platform_device_register failed with code=%d\n", retval);
++              goto out;
++      }
++
++      /* register board info */
++      if (ARRAY_SIZE(spi_board_info))
++              retval = spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
++
++out:
++      return retval;
++}
++#endif
++
++
++/**
++ * m547x_8x_init_devices - Initialize M547X_8X devices
++ *
++ * Returns 0 on success.
++ */
++static int __init m547x_8x_init_devices(void)
++{
++#ifdef CONFIG_SPI
++      m547x_8x_spi_init();
++#endif
++
++      return 0;
++}
++arch_initcall(m547x_8x_init_devices);
+--- a/drivers/spi/Makefile
++++ b/drivers/spi/Makefile
+@@ -18,7 +18,8 @@ obj-$(CONFIG_SPI_BFIN)                       += spi_bfin5xx.
+ obj-$(CONFIG_SPI_BITBANG)             += spi_bitbang.o
+ obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
+ obj-$(CONFIG_SPI_BUTTERFLY)           += spi_butterfly.o
+-obj-$(CONFIG_SPI_COLDFIRE)            += spi_coldfire.o spi-m5445x.o
++# obj-$(CONFIG_SPI_COLDFIRE)          += spi_coldfire.o spi-m5445x.o
++obj-$(CONFIG_SPI_COLDFIRE)            += spi_coldfire.o
+ obj-$(CONFIG_SPI_GPIO)                        += spi_gpio.o
+ obj-$(CONFIG_SPI_IMX)                 += spi_imx.o
+ obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
+--- a/drivers/spi/spi_coldfire.c
++++ b/drivers/spi/spi_coldfire.c
+@@ -1,29 +1,39 @@
+-/****************************************************************************/
+-
+ /*
+- *    spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
++ * spi_coldfire.c - Master QSPI/DSPI controller for the ColdFire processors
++ *
+  *
+  *    (C) Copyright 2005, Intec Automation,
+  *                        Mike Lavender (mike@steroidmicros)
+  *
+- *    (C) Copyright 2007, Freescale Inc,
+- *                        Yaroslav Vinogradov (yaroslav.vinogradov@freescale.com)
++ *    (C) Copyright 2007-2008, Freescale Inc,
++ *                    Yaroslav Vinogradov
++ *                    Andrey Butok
++ *                    Kurt Mahan
+  *
+-
+-     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.
+-
+-     This program is distributed in the hope that it will be useful,
+-     but WITHOUT ANY WARRANTY; without even the implied warranty of
+-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-     GNU General Public License for more details.
+-
+-     You should have received a copy of the GNU General Public License
+-     along with this program; if not, write to the Free Software
+-     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                     */
+-/* ------------------------------------------------------------------------- */
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ ***************************************************************************
++ * Changes:
++ *   v0.003   12 February 2008        Andrey Butok, Freescale Semiconductor
++ *            Added suport of MCF5227x DSPI module.
++ *   v0.002   2007    Yaroslav Vinogradov, Freescale Semiconductor
++ *            Added suport of MCF5445x DSPI module.
++ *   v0.001   2005            Mike Lavender, Intec Automation,
++ *            Intial version. Coldfire QSPI master driver.
++ *
++ */
+ /****************************************************************************/
+@@ -46,41 +56,52 @@
+ #include <asm/mcfsim.h>
+ #include <asm/mcfqspi.h>
+ #include <asm/coldfire.h>
+-#include <asm/virtconvert.h>
+ #if defined(CONFIG_M54455)
++      #include <asm/virtconvert.h>
++
+       #define SPI_DSPI
+       #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
+               #define SPI_DSPI_EDMA
+               #ifdef CONFIG_MMU
+                       #define SPI_USE_MMU
+               #endif
++              #include <asm/mcf5445x_edma.h>
+       #endif
++
++      #include <asm/mcf5445x_dspi.h>
+ #endif
+-#ifdef SPI_DSPI
+-#include <asm/mcf5445x_dspi.h>
++#if defined(CONFIG_M547X_8X)
++      #define SPI_DSPI
++
++      #include <asm/virtconvert.h>
++      #include <asm/m5485dspi.h>
++#endif
++#ifdef CONFIG_M5227x
++      #define SPI_DSPI
++      #if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
++              #define SPI_DSPI_EDMA
++      #endif
+ #endif
++
+ #if defined(SPI_DSPI_EDMA)
+ /* edma buffer size in transfer units (32bits) */
+ #define EDMA_BUFFER_SIZE      (PAGE_SIZE/4)
+-#define EDMA_BUFSIZE_KMALLOC (EDMA_BUFFER_SIZE*4)
+-
+-#define DSPI_DMA_RX_TCD       12
+-#define DSPI_DMA_TX_TCD 13
++#define EDMA_BUFSIZE_KMALLOC  (EDMA_BUFFER_SIZE*4)
++#define DSPI_DMA_RX_TCD               MCF_EDMA_CHAN_DSPI_RX
++#define DSPI_DMA_TX_TCD       MCF_EDMA_CHAN_DSPI_TX
+-#include <asm/coldfire_edma.h>
+-#include <asm/mcf5445x_edma.h>
++#include <asm/mcf_edma.h>
+ #endif
+-
+ MODULE_AUTHOR("Mike Lavender");
+-MODULE_DESCRIPTION("ColdFire QSPI Contoller");
++MODULE_DESCRIPTION("ColdFire SPI Contoller");
+ MODULE_LICENSE("GPL");
+ #define DRIVER_NAME "Coldfire QSPI/DSPI"
+@@ -92,7 +113,6 @@ MODULE_LICENSE("GPL");
+  */
+ #define QSPI_RAM_SIZE         0x10    /* 16 word table */
+-
+ #define QSPI_TRANSMIT_RAM     0x00
+ #define QSPI_RECEIVE_RAM      0x10
+ #define QSPI_COMMAND_RAM      0x20
+@@ -296,13 +316,10 @@ struct driver_data {
+       u32 *dspi_rser;         /* DSPI RSER register */
+       u32 *dspi_sr;           /* DSPI status register */
+       u8      dspi_ctas;              /* DSPI CTAS value*/
+-      
+ #if defined(SPI_DSPI_EDMA)
+       void*   edma_tx_buf;
+       void*   edma_rx_buf;
+ #endif
+-      
+-              
+ #else
+       u16 *qmr;          /* QSPI mode register      */
+       u16 *qdlyr;        /* QSPI delay register     */
+@@ -312,7 +329,11 @@ struct driver_data {
+       u16 *qdr;          /* QSPI data register      */
+       u16 *qcr;          /* QSPI command register   */
+ #endif
++#if defined(CONFIG_M532x) || defined(CONFIG_M537x)
++      u16 *par;          /* Pin assignment register */
++#else
+       u8  *par;          /* Pin assignment register */
++#endif
+       u8  *int_icr;      /* Interrupt level and priority register */
+       u32 *int_mr;       /* Interrupt mask register */
+       void (*cs_control)(u8 cs, u8 command);
+@@ -327,8 +348,6 @@ struct driver_data {
+  * SPI local functions
+  */
+-//#define SPI_COLDFIRE_DEBUG
+-
+ static void *next_transfer(struct driver_data *drv_data)
+ {
+       struct spi_message *msg = drv_data->cur_msg;
+@@ -387,11 +406,9 @@ static int write(struct driver_data *drv
+       int tx_word;
+ #if defined(SPI_DSPI)
+-
+ #if defined(SPI_DSPI_EDMA)
+       u32* edma_wr;
+ #endif
+-
+       u16 d16;
+       u8  d8;
+       u32 dspi_pushr;
+@@ -400,9 +417,9 @@ static int write(struct driver_data *drv
+       tx_word = is_word_transfer(drv_data);
+-      // If we are in word mode, but only have a single byte to transfer
+-      // then switch to byte mode temporarily.  Will switch back at the
+-      // end of the transfer.
++      /* If we are in word mode, but only have a single byte to transfer
++       * then switch to byte mode temporarily.  Will switch back at the
++       * end of the transfer. */
+       if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
+               drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
+               set_8bit_transfer_mode(drv_data);
+@@ -411,12 +428,10 @@ static int write(struct driver_data *drv
+ #if defined(SPI_DSPI)
+-
+ #if defined(SPI_DSPI_EDMA)
+       edma_wr = (u32*)(drv_data->edma_tx_buf);
+ #endif
+-
+ #if defined(SPI_DSPI_EDMA)
+       while ((drv_data->tx < drv_data->tx_end) && (tx_count < EDMA_BUFFER_SIZE)) {
+ #else
+@@ -432,19 +447,16 @@ static int write(struct driver_data *drv
+                       }
+                       dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16)
+-                                                | DSPI_CS(drv_data->cs)
+-                                               | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
+-                                               //| MCF_DSPI_DTFR_CONT
+-                                               ;
+-
++                                      | DSPI_CS(drv_data->cs)
++                                      | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas);
+                       drv_data->tx += 2;
+ #if defined(SPI_DSPI_EDMA)
+                       if (drv_data->tx == drv_data->tx_end  || tx_count==EDMA_BUFFER_SIZE-1) {
+-#else                 
++#else
+                       if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
+-#endif                                
+-                              // last transfer in queue
++#endif
++                              /* last transfer in the queue */
+                               dspi_pushr |= MCF_DSPI_DTFR_EOQ;
+                               if (drv_data->cs_change) {
+                                       dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
+@@ -453,14 +465,13 @@ static int write(struct driver_data *drv
+                       if (first) {
+                               first = 0;
+-                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
++                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
+                       }
+ #if defined(SPI_DSPI_EDMA)
+                       *edma_wr = dspi_pushr;
+-                      edma_wr++;                      
++                      edma_wr++;
+ #else
+                       *drv_data->dspi_dtfr = dspi_pushr;
+-                      //MCF_DSPI_DTFR = dspi_pushr;
+ #endif
+@@ -473,14 +484,13 @@ static int write(struct driver_data *drv
+                       dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8)
+                                                | DSPI_CS(drv_data->cs)
+-                                               /* | MCF_DSPI_DTFR_PCS5 | */
+                                                | MCF_DSPI_DTFR_CTAS(drv_data->dspi_ctas)
+                                                | MCF_DSPI_DTFR_CONT;
+                       drv_data->tx++;
+                       if (drv_data->tx == drv_data->tx_end  || tx_count==DSPI_FIFO_SIZE-1) {
+-                              // last transfer in queue
++                              /* last transfer in the queue */
+                               dspi_pushr |= MCF_DSPI_DTFR_EOQ;
+                               if (drv_data->cs_change) {
+                                       dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
+@@ -489,16 +499,15 @@ static int write(struct driver_data *drv
+                       if (first) {
+                               first = 0;
+-                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; // clear counter
++                              dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
+                       }
+ #if defined(SPI_DSPI_EDMA)
+                       *edma_wr = dspi_pushr;
+-                      edma_wr++;                      
+-#else                 
++                      edma_wr++;
++#else
+                       *drv_data->dspi_dtfr = dspi_pushr;
+-                      //MCF_DSPI_DTFR = dspi_pushr;
+-#endif                        
++#endif
+               }
+               tx_count++;
+@@ -508,8 +517,8 @@ static int write(struct driver_data *drv
+       if (tx_count>0) {
+-              // TODO: initiate eDMA transfer
+-              set_edma_params(DSPI_DMA_TX_TCD,
++              /* TBD: initiate eDMA transfer */
++              mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD,
+ #ifdef SPI_USE_MMU
+                                       virt_to_phys(drv_data->edma_tx_buf),
+ #else
+@@ -517,18 +526,18 @@ static int write(struct driver_data *drv
+ #endif
+                                       (u32)drv_data->dspi_dtfr,
+                                       MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
+-                                      4,  // soff
+-                                      4,  // nbytes
+-                                      0,  // slast
+-                                      tx_count, // citer
+-                                      tx_count, // biter
+-                                      0, // doff
+-                                      0, // dlastsga
+-                                      0, // major_int
+-                                      1  // disable_req
++                                      4, /* soff */
++                                      4, /* nbytes */
++                                      0, /* slast */
++                                      tx_count, /* citer */
++                                      tx_count, /* biter */
++                                      0, /* doff */
++                                      0, /* dlastsga */
++                                      0, /* major_int */
++                                      1  /* disable_req */
+                                       );
+-              set_edma_params(DSPI_DMA_RX_TCD,
++              mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD,
+                                       (u32)drv_data->dspi_drfr,
+ #ifdef SPI_USE_MMU
+                                       virt_to_phys(drv_data->edma_rx_buf),
+@@ -536,20 +545,20 @@ static int write(struct driver_data *drv
+                                       drv_data->edma_rx_buf,
+ #endif
+                                       MCF_EDMA_TCD_ATTR_SSIZE_32BIT | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
+-                                      0,  // soff
+-                                      4,  // nbytes
+-                                      0,  // slast
+-                                      tx_count, // citer
+-                                      tx_count, // biter
+-                                      4, // doff
+-                                      0,  // dlastsga
+-                    0,   // major_int
+-                                      1       // disable_req
++                                      0, /* soff */
++                                      4, /* nbytes */
++                                      0, /* slast */
++                                      tx_count, /* citer */
++                                      tx_count, /* biter */
++                                      4, /* doff */
++                                      0, /* dlastsga */
++                                      0, /* major_int */
++                                      1  /* disable_req */
+                                       );
+-              start_edma_transfer(DSPI_DMA_TX_TCD); // transmit SPI data
+-              start_edma_transfer(DSPI_DMA_RX_TCD); // receive SPI data
++              start_edma_transfer(DSPI_DMA_TX_TCD); /* transmit SPI data */
++              start_edma_transfer(DSPI_DMA_RX_TCD); /* receive SPI data */
+       }
+ #endif
+@@ -583,9 +592,9 @@ static int write(struct driver_data *drv
+                         | QCR_CONT
+                         | (~((0x01 << drv_data->cs) << 8) & 0x0F00);
+-              if (       (cmd_count == tx_count - 1)
+-                      && (drv_data->tx == drv_data->tx_end)
+-                      && (drv_data->cs_change) ) {
++              if ( (cmd_count == tx_count - 1)
++                   && (drv_data->tx == drv_data->tx_end)
++                   && (drv_data->cs_change) ) {
+                       qcr &= ~QCR_CONT;
+               }
+               *drv_data->qcr = qcr;
+@@ -613,7 +622,6 @@ static int read(struct driver_data *drv_
+       rx_word = is_word_transfer(drv_data);
+ #if defined(SPI_DSPI)
+-
+ #if defined(SPI_DSPI_EDMA)
+       rx_edma = (u32*) drv_data->edma_tx_buf;
+       while ((drv_data->rx < drv_data->rx_end) && (rx_count < EDMA_BUFFER_SIZE)) {
+@@ -646,10 +654,7 @@ static int read(struct driver_data *drv_
+               }
+               rx_count++;
+       }
+-
+-
+ #else
+-
+       *drv_data->qar = QSPI_RECEIVE_RAM;
+       while ((drv_data->rx < drv_data->rx_end) && (rx_count < QSPI_RAM_SIZE)) {
+               if (rx_word) {
+@@ -680,19 +685,18 @@ static inline void qspi_setup_chip(struc
+       *drv_data->mcr = chip->mcr_val;
+-      // TODO: remove later
++      /* TBD: remove later */
++/* JKM -- validate */
+       chip->ctar_val = 0x78560118;
+       *drv_data->ctar = chip->ctar_val;
+       *drv_data->dspi_rser =  0
+-                                                      | MCF_DSPI_DRSER_EOQFE
++                              | MCF_DSPI_DRSER_EOQFE
+ #if defined(SPI_DSPI_EDMA)
+-                                                      | MCF_DSPI_DRSER_TFFFE
+-                                                      | MCF_DSPI_DRSER_TFFFS
++                              | MCF_DSPI_DRSER_TFFFE
++                              | MCF_DSPI_DRSER_TFFFS
+ #endif
+-                                                      ;
+-
+-
++                              ;
+ #else
+       *drv_data->qmr = chip->qmr_val;
+       *drv_data->qdlyr = chip->qdlyr_val;
+@@ -770,7 +774,6 @@ static irqreturn_t qspi_interrupt(int ir
+                        * transfer tasklet
+                        */
+                       if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM) {
+-                              //*drv_data->qmr &= ~QMR_BITS;
+                               set_16bit_transfer_mode(drv_data);
+                       }
+@@ -857,10 +860,8 @@ static void pump_transfers(unsigned long
+       if (message->state == START_STATE) {
+               qspi_setup_chip(drv_data);
+-              if (drv_data->cs_control) {
+-                      //printk( "m s\n" );
+-                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
+-              }
++              if (drv_data->cs_control)
++                      drv_data->cs_control(message->spi->chip_select, QSPI_CS_ASSERT);
+       }
+       /* Delay if requested at end of transfer*/
+@@ -902,12 +903,12 @@ static void pump_transfers(unsigned long
+ }
+-static void pump_messages(struct work_struct * work)
++static void pump_messages(struct work_struct *work)
+ {
+       struct driver_data *drv_data;
+       unsigned long flags;
+-      drv_data = container_of(work,  struct driver_data, pump_messages);
++      drv_data = container_of(work, struct driver_data, pump_messages);
+       /* Lock queue and check for queue work */
+       spin_lock_irqsave(&drv_data->lock, flags);
+@@ -1002,7 +1003,7 @@ static int setup(struct spi_device *spi)
+       chip->mcr.cont_scke = 0;
+       chip->mcr.dconf = 0;
+       chip->mcr.frz = 0;
+-      chip->mcr.mtfe = 1;
++      chip->mcr.mtfe = 0;
+       chip->mcr.pcsse = 0;
+       chip->mcr.rooe = 0;
+       chip->mcr.pcsis = 0xFF;
+@@ -1019,7 +1020,7 @@ static int setup(struct spi_device *spi)
+       if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
+               chip->ctar.fmsz = spi->bits_per_word-1;
+       } else {
+-              printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
++              printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
+               kfree(chip);
+               return -ENODEV;
+       }
+@@ -1056,9 +1057,9 @@ static int setup(struct spi_device *spi)
+ #else
+-      chip->qwr.csiv = 1;    // Chip selects are active low
+-      chip->qmr.master = 1;  // Must set to master mode
+-      chip->qmr.dohie = 1;   // Data output high impediance enabled
++      chip->qwr.csiv = 1;    /* Chip selects are active low */
++      chip->qmr.master = 1;  /* Must set to master mode */
++      chip->qmr.dohie = 1;   /* Data output high impediance enabled */
+       chip->void_write_data = chip_info->void_write_data;
+       chip->qdlyr.qcd = chip_info->del_cs_to_clk;
+@@ -1075,8 +1076,8 @@ static int setup(struct spi_device *spi)
+       chip->qmr.baud = baud_divisor;
+-      //printk( "QSPI: spi->max_speed_hz %d\n", spi->max_speed_hz );
+-      //printk( "QSPI: Baud set to %d\n", chip->qmr.baud );
++      /*printk( "SPI: spi->max_speed_hz %d\n", spi->max_speed_hz );*/
++      /*printk( "SPI: Baud set to %d\n", chip->qmr.baud );*/
+       if (spi->mode & SPI_CPHA)
+               chip->qmr.cpha = 1;
+@@ -1089,7 +1090,7 @@ static int setup(struct spi_device *spi)
+       } else if ((spi->bits_per_word >= 8) && (spi->bits_per_word <= 15)) {
+               chip->qmr.bits = spi->bits_per_word;
+       } else {
+-              printk(KERN_ERR "coldfire-qspi: invalid wordsize\n");
++              printk(KERN_ERR "coldfire-spi: invalid wordsize\n");
+               kfree(chip);
+               return -ENODEV;
+       }
+@@ -1112,7 +1113,7 @@ static int init_queue(struct driver_data
+       tasklet_init(&drv_data->pump_transfers,
+                       pump_transfers, (unsigned long)drv_data);
+-      INIT_WORK(&drv_data->pump_messages, pump_messages/*, drv_data*/);
++      INIT_WORK(&drv_data->pump_messages, pump_messages);
+       drv_data->workqueue = create_singlethread_workqueue(
+                                       drv_data->master->dev.parent->bus_id);
+@@ -1185,7 +1186,7 @@ static int destroy_queue(struct driver_d
+ }
+-static void cleanup(const struct spi_device *spi)
++static void cleanup(struct spi_device *spi)
+ {
+       struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
+@@ -1213,11 +1214,7 @@ static int coldfire_spi_probe(struct pla
+       int status = 0;
+       int i;
+-#if defined(SPI_DSPI_EDMA)
+-      init_edma();
+-#endif
+-
+-      platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
++      platform_info = (struct coldfire_spi_master *)pdev->dev.platform_data;
+       master = spi_alloc_master(dev, sizeof(struct driver_data));
+       if (!master)
+@@ -1241,7 +1238,7 @@ static int coldfire_spi_probe(struct pla
+                       drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
+       /* Setup register addresses */
+-      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-module");
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-module");
+       if (!memory_resource) {
+               dev_dbg(dev, "can not find platform module memory\n");
+               goto out_error_master_alloc;
+@@ -1259,13 +1256,13 @@ static int coldfire_spi_probe(struct pla
+               dev_dbg(dev, "cannot allocate eDMA RX memory\n");
+               goto out_error_master_alloc;
+       }
+-#endif        
++#endif
+       
+ #if defined(SPI_DSPI)
+-      drv_data->mcr           = (void *)(memory_resource->start + 0x00000000);
+-      drv_data->ctar          = (void *)(memory_resource->start + 0x0000000C);
+-      drv_data->dspi_sr       = (void *)(memory_resource->start + 0x0000002C);
++      drv_data->mcr       = (void *)(memory_resource->start + 0x00000000);
++      drv_data->ctar      = (void *)(memory_resource->start + 0x0000000C);
++      drv_data->dspi_sr   = (void *)(memory_resource->start + 0x0000002C);
+       drv_data->dspi_rser = (void *)(memory_resource->start + 0x00000030);
+       drv_data->dspi_dtfr = (void *)(memory_resource->start + 0x00000034);
+       drv_data->dspi_drfr = (void *)(memory_resource->start + 0x00000038);
+@@ -1283,7 +1280,7 @@ static int coldfire_spi_probe(struct pla
+ #endif
+       /* Setup register addresses */
+-      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-par");
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-par");
+       if (!memory_resource) {
+               dev_dbg(dev, "can not find platform par memory\n");
+               goto out_error_master_alloc;
+@@ -1292,7 +1289,7 @@ static int coldfire_spi_probe(struct pla
+       drv_data->par = (void *)memory_resource->start;
+       /* Setup register addresses */
+-      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-level");
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-level");
+       if (!memory_resource) {
+               dev_dbg(dev, "can not find platform par memory\n");
+               goto out_error_master_alloc;
+@@ -1301,7 +1298,7 @@ static int coldfire_spi_probe(struct pla
+       drv_data->int_icr = (void *)memory_resource->start;
+       /* Setup register addresses */
+-      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi-int-mask");
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM, "spi-int-mask");
+       if (!memory_resource) {
+               dev_dbg(dev, "can not find platform par memory\n");
+               goto out_error_master_alloc;
+@@ -1309,32 +1306,52 @@ static int coldfire_spi_probe(struct pla
+       drv_data->int_mr = (void *)memory_resource->start;
+-      irq = platform_info->irq_vector;
++      if (platform_info->irq_list) {
++              /* multiple IRQs */
++              int *irqlist = platform_info->irq_list;
++              while ((irq = *irqlist++)) {
++                      int off = *irqlist++;
++                      int lvl = *irqlist++;
++                      int msk = *irqlist++;
++                      status = request_irq(irq, qspi_interrupt, IRQF_DISABLED,
++                                           dev->bus_id, drv_data);
++                      if (status < 0) {
++                              dev_err(&pdev->dev, 
++                                      "unable to attach ColdFire DSPI interrupt\n");
++                              goto out_error_master_alloc;
++                      }
++
++                      if (lvl)
++                              *(drv_data->int_icr + off) = lvl;
+-      status = request_irq(platform_info->irq_vector, qspi_interrupt, IRQF_DISABLED, dev->bus_id, drv_data);
+-      if (status < 0) {
+-              dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
+-              goto out_error_master_alloc;
++                      if (msk)
++                              *drv_data->int_mr &= ~msk;
++              }
+       }
++      else {
++              irq = platform_info->irq_vector;
+-      /* Now that we have all the addresses etc.  Let's set it up */
+-      // TODO:
+-      //*drv_data->par = platform_info->par_val;
++              status = request_irq(platform_info->irq_vector, qspi_interrupt,
++                                   IRQF_DISABLED, dev->bus_id, drv_data);
++              if (status < 0) {
++                      dev_err(&pdev->dev, "unable to attach ColdFire QSPI interrupt\n");
++                      goto out_error_master_alloc;
++              }
+-      MCF_GPIO_PAR_DSPI = 0
+-              | MCF_GPIO_PAR_DSPI_PCS5_PCS5
+-              | MCF_GPIO_PAR_DSPI_PCS2_PCS2
+-              | MCF_GPIO_PAR_DSPI_PCS1_PCS1
+-              | MCF_GPIO_PAR_DSPI_PCS0_PCS0
+-              | MCF_GPIO_PAR_DSPI_SIN_SIN
+-              | MCF_GPIO_PAR_DSPI_SOUT_SOUT
+-              | MCF_GPIO_PAR_DSPI_SCK_SCK;
++              *drv_data->int_icr = platform_info->irq_lp;
++              *drv_data->int_mr &= ~platform_info->irq_mask;
++      }
++
++      /* Now that we have all the addresses etc.  Let's set it up */
++      if (platform_info->par_val)
++              *drv_data->par = platform_info->par_val;
+-      *drv_data->int_icr = platform_info->irq_lp;
+-      *drv_data->int_mr &= ~platform_info->irq_mask;
++#ifdef CONFIG_M5227x
++      MCF_GPIO_PAR_IRQ = 0x04; /* Mistake in RM documentation */
++#endif
+ #ifdef SPI_DSPI
+-      drv_data->dspi_ctas = 0; // TODO: change later
++      drv_data->dspi_ctas = 0; /* TBD: change later */
+ #endif
+       /* Initial and start queue */
+@@ -1359,40 +1376,37 @@ static int coldfire_spi_probe(struct pla
+       }
+ #if defined(SPI_DSPI_EDMA)
+-      if (request_edma_channel(DSPI_DMA_TX_TCD,
+-                                                      edma_tx_handler,
+-                                                      NULL,
+-                                                      pdev,
+-                                                      NULL, /* spinlock */
+-                                                      DRIVER_NAME
+-                                                      )!=0)
+-      {
++      if (mcf_edma_request_channel(DSPI_DMA_TX_TCD,
++                                   edma_tx_handler,
++                                   NULL,
++                                   pdev,
++                                   NULL, /* spinlock */
++                                   DRIVER_NAME
++                                   )!=0) {
+               dev_err(&pdev->dev, "problem requesting edma transmit channel\n");
+               status = -EINVAL;
+-        goto out_error_queue_alloc;
++              goto out_error_queue_alloc;
+       }
+-      if (request_edma_channel(DSPI_DMA_RX_TCD,
+-                                                      edma_rx_handler,
+-                                                      NULL,
+-                                                      pdev,
+-                                                      NULL, /* spinlock */
+-                                                      DRIVER_NAME
+-                                                      )!=0)
+-      {
++      if (mcf_edma_request_channel(DSPI_DMA_RX_TCD,
++                                   edma_rx_handler,
++                                   NULL,
++                                   pdev,
++                                   NULL, /* spinlock */
++                                   DRIVER_NAME
++                                   )!=0) {
+               dev_err(&pdev->dev, "problem requesting edma receive channel\n");
+               status = -EINVAL;
+-        goto out_edma_transmit;
++              goto out_edma_transmit;
+       }
+ #endif
+-      printk( "SPI: Coldfire master initialized\n" );
+-      //dev_info(&pdev->dev, "driver initialized\n");
++      printk(KERN_INFO "SPI: Coldfire master initialized\n" );
+       return status;
+ #if defined(SPI_DSPI_EDMA)
+ out_edma_transmit:
+-      free_edma_channel(DSPI_DMA_TX_TCD, pdev);
++      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
+ #endif
+ out_error_queue_alloc:
+@@ -1417,8 +1431,8 @@ static int coldfire_spi_remove(struct pl
+               return 0;
+ #if defined(SPI_DSPI_EDMA)
+-      free_edma_channel(DSPI_DMA_TX_TCD, pdev);
+-      free_edma_channel(DSPI_DMA_RX_TCD, pdev);
++      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
++      mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev);
+ #endif        
+       /* Remove the queue */
+@@ -1426,27 +1440,8 @@ static int coldfire_spi_remove(struct pl
+       if (status != 0)
+               return status;
+-      /* Disable the SSP at the peripheral and SOC level */
+-      /*write_SSCR0(0, drv_data->ioaddr);
+-      pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
+-
+-      /* Release DMA */
+-      /*if (drv_data->master_info->enable_dma) {
+-              if (drv_data->ioaddr == SSP1_VIRT) {
+-                      DRCMRRXSSDR = 0;
+-                      DRCMRTXSSDR = 0;
+-              } else if (drv_data->ioaddr == SSP2_VIRT) {
+-                      DRCMRRXSS2DR = 0;
+-                      DRCMRTXSS2DR = 0;
+-              } else if (drv_data->ioaddr == SSP3_VIRT) {
+-                      DRCMRRXSS3DR = 0;
+-                      DRCMRTXSS3DR = 0;
+-              }
+-              pxa_free_dma(drv_data->tx_channel);
+-              pxa_free_dma(drv_data->rx_channel);
+-      }*/
+-
+       /* Release IRQ */
++/* JKM -- check for list and remove list */
+       irq = platform_get_irq(pdev, 0);
+       if (irq >= 0)
+               free_irq(irq, drv_data);
+@@ -1496,8 +1491,6 @@ static int coldfire_spi_suspend(struct p
+       status = stop_queue(drv_data);
+       if (status != 0)
+               return status;
+-      /*write_SSCR0(0, drv_data->ioaddr);
+-      pxa_set_cken(drv_data->master_info->clock_enable, 0);*/
+       return 0;
+ }
+@@ -1507,9 +1500,6 @@ static int coldfire_spi_resume(struct pl
+       struct driver_data *drv_data = platform_get_drvdata(pdev);
+       int status = 0;
+-      /* Enable the SSP clock */
+-      /*pxa_set_cken(drv_data->master_info->clock_enable, 1);*/
+-
+       /* Start the queue running */
+       status = start_queue(drv_data);
+       if (status != 0) {
+--- /dev/null
++++ b/include/asm-m68k/m5485dspi.h
+@@ -0,0 +1,144 @@
++/*
++ * File:      mcf548x_dspi.h
++ * Purpose:   Register and bit definitions for the MCF548X
++ *
++ * Notes:
++ *
++ */
++
++#ifndef _M5485DSPI_H_
++#define _M5485DSPI_H_
++
++/*
++ *
++ * DMA Serial Peripheral Interface (DSPI)
++ *
++ */
++
++/* Register read/write macros */
++#define MCF_DSPI_DMCR         MCF_REG32(0x008A00)
++#define MCF_DSPI_DTCR         MCF_REG32(0x008A08)
++#define MCF_DSPI_DCTAR0       MCF_REG32(0x008A0C)
++#define MCF_DSPI_DCTAR1       MCF_REG32(0x008A10)
++#define MCF_DSPI_DCTAR2       MCF_REG32(0x008A14)
++#define MCF_DSPI_DCTAR3       MCF_REG32(0x008A18)
++#define MCF_DSPI_DCTAR4       MCF_REG32(0x008A1C)
++#define MCF_DSPI_DCTAR5       MCF_REG32(0x008A20)
++#define MCF_DSPI_DCTAR6       MCF_REG32(0x008A24)
++#define MCF_DSPI_DCTAR7       MCF_REG32(0x008A28)
++#define MCF_DSPI_DCTARn(x)    MCF_REG32(0x008A0C+(x*4))
++#define MCF_DSPI_DSR          MCF_REG32(0x008A2C)
++#define MCF_DSPI_DRSER        MCF_REG32(0x008A30)
++#define MCF_DSPI_DTFR         MCF_REG32(0x008A34)
++#define MCF_DSPI_DRFR         MCF_REG32(0x008A38)
++#define MCF_DSPI_DTFDR0       MCF_REG32(0x008A3C)
++#define MCF_DSPI_DTFDR1       MCF_REG32(0x008A40)
++#define MCF_DSPI_DTFDR2       MCF_REG32(0x008A44)
++#define MCF_DSPI_DTFDR3       MCF_REG32(0x008A48)
++#define MCF_DSPI_DTFDRn(x)    MCF_REG32(0x008A3C+(x*4))
++#define MCF_DSPI_DRFDR0       MCF_REG32(0x008A7C)
++#define MCF_DSPI_DRFDR1       MCF_REG32(0x008A80)
++#define MCF_DSPI_DRFDR2       MCF_REG32(0x008A84)
++#define MCF_DSPI_DRFDR3       MCF_REG32(0x008A88)
++#define MCF_DSPI_DRFDRn(x)    MCF_REG32(0x008A7C+(x*4))
++
++/* Bit definitions and macros for MCF_DSPI_DMCR */
++#define MCF_DSPI_DMCR_HALT             (0x00000001)
++#define MCF_DSPI_DMCR_SMPL_PT(x)       (((x)&0x00000003)<<8)
++#define MCF_DSPI_DMCR_CRXF             (0x00000400)
++#define MCF_DSPI_DMCR_CTXF             (0x00000800)
++#define MCF_DSPI_DMCR_DRXF             (0x00001000)
++#define MCF_DSPI_DMCR_DTXF             (0x00002000)
++#define MCF_DSPI_DMCR_CSIS0            (0x00010000)
++#define MCF_DSPI_DMCR_CSIS2            (0x00040000)
++#define MCF_DSPI_DMCR_CSIS3            (0x00080000)
++#define MCF_DSPI_DMCR_CSIS5            (0x00200000)
++#define MCF_DSPI_DMCR_ROOE             (0x01000000)
++#define MCF_DSPI_DMCR_PCSSE            (0x02000000)
++#define MCF_DSPI_DMCR_MTFE             (0x04000000)
++#define MCF_DSPI_DMCR_FRZ              (0x08000000)
++#define MCF_DSPI_DMCR_DCONF(x)         (((x)&0x00000003)<<28)
++#define MCF_DSPI_DMCR_CSCK             (0x40000000)
++#define MCF_DSPI_DMCR_MSTR             (0x80000000)
++
++/* Bit definitions and macros for MCF_DSPI_DTCR */
++#define MCF_DSPI_DTCR_SPI_TCNT(x)      (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_DSPI_DCTARn */
++#define MCF_DSPI_DCTAR_BR(x)          (((x)&0x0000000F)<<0)
++#define MCF_DSPI_DCTAR_DT(x)          (((x)&0x0000000F)<<4)
++#define MCF_DSPI_DCTAR_ASC(x)         (((x)&0x0000000F)<<8)
++#define MCF_DSPI_DCTAR_CSSCK(x)       (((x)&0x0000000F)<<12)
++#define MCF_DSPI_DCTAR_PBR(x)         (((x)&0x00000003)<<16)
++#define MCF_DSPI_DCTAR_PDT(x)         (((x)&0x00000003)<<18)
++#define MCF_DSPI_DCTAR_PASC(x)        (((x)&0x00000003)<<20)
++#define MCF_DSPI_DCTAR_PCSSCK(x)      (((x)&0x00000003)<<22)
++#define MCF_DSPI_DCTAR_LSBFE          (0x01000000)
++#define MCF_DSPI_DCTAR_CPHA           (0x02000000)
++#define MCF_DSPI_DCTAR_CPOL           (0x04000000)
++/* #define MCF_DSPI_DCTAR_TRSZ(x)        (((x)&0x0000000F)<<27) */
++#define MCF_DSPI_DCTAR_FMSZ(x)        (((x)&0x0000000F)<<27)
++#define MCF_DSPI_DCTAR_PCSSCK_1CLK    (0x00000000)
++#define MCF_DSPI_DCTAR_PCSSCK_3CLK    (0x00400000)
++#define MCF_DSPI_DCTAR_PCSSCK_5CLK    (0x00800000)
++#define MCF_DSPI_DCTAR_PCSSCK_7CLK    (0x00A00000)
++#define MCF_DSPI_DCTAR_PASC_1CLK      (0x00000000)
++#define MCF_DSPI_DCTAR_PASC_3CLK      (0x00100000)
++#define MCF_DSPI_DCTAR_PASC_5CLK      (0x00200000)
++#define MCF_DSPI_DCTAR_PASC_7CLK      (0x00300000)
++#define MCF_DSPI_DCTAR_PDT_1CLK       (0x00000000)
++#define MCF_DSPI_DCTAR_PDT_3CLK       (0x00040000)
++#define MCF_DSPI_DCTAR_PDT_5CLK       (0x00080000)
++#define MCF_DSPI_DCTAR_PDT_7CLK       (0x000A0000)
++#define MCF_DSPI_DCTAR_PBR_1CLK       (0x00000000)
++#define MCF_DSPI_DCTAR_PBR_3CLK       (0x00010000)
++#define MCF_DSPI_DCTAR_PBR_5CLK       (0x00020000)
++#define MCF_DSPI_DCTAR_PBR_7CLK       (0x00030000)
++
++/* Bit definitions and macros for MCF_DSPI_DSR */
++#define MCF_DSPI_DSR_RXPTR(x)          (((x)&0x0000000F)<<0)
++#define MCF_DSPI_DSR_RXCTR(x)          (((x)&0x0000000F)<<4)
++#define MCF_DSPI_DSR_TXPTR(x)          (((x)&0x0000000F)<<8)
++#define MCF_DSPI_DSR_TXCTR(x)          (((x)&0x0000000F)<<12)
++#define MCF_DSPI_DSR_RFDF              (0x00020000)
++#define MCF_DSPI_DSR_RFOF              (0x00080000)
++#define MCF_DSPI_DSR_TFFF              (0x02000000)
++#define MCF_DSPI_DSR_TFUF              (0x08000000)
++#define MCF_DSPI_DSR_EOQF              (0x10000000)
++#define MCF_DSPI_DSR_TXRXS             (0x40000000)
++#define MCF_DSPI_DSR_TCF               (0x80000000)
++
++/* Bit definitions and macros for MCF_DSPI_DRSER */
++#define MCF_DSPI_DRSER_RFDFS           (0x00010000)
++#define MCF_DSPI_DRSER_RFDFE           (0x00020000)
++#define MCF_DSPI_DRSER_RFOFE           (0x00080000)
++#define MCF_DSPI_DRSER_TFFFS           (0x01000000)
++#define MCF_DSPI_DRSER_TFFFE           (0x02000000)
++#define MCF_DSPI_DRSER_TFUFE           (0x08000000)
++#define MCF_DSPI_DRSER_EOQFE           (0x10000000)
++#define MCF_DSPI_DRSER_TCFE            (0x80000000)
++
++/* Bit definitions and macros for MCF_DSPI_DTFR */
++#define MCF_DSPI_DTFR_TXDATA(x)        (((x)&0x0000FFFF)<<0)
++#define MCF_DSPI_DTFR_CS0              (0x00010000)
++#define MCF_DSPI_DTFR_CS2              (0x00040000)
++#define MCF_DSPI_DTFR_CS3              (0x00080000)
++#define MCF_DSPI_DTFR_CS5              (0x00200000)
++#define MCF_DSPI_DTFR_CTCNT            (0x04000000)
++#define MCF_DSPI_DTFR_EOQ              (0x08000000)
++#define MCF_DSPI_DTFR_CTAS(x)          (((x)&0x00000007)<<28)
++#define MCF_DSPI_DTFR_CONT             (0x80000000)
++
++/* Bit definitions and macros for MCF_DSPI_DRFR */
++#define MCF_DSPI_DRFR_RXDATA(x)        (((x)&0x0000FFFF)<<0)
++
++/* Bit definitions and macros for MCF_DSPI_DTFDRn */
++#define MCF_DSPI_DTFDRn_TXDATA(x)      (((x)&0x0000FFFF)<<0)
++#define MCF_DSPI_DTFDRn_TXCMD(x)       (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_DSPI_DRFDRn */
++#define MCF_DSPI_DRFDRn_RXDATA(x)      (((x)&0x0000FFFF)<<0)
++
++/********************************************************************/
++
++#endif /* _M5485DSPI_H_ */
+--- a/include/asm-m68k/mcfqspi.h
++++ b/include/asm-m68k/mcfqspi.h
+@@ -36,6 +36,7 @@ struct coldfire_spi_master {
+       u32 irq_mask;
+       u8  irq_lp;
+       u8  par_val;
++      u32 *irq_list;
+       void (*cs_control)(u8 cs, u8 command);
+ };
+--- a/include/asm-m68k/mcfsim.h
++++ b/include/asm-m68k/mcfsim.h
+@@ -25,6 +25,7 @@
+ #include <asm/mcf5445x_dtim.h>
+ #elif defined(CONFIG_M547X_8X)
+ #include <asm/m5485sim.h>
++#include <asm/m5485gpio.h>
+ #endif
+ /*
diff --git a/target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch b/target/linux/coldfire/patches/053-mcfv4e_brcache_inval.patch
new file mode 100644 (file)
index 0000000..dc551ba
--- /dev/null
@@ -0,0 +1,42 @@
+From eba69831e8f35174e2e15e373a66f40dc0be8929 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 14 May 2008 12:23:12 -0600
+Subject: [PATCH] Force branch-cache invalidate on task switch.
+
+When finishing a task switch make sure the branch cache
+gets invalidated to ensure no stale entries exist for
+the next user space.
+
+LTIBName: mcfv4e-brcache-inval
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/system.h |   15 +++++++++++++++
+ 1 files changed, 15 insertions(+), 0 deletions(-)
+
+--- a/include/asm-m68k/system.h
++++ b/include/asm-m68k/system.h
+@@ -5,9 +5,24 @@
+ #include <linux/kernel.h>
+ #include <asm/segment.h>
+ #include <asm/entry.h>
++#include <asm/cfcache.h>
+ #ifdef __KERNEL__
++#ifdef CONFIG_COLDFIRE
++#define FLUSH_BC        (0x00040000)
++
++#define finish_arch_switch(prev) do {         \
++      unsigned long tmpreg;                   \
++      asm volatile ( "move.l %2,%0\n"         \
++                     "orl %1,%0\n"            \
++                     "movec %0,%%cacr"        \
++                     : "=&d" (tmpreg)         \
++                     : "id" (FLUSH_BC), "m" (shadow_cacr));   \
++      } while(0)
++
++#endif
++
+ /*
+  * switch_to(n) should switch tasks to task ptr, first checking that
+  * ptr isn't the current task, in which case it does nothing.  This
diff --git a/target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch b/target/linux/coldfire/patches/054-mcfv4e_defconfig_upd.patch
new file mode 100644 (file)
index 0000000..3742421
--- /dev/null
@@ -0,0 +1,2227 @@
+From 8a089acdd2f29356883bcbd65622fda8b0a7f276 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 15 May 2008 11:51:00 -0600
+Subject: [PATCH] Defconfig updates for M54455EVB, M5475EVB and M5485EVB.
+
+LTIBName: mcfv4e-defconfig-upd
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/configs/55_defconfig        |  830 ++++++++++++++++++++++++++++
+ arch/m68k/configs/m54455evb_defconfig |    2 +-
+ arch/m68k/configs/m5475evb_defconfig  |  954 +++++++++++++++++++++++++++++++++
+ arch/m68k/configs/m5485evb_defconfig  |  197 ++++----
+ 4 files changed, 1889 insertions(+), 94 deletions(-)
+ create mode 100644 arch/m68k/configs/55_defconfig
+ create mode 100644 arch/m68k/configs/m5475evb_defconfig
+
+--- /dev/null
++++ b/arch/m68k/configs/55_defconfig
+@@ -0,0 +1,830 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.25
++# Thu Jun 26 16:17:41 2008
++#
++CONFIG_M68K=y
++CONFIG_MMU=y
++# CONFIG_GENERIC_TIME is not set
++# CONFIG_GENERIC_CLOCKEVENTS is not set
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_TIME_LOW_RES=y
++CONFIG_GENERIC_IOMAP=y
++# CONFIG_NO_IOPORT is not set
++# CONFIG_NO_DMA is not set
++CONFIG_ARCH_SUPPORTS_AOUT=y
++CONFIG_HZ=100
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=17
++# CONFIG_CGROUPS is not set
++CONFIG_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++# CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++# CONFIG_EMBEDDED is not set
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++# CONFIG_HAVE_OPROFILE is not set
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
++
++#
++# Platform dependent setup
++#
++# CONFIG_SUN3 is not set
++CONFIG_COLDFIRE=y
++CONFIG_CFV4E=y
++# CONFIG_AMIGA is not set
++# CONFIG_ATARI is not set
++# CONFIG_PCI is not set
++# CONFIG_MAC is not set
++# CONFIG_APOLLO is not set
++# CONFIG_VME is not set
++# CONFIG_HP300 is not set
++# CONFIG_SUN3X is not set
++# CONFIG_Q40 is not set
++
++#
++# Processor type
++#
++# CONFIG_M68020 is not set
++# CONFIG_M68030 is not set
++# CONFIG_M68040 is not set
++# CONFIG_M68060 is not set
++CONFIG_M5445X=y
++# CONFIG_M54451 is not set
++CONFIG_M54455=y
++# CONFIG_M54451EVB is not set
++CONFIG_M54455EVB=y
++# CONFIG_M547X_8X is not set
++CONFIG_MCFCLK=266666666
++# CONFIG_MCF_USER_HALT is not set
++CONFIG_MMU_CFV4E=y
++CONFIG_SDRAM_BASE=0x40000000
++CONFIG_SDRAM_SIZE=0x10000000
++CONFIG_NOR_FLASH_BASE=0x00000000
++# CONFIG_M68KFPU_EMU is not set
++CONFIG_ADVANCED=y
++# CONFIG_RMW_INSNS is not set
++CONFIG_SINGLE_MEMORY_CHUNK=y
++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_NEED_MULTIPLE_NODES=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++
++#
++# General setup
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++CONFIG_PROC_HARDWARE=y
++CONFIG_ZONE_DMA=y
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++CONFIG_NET_KEY=y
++# CONFIG_NET_KEY_MIGRATE is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_NET_SCHED is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++# CONFIG_STANDALONE is not set
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++# CONFIG_MTD is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=64000
++# CONFIG_BLK_DEV_XIP is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++# CONFIG_COLDFIRE_SEC is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_TGT is not set
++# CONFIG_SCSI_NETLINK is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++CONFIG_SCSI_MULTI_LUN=y
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++CONFIG_SCSI_LOWLEVEL=y
++# CONFIG_ISCSI_TCP is not set
++# CONFIG_SCSI_DEBUG is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_B44 is not set
++CONFIG_FEC=y
++# CONFIG_FEC2 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ATKBD is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_COLDFIRE=y
++# CONFIG_SERIAL_MCF is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++CONFIG_I2C_CHARDEV=y
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++# CONFIG_I2C_MCF548x is not set
++CONFIG_I2C_MCF=y
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_PCF8575 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
++
++#
++# SPI support
++#
++# CONFIG_SPI is not set
++# CONFIG_COLDFIRE_EDMA is not set
++# CONFIG_SPI_MASTER is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++# CONFIG_WATCHDOG is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_SM501 is not set
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++CONFIG_DAB=y
++
++#
++# Graphics support
++#
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++# CONFIG_HID_SUPPORT is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# Character devices
++#
++# CONFIG_SERIAL_CONSOLE is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=y
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++CONFIG_DNOTIFY=y
++# CONFIG_INOTIFY is not set
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=y
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# CONFIG_CONFIGFS_FS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++CONFIG_MINIX_FS=y
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++# CONFIG_ROMFS_FS is not set
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++# CONFIG_NFS_V3 is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++CONFIG_NLS_ISO8859_1=y
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++# CONFIG_ENABLE_MUST_CHECK is not set
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++CONFIG_DEBUG_SLAB=y
++# CONFIG_DEBUG_SLAB_LEAK is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_FRAME_POINTER is not set
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_BOOTPARAM=y
++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=y
++CONFIG_CRYPTO_BLKCIPHER=y
++# CONFIG_CRYPTO_SEQIV is not set
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++CONFIG_CRYPTO_ECB=y
++CONFIG_CRYPTO_CBC=y
++CONFIG_CRYPTO_PCBC=m
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++CONFIG_CRYPTO_AUTHENC=y
++# CONFIG_CRYPTO_LZO is not set
++CONFIG_CRYPTO_HW=y
++# CONFIG_CRYPTO_DEV_MCFCAU is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
+--- a/arch/m68k/configs/m54455evb_defconfig
++++ b/arch/m68k/configs/m54455evb_defconfig
+@@ -963,7 +963,7 @@ CONFIG_FORCED_INLINING=y
+ # CONFIG_RCU_TORTURE_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ CONFIG_BOOTPARAM=y
+-CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe ip=172.27.155.55:172.27.155.1:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
+ #
+ # CodeTEST Setup
+--- /dev/null
++++ b/arch/m68k/configs/m5475evb_defconfig
+@@ -0,0 +1,954 @@
++#
++# Automatically generated make config: don't edit
++# Linux kernel version: 2.6.25
++# Wed Jul  9 16:09:19 2008
++#
++CONFIG_M68K=y
++CONFIG_MMU=y
++# CONFIG_GENERIC_TIME is not set
++# CONFIG_GENERIC_CLOCKEVENTS is not set
++CONFIG_RWSEM_GENERIC_SPINLOCK=y
++# CONFIG_ARCH_HAS_ILOG2_U32 is not set
++# CONFIG_ARCH_HAS_ILOG2_U64 is not set
++CONFIG_GENERIC_HWEIGHT=y
++CONFIG_GENERIC_CALIBRATE_DELAY=y
++CONFIG_TIME_LOW_RES=y
++CONFIG_GENERIC_IOMAP=y
++# CONFIG_NO_IOPORT is not set
++# CONFIG_NO_DMA is not set
++CONFIG_ARCH_SUPPORTS_AOUT=y
++CONFIG_HZ=100
++CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
++
++#
++# General setup
++#
++CONFIG_EXPERIMENTAL=y
++CONFIG_BROKEN_ON_SMP=y
++CONFIG_INIT_ENV_ARG_LIMIT=32
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_SWAP=y
++CONFIG_SYSVIPC=y
++CONFIG_SYSVIPC_SYSCTL=y
++# CONFIG_POSIX_MQUEUE is not set
++# CONFIG_BSD_PROCESS_ACCT is not set
++# CONFIG_TASKSTATS is not set
++# CONFIG_AUDIT is not set
++CONFIG_IKCONFIG=y
++CONFIG_IKCONFIG_PROC=y
++CONFIG_LOG_BUF_SHIFT=17
++# CONFIG_CGROUPS is not set
++CONFIG_GROUP_SCHED=y
++CONFIG_FAIR_GROUP_SCHED=y
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
++CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
++# CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
++# CONFIG_BLK_DEV_INITRD is not set
++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
++CONFIG_SYSCTL=y
++# CONFIG_EMBEDDED is not set
++CONFIG_UID16=y
++CONFIG_SYSCTL_SYSCALL=y
++CONFIG_KALLSYMS=y
++# CONFIG_KALLSYMS_ALL is not set
++# CONFIG_KALLSYMS_EXTRA_PASS is not set
++CONFIG_HOTPLUG=y
++CONFIG_PRINTK=y
++CONFIG_BUG=y
++CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
++CONFIG_BASE_FULL=y
++CONFIG_FUTEX=y
++CONFIG_ANON_INODES=y
++CONFIG_EPOLL=y
++CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
++CONFIG_EVENTFD=y
++CONFIG_SHMEM=y
++CONFIG_VM_EVENT_COUNTERS=y
++CONFIG_SLAB=y
++# CONFIG_SLUB is not set
++# CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++# CONFIG_HAVE_OPROFILE is not set
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
++CONFIG_SLABINFO=y
++CONFIG_RT_MUTEXES=y
++# CONFIG_TINY_SHMEM is not set
++CONFIG_BASE_SMALL=0
++CONFIG_MODULES=y
++CONFIG_MODULE_UNLOAD=y
++CONFIG_MODULE_FORCE_UNLOAD=y
++# CONFIG_MODVERSIONS is not set
++# CONFIG_MODULE_SRCVERSION_ALL is not set
++# CONFIG_KMOD is not set
++CONFIG_BLOCK=y
++CONFIG_LBD=y
++# CONFIG_BLK_DEV_IO_TRACE is not set
++# CONFIG_LSF is not set
++# CONFIG_BLK_DEV_BSG is not set
++
++#
++# IO Schedulers
++#
++CONFIG_IOSCHED_NOOP=y
++CONFIG_IOSCHED_AS=y
++CONFIG_IOSCHED_DEADLINE=y
++CONFIG_IOSCHED_CFQ=y
++# CONFIG_DEFAULT_AS is not set
++# CONFIG_DEFAULT_DEADLINE is not set
++CONFIG_DEFAULT_CFQ=y
++# CONFIG_DEFAULT_NOOP is not set
++CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
++
++#
++# Platform dependent setup
++#
++# CONFIG_SUN3 is not set
++CONFIG_COLDFIRE=y
++CONFIG_CFV4E=y
++CONFIG_MCD_DMA=y
++# CONFIG_AMIGA is not set
++# CONFIG_ATARI is not set
++CONFIG_PCI=y
++# CONFIG_MAC is not set
++# CONFIG_APOLLO is not set
++# CONFIG_VME is not set
++# CONFIG_HP300 is not set
++# CONFIG_SUN3X is not set
++# CONFIG_Q40 is not set
++
++#
++# Processor type
++#
++# CONFIG_M68020 is not set
++# CONFIG_M68030 is not set
++# CONFIG_M68040 is not set
++# CONFIG_M68060 is not set
++# CONFIG_M5445X is not set
++CONFIG_M547X_8X=y
++CONFIG_M547X=y
++# CONFIG_M548X is not set
++# CONFIG_M5475AFE is not set
++# CONFIG_M5475BFE is not set
++CONFIG_M5475CFE=y
++# CONFIG_M5475DFE is not set
++# CONFIG_M5475EFE is not set
++# CONFIG_M5475FFE is not set
++# CONFIG_M5485AFE is not set
++# CONFIG_M5485BFE is not set
++# CONFIG_M5485CFE is not set
++# CONFIG_M5485DFE is not set
++# CONFIG_M5485EFE is not set
++# CONFIG_M5485FFE is not set
++CONFIG_MCFCLK=266000000
++# CONFIG_MCF_USER_HALT is not set
++CONFIG_MMU_CFV4E=y
++CONFIG_SDRAM_BASE=0x00000000
++CONFIG_SDRAM_SIZE=0x04000000
++CONFIG_NOR_FLASH_BASE=0xE0000000
++# CONFIG_M68KFPU_EMU is not set
++CONFIG_ADVANCED=y
++# CONFIG_RMW_INSNS is not set
++CONFIG_SINGLE_MEMORY_CHUNK=y
++# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
++CONFIG_SELECT_MEMORY_MODEL=y
++CONFIG_FLATMEM_MANUAL=y
++# CONFIG_DISCONTIGMEM_MANUAL is not set
++# CONFIG_SPARSEMEM_MANUAL is not set
++CONFIG_FLATMEM=y
++CONFIG_FLAT_NODE_MEM_MAP=y
++CONFIG_NEED_MULTIPLE_NODES=y
++# CONFIG_SPARSEMEM_STATIC is not set
++# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
++CONFIG_SPLIT_PTLOCK_CPUS=4
++# CONFIG_RESOURCES_64BIT is not set
++CONFIG_ZONE_DMA_FLAG=1
++CONFIG_BOUNCE=y
++CONFIG_VIRT_TO_BUS=y
++
++#
++# General setup
++#
++CONFIG_BINFMT_ELF=y
++# CONFIG_BINFMT_AOUT is not set
++# CONFIG_BINFMT_MISC is not set
++CONFIG_PROC_HARDWARE=y
++CONFIG_ZONE_DMA=y
++# CONFIG_ARCH_SUPPORTS_MSI is not set
++CONFIG_PCI_LEGACY=y
++# CONFIG_PCI_DEBUG is not set
++
++#
++# Power management options
++#
++# CONFIG_PM is not set
++
++#
++# Networking
++#
++CONFIG_NET=y
++
++#
++# Networking options
++#
++CONFIG_PACKET=y
++# CONFIG_PACKET_MMAP is not set
++CONFIG_UNIX=y
++CONFIG_XFRM=y
++# CONFIG_XFRM_USER is not set
++# CONFIG_XFRM_SUB_POLICY is not set
++# CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
++CONFIG_NET_KEY=y
++# CONFIG_NET_KEY_MIGRATE is not set
++CONFIG_INET=y
++# CONFIG_IP_MULTICAST is not set
++CONFIG_IP_ADVANCED_ROUTER=y
++CONFIG_ASK_IP_FIB_HASH=y
++# CONFIG_IP_FIB_TRIE is not set
++CONFIG_IP_FIB_HASH=y
++# CONFIG_IP_MULTIPLE_TABLES is not set
++# CONFIG_IP_ROUTE_MULTIPATH is not set
++# CONFIG_IP_ROUTE_VERBOSE is not set
++CONFIG_IP_PNP=y
++# CONFIG_IP_PNP_DHCP is not set
++# CONFIG_IP_PNP_BOOTP is not set
++# CONFIG_IP_PNP_RARP is not set
++# CONFIG_NET_IPIP is not set
++# CONFIG_NET_IPGRE is not set
++# CONFIG_ARPD is not set
++# CONFIG_SYN_COOKIES is not set
++CONFIG_INET_AH=y
++CONFIG_INET_ESP=y
++# CONFIG_INET_IPCOMP is not set
++# CONFIG_INET_XFRM_TUNNEL is not set
++# CONFIG_INET_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
++# CONFIG_INET_XFRM_MODE_TUNNEL is not set
++# CONFIG_INET_XFRM_MODE_BEET is not set
++# CONFIG_INET_LRO is not set
++CONFIG_INET_DIAG=y
++CONFIG_INET_TCP_DIAG=y
++# CONFIG_TCP_CONG_ADVANCED is not set
++CONFIG_TCP_CONG_CUBIC=y
++CONFIG_DEFAULT_TCP_CONG="cubic"
++# CONFIG_TCP_MD5SIG is not set
++# CONFIG_IPV6 is not set
++# CONFIG_INET6_XFRM_TUNNEL is not set
++# CONFIG_INET6_TUNNEL is not set
++# CONFIG_NETWORK_SECMARK is not set
++# CONFIG_NETFILTER is not set
++# CONFIG_IP_DCCP is not set
++# CONFIG_IP_SCTP is not set
++# CONFIG_TIPC is not set
++# CONFIG_ATM is not set
++# CONFIG_BRIDGE is not set
++# CONFIG_VLAN_8021Q is not set
++# CONFIG_DECNET is not set
++# CONFIG_LLC2 is not set
++# CONFIG_IPX is not set
++# CONFIG_ATALK is not set
++# CONFIG_X25 is not set
++# CONFIG_LAPB is not set
++# CONFIG_ECONET is not set
++# CONFIG_WAN_ROUTER is not set
++# CONFIG_NET_SCHED is not set
++
++#
++# Network testing
++#
++# CONFIG_NET_PKTGEN is not set
++# CONFIG_HAMRADIO is not set
++CONFIG_CAN=y
++CONFIG_CAN_RAW=y
++# CONFIG_CAN_BCM is not set
++
++#
++# CAN Device Drivers
++#
++# CONFIG_CAN_VCAN is not set
++CONFIG_CAN_FLEXCAN=y
++CONFIG_CAN_MCF547X_8X=y
++# CONFIG_CAN_DEBUG_DEVICES is not set
++# CONFIG_IRDA is not set
++# CONFIG_BT is not set
++# CONFIG_AF_RXRPC is not set
++
++#
++# Wireless
++#
++# CONFIG_CFG80211 is not set
++# CONFIG_WIRELESS_EXT is not set
++# CONFIG_MAC80211 is not set
++# CONFIG_IEEE80211 is not set
++# CONFIG_RFKILL is not set
++# CONFIG_NET_9P is not set
++
++#
++# Device Drivers
++#
++
++#
++# Generic Driver Options
++#
++CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
++# CONFIG_STANDALONE is not set
++CONFIG_PREVENT_FIRMWARE_BUILD=y
++CONFIG_FW_LOADER=y
++# CONFIG_DEBUG_DRIVER is not set
++# CONFIG_DEBUG_DEVRES is not set
++# CONFIG_SYS_HYPERVISOR is not set
++# CONFIG_CONNECTOR is not set
++CONFIG_MTD=y
++# CONFIG_MTD_DEBUG is not set
++# CONFIG_MTD_CONCAT is not set
++CONFIG_MTD_PARTITIONS=y
++# CONFIG_MTD_REDBOOT_PARTS is not set
++CONFIG_MTD_CMDLINE_PARTS=y
++
++#
++# User Modules And Translation Layers
++#
++# CONFIG_MTD_CHAR is not set
++CONFIG_MTD_BLKDEVS=y
++CONFIG_MTD_BLOCK=y
++# CONFIG_FTL is not set
++# CONFIG_NFTL is not set
++# CONFIG_INFTL is not set
++# CONFIG_RFD_FTL is not set
++# CONFIG_SSFDC is not set
++# CONFIG_MTD_OOPS is not set
++
++#
++# RAM/ROM/Flash chip drivers
++#
++# CONFIG_MTD_CFI is not set
++# CONFIG_MTD_JEDECPROBE is not set
++CONFIG_MTD_MAP_BANK_WIDTH_1=y
++CONFIG_MTD_MAP_BANK_WIDTH_2=y
++CONFIG_MTD_MAP_BANK_WIDTH_4=y
++# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
++# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
++CONFIG_MTD_CFI_I1=y
++CONFIG_MTD_CFI_I2=y
++# CONFIG_MTD_CFI_I4 is not set
++# CONFIG_MTD_CFI_I8 is not set
++CONFIG_MTD_RAM=y
++CONFIG_MTD_ROM=y
++# CONFIG_MTD_ABSENT is not set
++
++#
++# Mapping drivers for chip access
++#
++# CONFIG_MTD_COMPLEX_MAPPINGS is not set
++# CONFIG_MTD_PHYSMAP is not set
++# CONFIG_MTD_INTEL_VR_NOR is not set
++# CONFIG_MTD_PLATRAM is not set
++
++#
++# Self-contained MTD device drivers
++#
++# CONFIG_MTD_PMC551 is not set
++# CONFIG_MTD_DATAFLASH is not set
++# CONFIG_MTD_M25P80 is not set
++# CONFIG_MTD_SLRAM is not set
++# CONFIG_MTD_PHRAM is not set
++# CONFIG_MTD_MTDRAM is not set
++# CONFIG_MTD_BLOCK2MTD is not set
++
++#
++# Disk-On-Chip Device Drivers
++#
++# CONFIG_MTD_DOC2000 is not set
++# CONFIG_MTD_DOC2001 is not set
++# CONFIG_MTD_DOC2001PLUS is not set
++# CONFIG_MTD_NAND is not set
++# CONFIG_MTD_ONENAND is not set
++
++#
++# UBI - Unsorted block images
++#
++# CONFIG_MTD_UBI is not set
++# CONFIG_PARPORT is not set
++CONFIG_BLK_DEV=y
++# CONFIG_BLK_CPQ_DA is not set
++# CONFIG_BLK_CPQ_CISS_DA is not set
++# CONFIG_BLK_DEV_DAC960 is not set
++# CONFIG_BLK_DEV_UMEM is not set
++# CONFIG_BLK_DEV_COW_COMMON is not set
++CONFIG_BLK_DEV_LOOP=y
++# CONFIG_BLK_DEV_CRYPTOLOOP is not set
++# CONFIG_BLK_DEV_NBD is not set
++# CONFIG_BLK_DEV_SX8 is not set
++CONFIG_BLK_DEV_RAM=y
++CONFIG_BLK_DEV_RAM_COUNT=16
++CONFIG_BLK_DEV_RAM_SIZE=64000
++# CONFIG_BLK_DEV_XIP is not set
++# CONFIG_CDROM_PKTCDVD is not set
++# CONFIG_ATA_OVER_ETH is not set
++CONFIG_MISC_DEVICES=y
++CONFIG_COLDFIRE_SEC=y
++CONFIG_SEC_DEVICE=y
++# CONFIG_PHANTOM is not set
++# CONFIG_EEPROM_93CX6 is not set
++# CONFIG_SGI_IOC4 is not set
++# CONFIG_TIFM_CORE is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
++# CONFIG_IDE is not set
++
++#
++# SCSI device support
++#
++# CONFIG_RAID_ATTRS is not set
++CONFIG_SCSI=y
++CONFIG_SCSI_DMA=y
++# CONFIG_SCSI_TGT is not set
++# CONFIG_SCSI_NETLINK is not set
++CONFIG_SCSI_PROC_FS=y
++
++#
++# SCSI support type (disk, tape, CD-ROM)
++#
++CONFIG_BLK_DEV_SD=y
++# CONFIG_CHR_DEV_ST is not set
++# CONFIG_CHR_DEV_OSST is not set
++# CONFIG_BLK_DEV_SR is not set
++# CONFIG_CHR_DEV_SG is not set
++# CONFIG_CHR_DEV_SCH is not set
++
++#
++# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
++#
++CONFIG_SCSI_MULTI_LUN=y
++# CONFIG_SCSI_CONSTANTS is not set
++# CONFIG_SCSI_LOGGING is not set
++# CONFIG_SCSI_SCAN_ASYNC is not set
++CONFIG_SCSI_WAIT_SCAN=m
++
++#
++# SCSI Transports
++#
++# CONFIG_SCSI_SPI_ATTRS is not set
++# CONFIG_SCSI_FC_ATTRS is not set
++# CONFIG_SCSI_ISCSI_ATTRS is not set
++# CONFIG_SCSI_SAS_LIBSAS is not set
++# CONFIG_SCSI_SRP_ATTRS is not set
++# CONFIG_SCSI_LOWLEVEL is not set
++# CONFIG_ATA is not set
++# CONFIG_MD is not set
++# CONFIG_FUSION is not set
++
++#
++# IEEE 1394 (FireWire) support
++#
++# CONFIG_FIREWIRE is not set
++# CONFIG_IEEE1394 is not set
++# CONFIG_I2O is not set
++CONFIG_NETDEVICES=y
++# CONFIG_NETDEVICES_MULTIQUEUE is not set
++# CONFIG_DUMMY is not set
++# CONFIG_BONDING is not set
++# CONFIG_MACVLAN is not set
++# CONFIG_EQUALIZER is not set
++# CONFIG_TUN is not set
++# CONFIG_VETH is not set
++# CONFIG_ARCNET is not set
++# CONFIG_PHYLIB is not set
++CONFIG_NET_ETHERNET=y
++CONFIG_MII=y
++CONFIG_FEC_548x=y
++CONFIG_FEC_548x_AUTO_NEGOTIATION=y
++# CONFIG_FEC_548x_ENABLE_FEC2 is not set
++# CONFIG_HAPPYMEAL is not set
++# CONFIG_SUNGEM is not set
++# CONFIG_CASSINI is not set
++# CONFIG_NET_VENDOR_3COM is not set
++# CONFIG_ENC28J60 is not set
++# CONFIG_NET_TULIP is not set
++# CONFIG_HP100 is not set
++# CONFIG_IBM_NEW_EMAC_ZMII is not set
++# CONFIG_IBM_NEW_EMAC_RGMII is not set
++# CONFIG_IBM_NEW_EMAC_TAH is not set
++# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
++# CONFIG_NET_PCI is not set
++# CONFIG_B44 is not set
++# CONFIG_NETDEV_1000 is not set
++# CONFIG_NETDEV_10000 is not set
++# CONFIG_TR is not set
++
++#
++# Wireless LAN
++#
++# CONFIG_WLAN_PRE80211 is not set
++# CONFIG_WLAN_80211 is not set
++# CONFIG_WAN is not set
++# CONFIG_FDDI is not set
++# CONFIG_HIPPI is not set
++# CONFIG_PPP is not set
++# CONFIG_SLIP is not set
++# CONFIG_NET_FC is not set
++# CONFIG_NETCONSOLE is not set
++# CONFIG_NETPOLL is not set
++# CONFIG_NET_POLL_CONTROLLER is not set
++# CONFIG_ISDN is not set
++# CONFIG_PHONE is not set
++
++#
++# Input device support
++#
++CONFIG_INPUT=y
++# CONFIG_INPUT_FF_MEMLESS is not set
++# CONFIG_INPUT_POLLDEV is not set
++
++#
++# Userland interfaces
++#
++CONFIG_INPUT_MOUSEDEV=y
++# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
++CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
++CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
++# CONFIG_INPUT_JOYDEV is not set
++CONFIG_INPUT_EVDEV=y
++# CONFIG_INPUT_EVBUG is not set
++
++#
++# Input Device Drivers
++#
++CONFIG_INPUT_KEYBOARD=y
++# CONFIG_KEYBOARD_ATKBD is not set
++# CONFIG_KEYBOARD_SUNKBD is not set
++# CONFIG_KEYBOARD_LKKBD is not set
++# CONFIG_KEYBOARD_XTKBD is not set
++# CONFIG_KEYBOARD_NEWTON is not set
++# CONFIG_KEYBOARD_STOWAWAY is not set
++# CONFIG_INPUT_MOUSE is not set
++# CONFIG_INPUT_JOYSTICK is not set
++# CONFIG_INPUT_TABLET is not set
++# CONFIG_INPUT_TOUCHSCREEN is not set
++# CONFIG_INPUT_MISC is not set
++
++#
++# Hardware I/O ports
++#
++CONFIG_SERIO=y
++CONFIG_SERIO_SERPORT=y
++# CONFIG_SERIO_PCIPS2 is not set
++# CONFIG_SERIO_RAW is not set
++# CONFIG_GAMEPORT is not set
++
++#
++# Character devices
++#
++CONFIG_VT=y
++CONFIG_VT_CONSOLE=y
++CONFIG_HW_CONSOLE=y
++# CONFIG_VT_HW_CONSOLE_BINDING is not set
++# CONFIG_SERIAL_NONSTANDARD is not set
++# CONFIG_NOZOMI is not set
++
++#
++# Serial drivers
++#
++# CONFIG_SERIAL_8250 is not set
++
++#
++# Non-8250 serial port support
++#
++CONFIG_SERIAL_COLDFIRE=y
++CONFIG_SERIAL_COLDFIRE_IRDA=y
++# CONFIG_SERIAL_MCF is not set
++# CONFIG_SERIAL_JSM is not set
++CONFIG_UNIX98_PTYS=y
++# CONFIG_LEGACY_PTYS is not set
++# CONFIG_IPMI_HANDLER is not set
++# CONFIG_HW_RANDOM is not set
++# CONFIG_GEN_RTC is not set
++# CONFIG_R3964 is not set
++# CONFIG_APPLICOM is not set
++# CONFIG_RAW_DRIVER is not set
++# CONFIG_TCG_TPM is not set
++# CONFIG_I2C is not set
++
++#
++# SPI support
++#
++CONFIG_SPI=y
++CONFIG_SPI_DEBUG=y
++# CONFIG_COLDFIRE_EDMA is not set
++CONFIG_SPI_MASTER=y
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_BITBANG is not set
++CONFIG_SPI_COLDFIRE=y
++
++#
++# SPI Protocol Masters
++#
++# CONFIG_SPI_AT25 is not set
++# CONFIG_SPI_SPIDEV is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set
++# CONFIG_W1 is not set
++# CONFIG_POWER_SUPPLY is not set
++# CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
++CONFIG_WATCHDOG=y
++# CONFIG_WATCHDOG_NOWAYOUT is not set
++
++#
++# Watchdog Device Drivers
++#
++# CONFIG_SOFT_WATCHDOG is not set
++CONFIG_COLDFIRE_WATCHDOG=m
++
++#
++# PCI-based Watchdog Cards
++#
++# CONFIG_PCIPCWATCHDOG is not set
++# CONFIG_WDTPCI is not set
++
++#
++# Sonics Silicon Backplane
++#
++CONFIG_SSB_POSSIBLE=y
++# CONFIG_SSB is not set
++
++#
++# Multifunction device drivers
++#
++# CONFIG_MFD_SM501 is not set
++
++#
++# Multimedia devices
++#
++# CONFIG_VIDEO_DEV is not set
++# CONFIG_DVB_CORE is not set
++CONFIG_DAB=y
++
++#
++# Graphics support
++#
++# CONFIG_DRM is not set
++# CONFIG_VGASTATE is not set
++CONFIG_VIDEO_OUTPUT_CONTROL=m
++# CONFIG_FB is not set
++# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
++
++#
++# Display device support
++#
++# CONFIG_DISPLAY_SUPPORT is not set
++
++#
++# Console display driver support
++#
++CONFIG_DUMMY_CONSOLE=y
++
++#
++# Sound
++#
++# CONFIG_SOUND is not set
++CONFIG_HID_SUPPORT=y
++CONFIG_HID=y
++CONFIG_HID_DEBUG=y
++# CONFIG_HIDRAW is not set
++# CONFIG_USB_SUPPORT is not set
++# CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
++# CONFIG_NEW_LEDS is not set
++# CONFIG_INFINIBAND is not set
++# CONFIG_RTC_CLASS is not set
++
++#
++# Userspace I/O
++#
++# CONFIG_UIO is not set
++
++#
++# Character devices
++#
++# CONFIG_SERIAL_CONSOLE is not set
++
++#
++# File systems
++#
++CONFIG_EXT2_FS=y
++# CONFIG_EXT2_FS_XATTR is not set
++# CONFIG_EXT2_FS_XIP is not set
++CONFIG_EXT3_FS=y
++CONFIG_EXT3_FS_XATTR=y
++# CONFIG_EXT3_FS_POSIX_ACL is not set
++# CONFIG_EXT3_FS_SECURITY is not set
++# CONFIG_EXT4DEV_FS is not set
++CONFIG_JBD=y
++CONFIG_FS_MBCACHE=y
++# CONFIG_REISERFS_FS is not set
++# CONFIG_JFS_FS is not set
++# CONFIG_FS_POSIX_ACL is not set
++# CONFIG_XFS_FS is not set
++# CONFIG_GFS2_FS is not set
++# CONFIG_OCFS2_FS is not set
++CONFIG_DNOTIFY=y
++# CONFIG_INOTIFY is not set
++# CONFIG_QUOTA is not set
++# CONFIG_AUTOFS_FS is not set
++# CONFIG_AUTOFS4_FS is not set
++# CONFIG_FUSE_FS is not set
++
++#
++# CD-ROM/DVD Filesystems
++#
++# CONFIG_ISO9660_FS is not set
++# CONFIG_UDF_FS is not set
++
++#
++# DOS/FAT/NT Filesystems
++#
++CONFIG_FAT_FS=y
++CONFIG_MSDOS_FS=y
++CONFIG_VFAT_FS=y
++CONFIG_FAT_DEFAULT_CODEPAGE=437
++CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
++CONFIG_NTFS_FS=y
++# CONFIG_NTFS_DEBUG is not set
++CONFIG_NTFS_RW=y
++
++#
++# Pseudo filesystems
++#
++CONFIG_PROC_FS=y
++# CONFIG_PROC_KCORE is not set
++CONFIG_PROC_SYSCTL=y
++CONFIG_SYSFS=y
++CONFIG_TMPFS=y
++# CONFIG_TMPFS_POSIX_ACL is not set
++# CONFIG_HUGETLB_PAGE is not set
++# CONFIG_CONFIGFS_FS is not set
++
++#
++# Miscellaneous filesystems
++#
++# CONFIG_ADFS_FS is not set
++# CONFIG_AFFS_FS is not set
++# CONFIG_HFS_FS is not set
++# CONFIG_HFSPLUS_FS is not set
++# CONFIG_BEFS_FS is not set
++# CONFIG_BFS_FS is not set
++# CONFIG_EFS_FS is not set
++# CONFIG_JFFS2_FS is not set
++# CONFIG_CRAMFS is not set
++# CONFIG_VXFS_FS is not set
++CONFIG_MINIX_FS=y
++# CONFIG_HPFS_FS is not set
++# CONFIG_QNX4FS_FS is not set
++CONFIG_ROMFS_FS=y
++# CONFIG_SYSV_FS is not set
++# CONFIG_UFS_FS is not set
++CONFIG_NETWORK_FILESYSTEMS=y
++CONFIG_NFS_FS=y
++# CONFIG_NFS_V3 is not set
++# CONFIG_NFS_V4 is not set
++# CONFIG_NFS_DIRECTIO is not set
++# CONFIG_NFSD is not set
++CONFIG_ROOT_NFS=y
++CONFIG_LOCKD=y
++CONFIG_NFS_COMMON=y
++CONFIG_SUNRPC=y
++# CONFIG_SUNRPC_BIND34 is not set
++# CONFIG_RPCSEC_GSS_KRB5 is not set
++# CONFIG_RPCSEC_GSS_SPKM3 is not set
++# CONFIG_SMB_FS is not set
++# CONFIG_CIFS is not set
++# CONFIG_NCP_FS is not set
++# CONFIG_CODA_FS is not set
++# CONFIG_AFS_FS is not set
++
++#
++# Partition Types
++#
++CONFIG_PARTITION_ADVANCED=y
++# CONFIG_ACORN_PARTITION is not set
++# CONFIG_OSF_PARTITION is not set
++# CONFIG_AMIGA_PARTITION is not set
++# CONFIG_ATARI_PARTITION is not set
++# CONFIG_MAC_PARTITION is not set
++CONFIG_MSDOS_PARTITION=y
++# CONFIG_BSD_DISKLABEL is not set
++# CONFIG_MINIX_SUBPARTITION is not set
++# CONFIG_SOLARIS_X86_PARTITION is not set
++# CONFIG_UNIXWARE_DISKLABEL is not set
++# CONFIG_LDM_PARTITION is not set
++# CONFIG_SGI_PARTITION is not set
++# CONFIG_ULTRIX_PARTITION is not set
++# CONFIG_SUN_PARTITION is not set
++# CONFIG_KARMA_PARTITION is not set
++# CONFIG_EFI_PARTITION is not set
++# CONFIG_SYSV68_PARTITION is not set
++CONFIG_NLS=y
++CONFIG_NLS_DEFAULT="iso8859-1"
++CONFIG_NLS_CODEPAGE_437=y
++# CONFIG_NLS_CODEPAGE_737 is not set
++# CONFIG_NLS_CODEPAGE_775 is not set
++# CONFIG_NLS_CODEPAGE_850 is not set
++# CONFIG_NLS_CODEPAGE_852 is not set
++# CONFIG_NLS_CODEPAGE_855 is not set
++# CONFIG_NLS_CODEPAGE_857 is not set
++# CONFIG_NLS_CODEPAGE_860 is not set
++# CONFIG_NLS_CODEPAGE_861 is not set
++# CONFIG_NLS_CODEPAGE_862 is not set
++# CONFIG_NLS_CODEPAGE_863 is not set
++# CONFIG_NLS_CODEPAGE_864 is not set
++# CONFIG_NLS_CODEPAGE_865 is not set
++# CONFIG_NLS_CODEPAGE_866 is not set
++# CONFIG_NLS_CODEPAGE_869 is not set
++# CONFIG_NLS_CODEPAGE_936 is not set
++# CONFIG_NLS_CODEPAGE_950 is not set
++# CONFIG_NLS_CODEPAGE_932 is not set
++# CONFIG_NLS_CODEPAGE_949 is not set
++# CONFIG_NLS_CODEPAGE_874 is not set
++# CONFIG_NLS_ISO8859_8 is not set
++# CONFIG_NLS_CODEPAGE_1250 is not set
++# CONFIG_NLS_CODEPAGE_1251 is not set
++# CONFIG_NLS_ASCII is not set
++CONFIG_NLS_ISO8859_1=y
++# CONFIG_NLS_ISO8859_2 is not set
++# CONFIG_NLS_ISO8859_3 is not set
++# CONFIG_NLS_ISO8859_4 is not set
++# CONFIG_NLS_ISO8859_5 is not set
++# CONFIG_NLS_ISO8859_6 is not set
++# CONFIG_NLS_ISO8859_7 is not set
++# CONFIG_NLS_ISO8859_9 is not set
++# CONFIG_NLS_ISO8859_13 is not set
++# CONFIG_NLS_ISO8859_14 is not set
++# CONFIG_NLS_ISO8859_15 is not set
++# CONFIG_NLS_KOI8_R is not set
++# CONFIG_NLS_KOI8_U is not set
++CONFIG_NLS_UTF8=y
++# CONFIG_DLM is not set
++
++#
++# Kernel hacking
++#
++# CONFIG_PRINTK_TIME is not set
++CONFIG_ENABLE_WARN_DEPRECATED=y
++# CONFIG_ENABLE_MUST_CHECK is not set
++# CONFIG_MAGIC_SYSRQ is not set
++# CONFIG_UNUSED_SYMBOLS is not set
++# CONFIG_DEBUG_FS is not set
++# CONFIG_HEADERS_CHECK is not set
++CONFIG_DEBUG_KERNEL=y
++CONFIG_DETECT_SOFTLOCKUP=y
++CONFIG_SCHED_DEBUG=y
++# CONFIG_SCHEDSTATS is not set
++# CONFIG_TIMER_STATS is not set
++CONFIG_DEBUG_SLAB=y
++# CONFIG_DEBUG_SLAB_LEAK is not set
++# CONFIG_DEBUG_RT_MUTEXES is not set
++# CONFIG_RT_MUTEX_TESTER is not set
++# CONFIG_DEBUG_SPINLOCK is not set
++# CONFIG_DEBUG_MUTEXES is not set
++# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
++# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
++# CONFIG_DEBUG_KOBJECT is not set
++CONFIG_DEBUG_BUGVERBOSE=y
++CONFIG_DEBUG_INFO=y
++# CONFIG_DEBUG_VM is not set
++# CONFIG_DEBUG_LIST is not set
++# CONFIG_DEBUG_SG is not set
++# CONFIG_FRAME_POINTER is not set
++# CONFIG_BOOT_PRINTK_DELAY is not set
++# CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
++# CONFIG_FAULT_INJECTION is not set
++# CONFIG_SAMPLES is not set
++CONFIG_BOOTPARAM=y
++CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
++
++#
++# Security options
++#
++# CONFIG_KEYS is not set
++# CONFIG_SECURITY is not set
++# CONFIG_SECURITY_FILE_CAPABILITIES is not set
++CONFIG_CRYPTO=y
++CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=y
++CONFIG_CRYPTO_BLKCIPHER=y
++# CONFIG_CRYPTO_SEQIV is not set
++CONFIG_CRYPTO_HASH=y
++CONFIG_CRYPTO_MANAGER=y
++CONFIG_CRYPTO_HMAC=y
++# CONFIG_CRYPTO_XCBC is not set
++# CONFIG_CRYPTO_NULL is not set
++# CONFIG_CRYPTO_MD4 is not set
++CONFIG_CRYPTO_MD5=y
++CONFIG_CRYPTO_SHA1=y
++# CONFIG_CRYPTO_SHA256 is not set
++# CONFIG_CRYPTO_SHA512 is not set
++# CONFIG_CRYPTO_WP512 is not set
++# CONFIG_CRYPTO_TGR192 is not set
++# CONFIG_CRYPTO_GF128MUL is not set
++# CONFIG_CRYPTO_ECB is not set
++CONFIG_CRYPTO_CBC=y
++# CONFIG_CRYPTO_PCBC is not set
++# CONFIG_CRYPTO_LRW is not set
++# CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CCM is not set
++# CONFIG_CRYPTO_CRYPTD is not set
++CONFIG_CRYPTO_DES=y
++# CONFIG_CRYPTO_FCRYPT is not set
++# CONFIG_CRYPTO_BLOWFISH is not set
++# CONFIG_CRYPTO_TWOFISH is not set
++# CONFIG_CRYPTO_SERPENT is not set
++# CONFIG_CRYPTO_AES is not set
++# CONFIG_CRYPTO_CAST5 is not set
++# CONFIG_CRYPTO_CAST6 is not set
++# CONFIG_CRYPTO_TEA is not set
++# CONFIG_CRYPTO_ARC4 is not set
++# CONFIG_CRYPTO_KHAZAD is not set
++# CONFIG_CRYPTO_ANUBIS is not set
++# CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
++# CONFIG_CRYPTO_DEFLATE is not set
++# CONFIG_CRYPTO_MICHAEL_MIC is not set
++# CONFIG_CRYPTO_CRC32C is not set
++# CONFIG_CRYPTO_CAMELLIA is not set
++CONFIG_CRYPTO_TEST=m
++CONFIG_CRYPTO_AUTHENC=y
++# CONFIG_CRYPTO_LZO is not set
++# CONFIG_CRYPTO_HW is not set
++
++#
++# Library routines
++#
++CONFIG_BITREVERSE=y
++CONFIG_CRC_CCITT=y
++CONFIG_CRC16=y
++# CONFIG_CRC_ITU_T is not set
++CONFIG_CRC32=y
++# CONFIG_CRC7 is not set
++CONFIG_LIBCRC32C=y
++CONFIG_PLIST=y
++CONFIG_HAS_IOMEM=y
++CONFIG_HAS_IOPORT=y
++CONFIG_HAS_DMA=y
+--- a/arch/m68k/configs/m5485evb_defconfig
++++ b/arch/m68k/configs/m5485evb_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.24
+-# Wed Mar  5 16:05:25 2008
++# Linux kernel version: 2.6.25
++# Thu Jul 10 16:12:53 2008
+ #
+ CONFIG_M68K=y
+ CONFIG_MMU=y
+@@ -16,6 +16,8 @@ CONFIG_TIME_LOW_RES=y
+ CONFIG_GENERIC_IOMAP=y
+ # CONFIG_NO_IOPORT is not set
+ # CONFIG_NO_DMA is not set
++CONFIG_ARCH_SUPPORTS_AOUT=y
++CONFIG_HZ=100
+ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+ #
+@@ -32,18 +34,24 @@ CONFIG_SYSVIPC_SYSCTL=y
+ # CONFIG_POSIX_MQUEUE is not set
+ # CONFIG_BSD_PROCESS_ACCT is not set
+ # CONFIG_TASKSTATS is not set
+-# CONFIG_USER_NS is not set
+-# CONFIG_PID_NS is not set
+ # CONFIG_AUDIT is not set
+ CONFIG_IKCONFIG=y
+ CONFIG_IKCONFIG_PROC=y
+ CONFIG_LOG_BUF_SHIFT=17
+ # CONFIG_CGROUPS is not set
++CONFIG_GROUP_SCHED=y
+ CONFIG_FAIR_GROUP_SCHED=y
+-CONFIG_FAIR_USER_SCHED=y
+-# CONFIG_FAIR_CGROUP_SCHED is not set
++# CONFIG_RT_GROUP_SCHED is not set
++CONFIG_USER_SCHED=y
++# CONFIG_CGROUP_SCHED is not set
+ CONFIG_SYSFS_DEPRECATED=y
++CONFIG_SYSFS_DEPRECATED_V2=y
+ # CONFIG_RELAY is not set
++CONFIG_NAMESPACES=y
++# CONFIG_UTS_NS is not set
++# CONFIG_IPC_NS is not set
++# CONFIG_USER_NS is not set
++# CONFIG_PID_NS is not set
+ # CONFIG_BLK_DEV_INITRD is not set
+ # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
+ CONFIG_SYSCTL=y
+@@ -57,17 +65,25 @@ CONFIG_HOTPLUG=y
+ CONFIG_PRINTK=y
+ CONFIG_BUG=y
+ CONFIG_ELF_CORE=y
++CONFIG_COMPAT_BRK=y
+ CONFIG_BASE_FULL=y
+ CONFIG_FUTEX=y
+ CONFIG_ANON_INODES=y
+ CONFIG_EPOLL=y
+ CONFIG_SIGNALFD=y
++CONFIG_TIMERFD=y
+ CONFIG_EVENTFD=y
+ CONFIG_SHMEM=y
+ CONFIG_VM_EVENT_COUNTERS=y
+ CONFIG_SLAB=y
+ # CONFIG_SLUB is not set
+ # CONFIG_SLOB is not set
++# CONFIG_PROFILING is not set
++# CONFIG_MARKERS is not set
++# CONFIG_HAVE_OPROFILE is not set
++# CONFIG_HAVE_KPROBES is not set
++# CONFIG_HAVE_KRETPROBES is not set
++CONFIG_PROC_PAGE_MONITOR=y
+ CONFIG_SLABINFO=y
+ CONFIG_RT_MUTEXES=y
+ # CONFIG_TINY_SHMEM is not set
+@@ -96,6 +112,7 @@ CONFIG_IOSCHED_CFQ=y
+ CONFIG_DEFAULT_CFQ=y
+ # CONFIG_DEFAULT_NOOP is not set
+ CONFIG_DEFAULT_IOSCHED="cfq"
++CONFIG_CLASSIC_RCU=y
+ #
+ # Platform dependent setup
+@@ -120,7 +137,7 @@ CONFIG_MCD_DMA=y
+ # CONFIG_M68030 is not set
+ # CONFIG_M68040 is not set
+ # CONFIG_M68060 is not set
+-# CONFIG_M54455 is not set
++# CONFIG_M5445X is not set
+ CONFIG_M547X_8X=y
+ # CONFIG_M547X is not set
+ CONFIG_M548X=y
+@@ -141,6 +158,7 @@ CONFIG_MCFCLK=200000000
+ CONFIG_MMU_CFV4E=y
+ CONFIG_SDRAM_BASE=0x00000000
+ CONFIG_SDRAM_SIZE=0x04000000
++CONFIG_NOR_FLASH_BASE=0xE0000000
+ # CONFIG_M68KFPU_EMU is not set
+ CONFIG_ADVANCED=y
+ # CONFIG_RMW_INSNS is not set
+@@ -191,6 +209,7 @@ CONFIG_XFRM=y
+ # CONFIG_XFRM_USER is not set
+ # CONFIG_XFRM_SUB_POLICY is not set
+ # CONFIG_XFRM_MIGRATE is not set
++# CONFIG_XFRM_STATISTICS is not set
+ CONFIG_NET_KEY=y
+ # CONFIG_NET_KEY_MIGRATE is not set
+ CONFIG_INET=y
+@@ -251,6 +270,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
+ #
+ # CONFIG_NET_PKTGEN is not set
+ # CONFIG_HAMRADIO is not set
++# CONFIG_CAN is not set
+ # CONFIG_IRDA is not set
+ # CONFIG_BT is not set
+ # CONFIG_AF_RXRPC is not set
+@@ -280,73 +300,7 @@ CONFIG_FW_LOADER=y
+ # CONFIG_DEBUG_DEVRES is not set
+ # CONFIG_SYS_HYPERVISOR is not set
+ # CONFIG_CONNECTOR is not set
+-CONFIG_MTD=y
+-# CONFIG_MTD_DEBUG is not set
+-# CONFIG_MTD_CONCAT is not set
+-CONFIG_MTD_PARTITIONS=y
+-# CONFIG_MTD_REDBOOT_PARTS is not set
+-CONFIG_MTD_CMDLINE_PARTS=y
+-
+-#
+-# User Modules And Translation Layers
+-#
+-# CONFIG_MTD_CHAR is not set
+-CONFIG_MTD_BLKDEVS=y
+-CONFIG_MTD_BLOCK=y
+-# CONFIG_FTL is not set
+-# CONFIG_NFTL is not set
+-# CONFIG_INFTL is not set
+-# CONFIG_RFD_FTL is not set
+-# CONFIG_SSFDC is not set
+-# CONFIG_MTD_OOPS is not set
+-
+-#
+-# RAM/ROM/Flash chip drivers
+-#
+-# CONFIG_MTD_CFI is not set
+-# CONFIG_MTD_JEDECPROBE is not set
+-CONFIG_MTD_MAP_BANK_WIDTH_1=y
+-CONFIG_MTD_MAP_BANK_WIDTH_2=y
+-CONFIG_MTD_MAP_BANK_WIDTH_4=y
+-# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+-# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+-CONFIG_MTD_CFI_I1=y
+-CONFIG_MTD_CFI_I2=y
+-# CONFIG_MTD_CFI_I4 is not set
+-# CONFIG_MTD_CFI_I8 is not set
+-CONFIG_MTD_RAM=y
+-CONFIG_MTD_ROM=y
+-# CONFIG_MTD_ABSENT is not set
+-
+-#
+-# Mapping drivers for chip access
+-#
+-# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+-# CONFIG_MTD_PHYSMAP is not set
+-# CONFIG_MTD_PLATRAM is not set
+-
+-#
+-# Self-contained MTD device drivers
+-#
+-# CONFIG_MTD_SLRAM is not set
+-# CONFIG_MTD_PHRAM is not set
+-# CONFIG_MTD_MTDRAM is not set
+-# CONFIG_MTD_BLOCK2MTD is not set
+-
+-#
+-# Disk-On-Chip Device Drivers
+-#
+-# CONFIG_MTD_DOC2000 is not set
+-# CONFIG_MTD_DOC2001 is not set
+-# CONFIG_MTD_DOC2001PLUS is not set
+-# CONFIG_MTD_NAND is not set
+-# CONFIG_MTD_ONENAND is not set
+-
+-#
+-# UBI - Unsorted block images
+-#
+-# CONFIG_MTD_UBI is not set
++# CONFIG_MTD is not set
+ # CONFIG_PARPORT is not set
+ CONFIG_BLK_DEV=y
+ # CONFIG_BLK_DEV_COW_COMMON is not set
+@@ -356,11 +310,15 @@ CONFIG_BLK_DEV_LOOP=y
+ CONFIG_BLK_DEV_RAM=y
+ CONFIG_BLK_DEV_RAM_COUNT=16
+ CONFIG_BLK_DEV_RAM_SIZE=64000
+-CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
++# CONFIG_BLK_DEV_XIP is not set
+ # CONFIG_CDROM_PKTCDVD is not set
+ # CONFIG_ATA_OVER_ETH is not set
+ CONFIG_MISC_DEVICES=y
++CONFIG_COLDFIRE_SEC=y
++CONFIG_SEC_DEVICE=y
+ # CONFIG_EEPROM_93CX6 is not set
++# CONFIG_ENCLOSURE_SERVICES is not set
++CONFIG_HAVE_IDE=y
+ # CONFIG_IDE is not set
+ #
+@@ -417,6 +375,7 @@ CONFIG_MII=y
+ CONFIG_FEC_548x=y
+ CONFIG_FEC_548x_AUTO_NEGOTIATION=y
+ # CONFIG_FEC_548x_ENABLE_FEC2 is not set
++# CONFIG_ENC28J60 is not set
+ # CONFIG_IBM_NEW_EMAC_ZMII is not set
+ # CONFIG_IBM_NEW_EMAC_RGMII is not set
+ # CONFIG_IBM_NEW_EMAC_TAH is not set
+@@ -433,7 +392,6 @@ CONFIG_FEC_548x_AUTO_NEGOTIATION=y
+ # CONFIG_WAN is not set
+ # CONFIG_PPP is not set
+ # CONFIG_SLIP is not set
+-# CONFIG_SHAPER is not set
+ # CONFIG_NETCONSOLE is not set
+ # CONFIG_NETPOLL is not set
+ # CONFIG_NET_POLL_CONTROLLER is not set
+@@ -500,6 +458,8 @@ CONFIG_HW_CONSOLE=y
+ # Non-8250 serial port support
+ #
+ CONFIG_SERIAL_COLDFIRE=y
++# CONFIG_SERIAL_COLDFIRE_IRDA is not set
++# CONFIG_SERIAL_MCF is not set
+ CONFIG_UNIX98_PTYS=y
+ # CONFIG_LEGACY_PTYS is not set
+ # CONFIG_IPMI_HANDLER is not set
+@@ -508,17 +468,69 @@ CONFIG_UNIX98_PTYS=y
+ # CONFIG_R3964 is not set
+ # CONFIG_RAW_DRIVER is not set
+ # CONFIG_TCG_TPM is not set
+-# CONFIG_I2C is not set
++CONFIG_I2C=y
++CONFIG_I2C_BOARDINFO=y
++# CONFIG_I2C_CHARDEV is not set
++
++#
++# I2C Algorithms
++#
++# CONFIG_I2C_ALGOBIT is not set
++# CONFIG_I2C_ALGOPCF is not set
++# CONFIG_I2C_ALGOPCA is not set
++
++#
++# I2C Hardware Bus support
++#
++CONFIG_I2C_MCF548x=y
++# CONFIG_I2C_MCF is not set
++# CONFIG_I2C_OCORES is not set
++# CONFIG_I2C_PARPORT_LIGHT is not set
++# CONFIG_I2C_SIMTEC is not set
++# CONFIG_I2C_TAOS_EVM is not set
++# CONFIG_I2C_STUB is not set
++
++#
++# Miscellaneous I2C Chip support
++#
++# CONFIG_DS1682 is not set
++# CONFIG_SENSORS_EEPROM is not set
++# CONFIG_SENSORS_PCF8574 is not set
++# CONFIG_PCF8575 is not set
++# CONFIG_SENSORS_PCF8591 is not set
++# CONFIG_TPS65010 is not set
++# CONFIG_SENSORS_MAX6875 is not set
++# CONFIG_SENSORS_TSL2550 is not set
++# CONFIG_I2C_DEBUG_CORE is not set
++# CONFIG_I2C_DEBUG_ALGO is not set
++# CONFIG_I2C_DEBUG_BUS is not set
++# CONFIG_I2C_DEBUG_CHIP is not set
+ #
+ # SPI support
+ #
+-# CONFIG_SPI is not set
++CONFIG_SPI=y
++CONFIG_SPI_DEBUG=y
+ # CONFIG_COLDFIRE_EDMA is not set
+-# CONFIG_SPI_MASTER is not set
++CONFIG_SPI_MASTER=y
++
++#
++# SPI Master Controller Drivers
++#
++# CONFIG_SPI_BITBANG is not set
++CONFIG_SPI_COLDFIRE=y
++
++#
++# SPI Protocol Masters
++#
++# CONFIG_SPI_AT25 is not set
++# CONFIG_SPI_SPIDEV is not set
++# CONFIG_SPI_TLE62X0 is not set
++# CONFIG_SPI_COLDFIRE_SSI_AUDIO is not set
+ # CONFIG_W1 is not set
+ # CONFIG_POWER_SUPPLY is not set
+ # CONFIG_HWMON is not set
++# CONFIG_THERMAL is not set
+ # CONFIG_WATCHDOG is not set
+ #
+@@ -567,6 +579,7 @@ CONFIG_HID_DEBUG=y
+ # CONFIG_HIDRAW is not set
+ # CONFIG_USB_SUPPORT is not set
+ # CONFIG_MMC is not set
++# CONFIG_MEMSTICK is not set
+ # CONFIG_NEW_LEDS is not set
+ # CONFIG_RTC_CLASS is not set
+@@ -599,11 +612,9 @@ CONFIG_FS_MBCACHE=y
+ # CONFIG_XFS_FS is not set
+ # CONFIG_GFS2_FS is not set
+ # CONFIG_OCFS2_FS is not set
+-CONFIG_MINIX_FS=y
+-CONFIG_ROMFS_FS=y
++CONFIG_DNOTIFY=y
+ # CONFIG_INOTIFY is not set
+ # CONFIG_QUOTA is not set
+-CONFIG_DNOTIFY=y
+ # CONFIG_AUTOFS_FS is not set
+ # CONFIG_AUTOFS4_FS is not set
+ # CONFIG_FUSE_FS is not set
+@@ -648,11 +659,12 @@ CONFIG_TMPFS=y
+ # CONFIG_BEFS_FS is not set
+ # CONFIG_BFS_FS is not set
+ # CONFIG_EFS_FS is not set
+-# CONFIG_JFFS2_FS is not set
+ # CONFIG_CRAMFS is not set
+ # CONFIG_VXFS_FS is not set
++CONFIG_MINIX_FS=y
+ # CONFIG_HPFS_FS is not set
+ # CONFIG_QNX4FS_FS is not set
++CONFIG_ROMFS_FS=y
+ # CONFIG_SYSV_FS is not set
+ # CONFIG_UFS_FS is not set
+ CONFIG_NETWORK_FILESYSTEMS=y
+@@ -736,9 +748,6 @@ CONFIG_NLS_ISO8859_1=y
+ # CONFIG_NLS_KOI8_U is not set
+ CONFIG_NLS_UTF8=y
+ # CONFIG_DLM is not set
+-CONFIG_INSTRUMENTATION=y
+-# CONFIG_PROFILING is not set
+-# CONFIG_MARKERS is not set
+ #
+ # Kernel hacking
+@@ -770,20 +779,15 @@ CONFIG_DEBUG_INFO=y
+ # CONFIG_DEBUG_LIST is not set
+ # CONFIG_DEBUG_SG is not set
+ # CONFIG_FRAME_POINTER is not set
+-CONFIG_FORCED_INLINING=y
+ # CONFIG_BOOT_PRINTK_DELAY is not set
+ # CONFIG_RCU_TORTURE_TEST is not set
++# CONFIG_BACKTRACE_SELF_TEST is not set
+ # CONFIG_FAULT_INJECTION is not set
+ # CONFIG_SAMPLES is not set
+ CONFIG_BOOTPARAM=y
+ CONFIG_BOOTPARAM_STRING="root=/dev/nfs rw nfsroot=172.27.163.2:/tftpboot/ltib ip=172.27.163.3:172.27.163.2:172.27.255.254:255.255.0.0::eth0:off mtdparts=phys_mapped_flash:16m(User)"
+ #
+-# CodeTEST Setup
+-#
+-# CONFIG_CODETEST is not set
+-
+-#
+ # Security options
+ #
+ # CONFIG_KEYS is not set
+@@ -791,7 +795,9 @@ CONFIG_BOOTPARAM_STRING="root=/dev/nfs r
+ # CONFIG_SECURITY_FILE_CAPABILITIES is not set
+ CONFIG_CRYPTO=y
+ CONFIG_CRYPTO_ALGAPI=y
++CONFIG_CRYPTO_AEAD=y
+ CONFIG_CRYPTO_BLKCIPHER=y
++# CONFIG_CRYPTO_SEQIV is not set
+ CONFIG_CRYPTO_HASH=y
+ CONFIG_CRYPTO_MANAGER=y
+ CONFIG_CRYPTO_HMAC=y
+@@ -810,6 +816,9 @@ CONFIG_CRYPTO_CBC=y
+ # CONFIG_CRYPTO_PCBC is not set
+ # CONFIG_CRYPTO_LRW is not set
+ # CONFIG_CRYPTO_XTS is not set
++# CONFIG_CRYPTO_CTR is not set
++# CONFIG_CRYPTO_GCM is not set
++# CONFIG_CRYPTO_CCM is not set
+ # CONFIG_CRYPTO_CRYPTD is not set
+ CONFIG_CRYPTO_DES=y
+ # CONFIG_CRYPTO_FCRYPT is not set
+@@ -824,12 +833,14 @@ CONFIG_CRYPTO_DES=y
+ # CONFIG_CRYPTO_KHAZAD is not set
+ # CONFIG_CRYPTO_ANUBIS is not set
+ # CONFIG_CRYPTO_SEED is not set
++# CONFIG_CRYPTO_SALSA20 is not set
+ # CONFIG_CRYPTO_DEFLATE is not set
+ # CONFIG_CRYPTO_MICHAEL_MIC is not set
+ # CONFIG_CRYPTO_CRC32C is not set
+ # CONFIG_CRYPTO_CAMELLIA is not set
+ CONFIG_CRYPTO_TEST=m
+-# CONFIG_CRYPTO_AUTHENC is not set
++CONFIG_CRYPTO_AUTHENC=y
++# CONFIG_CRYPTO_LZO is not set
+ # CONFIG_CRYPTO_HW is not set
+ #
diff --git a/target/linux/coldfire/patches/055-m547x_8x_i2c.patch b/target/linux/coldfire/patches/055-m547x_8x_i2c.patch
new file mode 100644 (file)
index 0000000..0a2a277
--- /dev/null
@@ -0,0 +1,808 @@
+From ce57fc22543d0ee0ca33157264815a52fc8cf9a3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 15 May 2008 13:23:27 -0600
+Subject: [PATCH] Add I2C bus driver for MCF547x and MCF548x.
+
+LTIBName: m547x-8x-i2c
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+---
+ arch/m68k/coldfire/Makefile          |    1 +
+ arch/m68k/coldfire/mcf548x-devices.c |   94 ++++++
+ drivers/i2c/busses/Kconfig           |   12 +
+ drivers/i2c/busses/Makefile          |    1 +
+ drivers/i2c/busses/i2c-algo-mcf.h    |   23 ++
+ drivers/i2c/busses/i2c-mcf548x.c     |  573 ++++++++++++++++++++++++++++++++++
+ include/asm-m68k/m5485i2c.h          |   45 +++
+ 7 files changed, 749 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/coldfire/mcf548x-devices.c
+ create mode 100644 drivers/i2c/busses/i2c-algo-mcf.h
+ create mode 100644 drivers/i2c/busses/i2c-mcf548x.c
+ create mode 100644 include/asm-m68k/m5485i2c.h
+
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -11,4 +11,5 @@ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+ obj-$(CONFIG_M54455)  += mcf5445x-devices.o
+ obj-$(CONFIG_M547X_8X)        += m547x_8x-devices.o
++obj-$(CONFIG_M547X_8X)        += mcf548x-devices.o
+ obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
+--- /dev/null
++++ b/arch/m68k/coldfire/mcf548x-devices.c
+@@ -0,0 +1,94 @@
++/*
++ * arch/m68k/coldfire/mcf5445x-devices.c
++ *
++ * Coldfire M5445x Platform Device Configuration
++ *
++ * Based on the Freescale MXC devices.c
++ *
++ * Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/mtd/physmap.h>
++#include <linux/platform_device.h>
++#include <linux/fsl_devices.h>
++
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++
++static struct resource coldfire_i2c_resources[] = {
++      [0] = {         /* I/O */
++              .start          = MCF_MBAR + 0x008F00,
++              .end            = MCF_MBAR + 0x008F20,
++              .flags          = IORESOURCE_MEM,
++      },
++      [2] = {         /* IRQ */
++              .start          = 40,
++              .end            = 40,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device coldfire_i2c_device = {
++      .name                   = "MCF548X-i2c",
++      .id                     = -1,
++      .num_resources          = ARRAY_SIZE(coldfire_i2c_resources),
++      .resource               = coldfire_i2c_resources,
++};
++
++static struct resource coldfire_sec_resources[] = {
++      [0] = {         /* I/O */
++              .start          = MCF_MBAR + 0x00020000,
++              .end            = MCF_MBAR + 0x00033000,
++              .flags          = IORESOURCE_MEM,
++      },
++      [2] = {         /* IRQ */
++              .start          = ISC_SEC,
++              .end            = ISC_SEC,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device coldfire_sec_device = {
++      .name                   = "fsl-sec1",
++      .id                     = -1,
++      .num_resources          = ARRAY_SIZE(coldfire_sec_resources),
++      .resource               = coldfire_sec_resources,
++};
++
++#if defined(CONFIG_MTD_PHYSMAP)
++static struct physmap_flash_data mcf5485_flash_data = {
++      .width          = 2,
++};
++
++static struct resource mcf5485_flash_resource = {
++      .start          = 0xf8000000,
++      .end            = 0xf80fffff,
++      .flags          = IORESOURCE_MEM,
++};
++
++static struct platform_device mcf5485_flash_device = {
++      .name           = "physmap-flash",
++      .id             = 0,
++      .dev            = {
++              .platform_data  = &mcf5485_flash_data,
++      },
++      .num_resources  = 1,
++      .resource       = &mcf5485_flash_resource,
++};
++#endif
++
++static int __init mcf5485_init_devices(void)
++{
++      printk(KERN_INFO "MCF5485x INIT_DEVICES\n");
++
++      platform_device_register(&coldfire_i2c_device);
++      platform_device_register(&coldfire_sec_device);
++/*#if defined(CONFIG_MTD_PHYSMAP)
++      platform_device_register(&mcf5485_flash_device);
++#endif*/
++      return 0;
++}
++arch_initcall(mcf5485_init_devices);
+--- a/drivers/i2c/busses/Kconfig
++++ b/drivers/i2c/busses/Kconfig
+@@ -4,6 +4,18 @@
+ menu "I2C Hardware Bus support"
++config I2C_MCF548x
++      tristate "I2C MCF547x/548x interfaces"
++      depends on I2C
++      help
++        This allows you to use the I2C adapters found on the Freescale
++        MCF547x/548x microcontrollers.
++        Say Y if you own an I2C adapter belonging to this class and then say
++        Y to the specific driver for you adapter below.
++
++        This support is also available as a module.  If so, the module
++        will be called i2c-algo-mcf.
++
+ config I2C_ALI1535
+       tristate "ALI 1535"
+       depends on PCI
+--- a/drivers/i2c/busses/Makefile
++++ b/drivers/i2c/busses/Makefile
+@@ -52,6 +52,7 @@ obj-$(CONFIG_I2C_VIAPRO)     += i2c-viapro.o
+ obj-$(CONFIG_I2C_VOODOO3)     += i2c-voodoo3.o
+ obj-$(CONFIG_SCx200_ACB)      += scx200_acb.o
+ obj-$(CONFIG_SCx200_I2C)      += scx200_i2c.o
++obj-$(CONFIG_I2C_MCF548x)       += i2c-mcf548x.o
+ ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
+ EXTRA_CFLAGS += -DDEBUG
+--- /dev/null
++++ b/drivers/i2c/busses/i2c-algo-mcf.h
+@@ -0,0 +1,23 @@
++#ifndef I2C_ALGO_MCF_H
++#define I2C_ALGO_MCF_H 1
++
++/* --- Defines for pcf-adapters ---------------------------------------       */
++#include <linux/i2c.h>
++
++struct i2c_algo_mcf_data {
++      void *data;             /* private data for lolevel routines    */
++      void (*setmcf) (void *data, int ctl, int val);
++      int (*getmcf) (void *data, int ctl);
++      int (*getown) (void *data);
++      int (*getclock) (void *data);
++      void (*waitforpin) (void);
++      /* local settings */
++      int udelay;
++      int mdelay;
++      int timeout;
++};
++
++int i2c_mcf_add_bus(struct i2c_adapter *);
++int i2c_mcf_del_bus(struct i2c_adapter *);
++
++#endif /* I2C_ALGO_MCF_H */
+--- /dev/null
++++ b/drivers/i2c/busses/i2c-mcf548x.c
+@@ -0,0 +1,573 @@
++/*
++ *    Performance and stability improvements: (C) Copyright 2008,
++ *    Adrian Cox <adrian@humboldt.co.uk>
++ *    ColdFire 547x/548x I2C master support
++ *    Shrek Wu (b16972@freescale.com )moved the code driver/i2c/alg/mcf.c
++ *      into driver/i2c/busses.And changed the driver to a platform driver.
++ */
++#include <linux/i2c.h>
++#include "i2c-algo-mcf.h"
++
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/sched.h>
++#include <linux/interrupt.h>
++#include <asm/io.h>
++
++#include <asm/coldfire.h>
++#include <asm/m5485sim.h>
++#include <asm/m5485i2c.h>
++
++#define get_clock(adap) (clock)
++#define get_own(adap)         (own)
++
++static int clock = 0x3b;  /*50000 / 1024 ~ 49 KHz*/
++module_param(clock, int, 0);
++MODULE_PARM_DESC(clock,
++      "Set I2C clock in kHz: 400=fast mode (default == 49khz)");
++
++static int own = 0x78;
++module_param(own, int, 0);
++MODULE_PARM_DESC(clock, "Set I2C Master controller address(0x78)");
++
++static struct i2c_algo_mcf_data i2c_mcf_board_data = {
++      .timeout =      10000,
++};
++
++static struct i2c_adapter i2c_mcf_board_adapter = {
++      .owner = THIS_MODULE,
++      .name = "MCF5485 adapter",
++      .id = I2C_HW_MPC107,
++      .algo_data = &i2c_mcf_board_data,
++      .class = I2C_CLASS_HWMON,
++      .timeout = 1,
++      .retries = 1
++};
++/*
++ *  static void i2c_start()
++ *
++ *  Generates START signal
++ */
++static void
++i2c_start(
++      struct i2c_algo_mcf_data *adap
++) {
++      MCF_I2CR |= MCF_I2CR_MSTA;
++}
++
++
++/*
++ *  static void i2c_stop()
++ *
++ *  Generates STOP signal
++ */
++static void
++i2c_stop(
++      struct i2c_algo_mcf_data *adap
++) {
++      MCF_I2CR &= ~MCF_I2CR_MSTA;
++}
++
++static int
++i2c_getack(
++      struct i2c_algo_mcf_data *adap
++) {
++      return !(MCF_I2SR & MCF_I2SR_RXAK);
++}
++
++/*
++ *  static void i2c_repstart()
++ *
++ *  Generates repeated start signal (without STOP while mastering the bus)
++ */
++static void
++i2c_repstart(
++      struct i2c_algo_mcf_data *adap
++) {
++      MCF_I2CR |= MCF_I2CR_RSTA;
++      MCF_I2CR |= MCF_I2CR_MTX;
++}
++
++
++/*
++ *  static void wait_for_bb()
++ *
++ *  Wait for bus idle state
++ */
++static int
++wait_for_bb(
++      struct i2c_algo_mcf_data *adap
++) {
++      int i;
++      for (i = 0; i < adap->timeout; i++) {
++              if (!(MCF_I2SR & MCF_I2SR_IBB))
++                      return 0;
++              udelay(10);
++      }
++      printk(KERN_ERR "%s: timeout", __FUNCTION__);
++      return -ETIMEDOUT;
++}
++
++/*
++ *  static void wait_for_not_bb()
++ *
++ *  Wait for bus busy state
++ */
++static int
++wait_for_not_bb(
++      struct i2c_algo_mcf_data *adap
++) {
++      int i;
++      for (i = 0; i < adap->timeout; i++) {
++              if (MCF_I2SR & MCF_I2SR_IBB)
++                      return 0;
++              udelay(10);
++      }
++      printk(KERN_ERR "%s: timeout", __FUNCTION__);
++      return -ETIMEDOUT;
++}
++
++/*
++ *  static void wait_xfer_done()
++ *
++ *  Wait for transfer to complete
++ */
++static int
++wait_xfer_done(
++      struct i2c_algo_mcf_data *adap
++) {
++      int i;
++
++      for (i = 0; i < adap->timeout; i++) {
++              if (MCF_I2SR & MCF_I2SR_IIF) {
++                      MCF_I2SR &= ~MCF_I2SR_IIF;
++                      return 0;
++              }
++              udelay(1);
++      }
++      printk(KERN_ERR "%s: timeout", __FUNCTION__);
++      return -ETIMEDOUT;
++}
++
++
++/*
++ *  static void i2c_set_addr()
++ *
++ *  Sets slave address to communicate
++ */
++static int
++i2c_set_addr(
++      struct i2c_algo_mcf_data *adap,
++      struct i2c_msg *msg,
++      int retries
++) {
++      unsigned short flags = msg->flags;
++      unsigned char addr;
++
++      if ((flags & I2C_M_TEN)) {
++              /* 10 bit address not supported yet */
++              return -EIO;
++      } else {
++              /* normal 7bit address */
++              addr = (msg->addr << 1);
++              if (flags & I2C_M_RD)
++                      addr |= 1;
++              if (flags & I2C_M_REV_DIR_ADDR)
++                      addr ^= 1;
++
++              MCF_I2DR = addr;
++      }
++      return 0;
++}
++
++
++/*
++ *  static void mcf_i2c_init()
++ *
++ *  Perform ColdFire i2c initialization
++ */
++static void
++mcf_i2c_init(struct i2c_algo_mcf_data *adap)
++{
++      u8 dummy;
++      /* Setup GPIO lines */
++      MCF_PAR_FECI2CIRQ |= MCF_PAR_SDA;
++      MCF_PAR_FECI2CIRQ |= MCF_PAR_SCL;
++
++      /*  Ensure slaves are in idle state */
++      if (MCF_I2SR & MCF_I2SR_IBB) {
++              MCF_I2ICR = 0x00;
++              MCF_I2CR  = 0x00;
++              MCF_I2CR  = 0x0A;
++              dummy = MCF_I2DR;
++              MCF_I2SR  = 0x00;
++              MCF_I2CR  = 0x00;
++              MCF_I2ICR = 0x01;
++      }
++
++      /* setup SCL clock */
++      MCF_I2FDR = get_clock(adap);
++
++      /* set slave address */
++      MCF_I2AR = get_own(adap);
++
++      /* enable I2C module */
++      MCF_I2CR = MCF_I2CR_IEN;
++}
++
++static int i2c_outb(
++      struct i2c_adapter *i2c_adap,
++      char c
++) {
++
++      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
++      int timeout;
++      /* Put data to be sent */
++      MCF_I2DR = c;
++      /* Wait for xfer completed*/
++      timeout = wait_xfer_done(adap);
++      if (timeout) {
++              i2c_stop(adap);
++              wait_for_bb(adap);
++              printk(KERN_ERR "i2c-algo-mcf: %s i2c_write: "
++                      "error - timeout.\n", i2c_adap->name);
++              return -EREMOTEIO; /* got a better one ?? */
++      }
++
++      return 0;
++}
++
++
++/*
++ *  static void mcf_sendbytes()
++ *
++ *  Perform tx data transfer
++ */
++static int
++mcf_sendbytes(
++      struct i2c_adapter *i2c_adap,
++      const char *buf,
++      int count, int last
++) {
++      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
++      int ret, i;
++
++      /* Set master TX mode */
++      MCF_I2CR |= MCF_I2CR_MTX;
++
++      for (i = 0; i < count; ++i) {
++              printk(KERN_DEBUG "i2c-algo-mcf: %s i2c_write: writing %2.2X\n",
++                    i2c_adap->name, buf[i]&0xff);
++              ret = i2c_outb(i2c_adap, buf[i]);
++              if (ret < 0)
++                      return ret;
++      }
++      if (last) {
++              i2c_stop(adap);
++              wait_for_bb(adap);
++      } else {
++              i2c_repstart(adap);
++      }
++
++      return (i);
++}
++
++
++/*
++ *  static void mcf_readbytes()
++ *
++ *  Perform rx data transfer
++ */
++static int
++mcf_readbytes(
++      struct i2c_adapter *i2c_adap,
++      char *buf,
++      int count, int last
++) {
++      int i;
++      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
++      u8 dummy;
++
++      /* Set master RX mode */
++      MCF_I2CR &= ~MCF_I2CR_MTX;
++      MCF_I2CR &= ~MCF_I2CR_TXAK;
++      dummy = MCF_I2DR;
++
++      for (i = 0; i < count-1; i++) {
++              if (wait_xfer_done(adap)) {
++                      i2c_stop(adap);
++                      wait_for_bb(adap);
++                      printk(KERN_DEBUG
++                          "i2c-algo-mcf: mcf_readbytes timed out.\n");
++                      return (-1);
++              }
++
++              /* store next data byte */
++              buf[i] = MCF_I2DR;
++      }
++
++      if (wait_xfer_done(adap)) {
++              i2c_stop(adap);
++              wait_for_bb(adap);
++              printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n");
++              return (-1);
++      }
++
++      /* Disable acknowlege (set I2CR.TXAK) */
++      MCF_I2CR |= MCF_I2CR_TXAK;
++      buf[i] = MCF_I2DR;
++      if (wait_xfer_done(adap)) {
++              i2c_stop(adap);
++              wait_for_bb(adap);
++              printk(KERN_DEBUG "i2c-algo-mcf: mcf_readbytes timed out.\n");
++              return (-1);
++      }
++
++      if (last) {
++              i2c_stop(adap);
++              wait_for_bb(adap);
++      } else {
++              i2c_repstart(adap);
++      }
++
++      return (i+1);
++}
++
++
++/*
++ *  static void mcf_xfer()
++ *
++ *  Perform master data I/O transfer
++ */
++static int
++mcf_xfer(
++      struct i2c_adapter *i2c_adap,
++      struct i2c_msg *msgs,
++      int num
++) {
++      struct i2c_algo_mcf_data *adap = i2c_adap->algo_data;
++      struct i2c_msg *pmsg;
++      int i;
++      int ret = 0, timeout;
++
++      /* Skip own address */
++      if (get_own(adap) == (msgs[0].addr << 1))
++              return -EIO;
++
++      /*  Ensure slaves are in idle state */
++      if (MCF_I2SR & MCF_I2SR_IBB) {
++              MCF_I2ICR = 0x00;
++              MCF_I2CR  = 0x00;
++              MCF_I2CR  = 0x0A;
++              timeout = MCF_I2DR;
++              MCF_I2SR  = 0x00;
++              MCF_I2CR  = 0x00;
++              MCF_I2ICR = 0x01;
++      }
++      /* setup SCL clock */
++      MCF_I2FDR = get_clock(adap);
++      /* set slave address */
++      MCF_I2AR = get_own(adap);
++      /* enable I2C module */
++      MCF_I2CR = MCF_I2CR_IEN;
++
++      MCF_I2CR |= MCF_I2CR_TXAK;
++
++      /* Check for bus busy */
++      wait_for_bb(adap);
++
++      for (i = 0; ret >= 0 && i < num; i++) {
++              pmsg = &msgs[i];
++
++              printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes "
++                      "to 0x%02x - %d of %d messages\n",
++                      pmsg->flags & I2C_M_RD ? "read" : "write",
++                      pmsg->len, pmsg->addr, i + 1, num);
++
++              /* Send START */
++              if (i == 0)
++                      i2c_start(adap);
++
++              /* Wait for Bus Busy */
++              wait_for_not_bb(adap);
++
++              MCF_I2CR |= MCF_I2CR_MTX;
++
++              ret = i2c_set_addr(adap, pmsg, i2c_adap->retries);
++              if (ret < 0)
++                      return ret;
++
++              /* Wait for address transfer completion */
++              wait_xfer_done(adap);
++
++              /* Check for ACK */
++              if (!i2c_getack(adap)) {
++                      i2c_stop(adap);
++                      wait_for_bb(adap);
++                      printk(KERN_DEBUG "i2c-algo-mcf: No ack after "
++                                  "send address in mcf_xfer\n");
++                      return (-EREMOTEIO);
++              }
++
++              printk(KERN_DEBUG "i2c-algo-mcf: Msg %d, "
++                                "addr = 0x%x, flags = 0x%x, len = %d\n",
++                              i, msgs[i].addr, msgs[i].flags, msgs[i].len);
++              /* Read */
++              if (pmsg->flags & I2C_M_RD) {
++                      /* read bytes into buffer*/
++                      ret = mcf_readbytes(i2c_adap, pmsg->buf, pmsg->len,
++                                              (i + 1 == num));
++
++                      if (ret != pmsg->len) {
++                              printk(KERN_DEBUG "i2c-algo-mcf: fail: "
++                                          "only read %d bytes.\n", ret);
++                      } else {
++                              printk(KERN_DEBUG "i2c-algo-mcf: "
++                                                "read %d bytes.\n", ret);
++                      }
++              } else {
++                      /* write bytes into buffer*/
++                      ret = mcf_sendbytes(i2c_adap, pmsg->buf, pmsg->len,
++                                              (i + 1 == num));
++                      if (ret != pmsg->len) {
++                              printk(KERN_DEBUG "i2c-algo-mcf: fail: "
++                                          "only wrote %d bytes.\n", ret);
++                      } else {
++                              printk(KERN_DEBUG "i2c-algo-mcf: wrote"
++                                      "%d bytes.\n", ret);
++                      }
++              }
++      }
++
++      /* Disable I2C module */
++      MCF_I2CR = 0;
++      return (i);
++}
++
++
++/*
++ *  static void mcf_func()
++ *
++ *  Return algorithm funtionality
++ */
++static u32
++mcf_func(
++      struct i2c_adapter *i2c_adap
++) {
++      return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
++}
++
++/*
++ *  ColdFire bus algorithm callbacks
++ */
++static struct i2c_algorithm mcf_algo = {
++      .master_xfer    = mcf_xfer,
++      .functionality  = mcf_func,
++};
++
++/***********************************************************/
++struct coldfire_i2c {
++      void __iomem *base;
++      struct resource *irqarea;
++      struct resource *ioarea;
++      u32 irq;
++      struct i2c_adapter *adap;
++      u32 flags;
++};
++
++/*
++ *  registering functions to load algorithms at runtime
++ */
++int i2c_mcf_add_bus(struct i2c_adapter *adap)
++{
++      struct i2c_algo_mcf_data *mcf_adap = adap->algo_data;
++
++      /*adap->id |= mcf_algo.id;*/
++      adap->algo = &mcf_algo;
++      adap->timeout = 100;
++
++      mcf_i2c_init(mcf_adap);
++
++#ifdef MODULE
++      MOD_INC_USE_COUNT;
++#endif
++
++      i2c_add_adapter(adap);
++
++      return 0;
++}
++
++static int mcf548x_i2c_probe(struct platform_device *pdev)
++{
++      struct coldfire_i2c *i2c;
++      int rc = 0;
++
++      /************************************************************/
++      i2c = kzalloc(sizeof(*i2c), GFP_KERNEL);
++      if (!i2c) {
++              printk(KERN_ERR "%s kzalloc coldfire_i2c faile\n",
++                              __FUNCTION__);
++              return -ENOMEM;
++      }
++      /****************************************************************/
++      platform_set_drvdata(pdev, i2c);
++
++      i2c->adap = &i2c_mcf_board_adapter;
++      i2c->adap->dev.parent = &pdev->dev;
++      rc = i2c_mcf_add_bus(i2c->adap);
++      if (rc < 0) {
++              printk(KERN_ERR "%s - failed to add adapter\n", __FUNCTION__);
++              rc = -ENODEV;
++              goto fail_add;
++      }
++
++      printk(KERN_INFO "i2c-algo-mcf.o: I2C ColdFire algorithm"
++                      " module is loaded.\n");
++      return rc;
++
++fail_add:
++      kfree(i2c);
++      return rc;
++};
++
++static int mcf548x_i2c_remove(struct platform_device *pdev)
++{
++      struct coldfire_i2c *i2c = platform_get_drvdata(pdev);
++
++      i2c_del_adapter(i2c->adap);
++      platform_set_drvdata(pdev, NULL);
++      iounmap(i2c->base);
++      kfree(i2c);
++      return 0;
++};
++
++/* Structure for a device driver */
++static struct platform_driver mcf548x_i2c_driver = {
++      .probe  = mcf548x_i2c_probe,
++      .remove = mcf548x_i2c_remove,
++      .driver = {
++              .owner = THIS_MODULE,
++              .name = "MCF548X-i2c",
++      },
++};
++
++static int __init coldfire_i2c_init(void)
++{
++      return platform_driver_register(&mcf548x_i2c_driver);
++}
++
++static void __exit coldfire_i2c_exit(void)
++{
++      platform_driver_unregister(&mcf548x_i2c_driver);
++}
++
++module_init(coldfire_i2c_init);
++module_exit(coldfire_i2c_exit);
++
++MODULE_AUTHOR("Adrian Cox <adrian@humboldt.co.uk>");
++MODULE_DESCRIPTION
++    ("I2C-Bus adapter for MCF547x and MCF548x processors");
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/include/asm-m68k/m5485i2c.h
+@@ -0,0 +1,45 @@
++/*
++ *    m5485i2c.h -- ColdFire 547x/548x i2c controller support.
++ */
++#ifndef M548X_I2C_H
++#define M548X_I2C_H
++
++/* Register read/write macros */
++#define MCF_I2AR     MCF_REG08(0x008F00)      /* I2C Address           */
++#define MCF_I2FDR    MCF_REG08(0x008F04)      /* I2C Frequency Divider */
++#define MCF_I2CR     MCF_REG08(0x008F08)      /* I2C Control           */
++#define MCF_I2SR     MCF_REG08(0x008F0C)      /* I2C Status            */
++#define MCF_I2DR     MCF_REG08(0x008F10)      /* I2C Data I/O          */
++#define MCF_I2ICR    MCF_REG08(0x008F20)      /* I2C Interrupt Control */
++
++/* Bit definitions and macros for MCF_I2C_I2AR */
++#define MCF_I2AR_ADR(x)    (((x)&0x7F)<<1)
++
++/* Bit definitions and macros for MCF_I2C_I2FDR */
++#define MCF_I2FDR_IC(x)    (((x)&0x3F)<<0)
++
++/* Bit definitions and macros for MCF_I2C_I2CR */
++#define MCF_I2CR_RSTA      (0x04)
++#define MCF_I2CR_TXAK      (0x08)
++#define MCF_I2CR_MTX       (0x10)
++#define MCF_I2CR_MSTA      (0x20)
++#define MCF_I2CR_IIEN      (0x40)
++#define MCF_I2CR_IEN       (0x80)
++
++/* Bit definitions and macros for MCF_I2C_I2SR */
++#define MCF_I2SR_RXAK      (0x01)
++#define MCF_I2SR_IIF       (0x02)
++#define MCF_I2SR_SRW       (0x04)
++#define MCF_I2SR_IAL       (0x10)
++#define MCF_I2SR_IBB       (0x20)
++#define MCF_I2SR_IAAS      (0x40)
++#define MCF_I2SR_ICF       (0x80)
++
++/* Bit definitions and macros for MCF_I2C_I2ICR */
++#define MCF_I2ICR_IE       (0x01)
++#define MCF_I2ICR_RE       (0x02)
++#define MCF_I2ICR_TE       (0x04)
++#define MCF_I2ICR_BNBE     (0x08)
++
++/********************************************************************/
++#endif
diff --git a/target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch b/target/linux/coldfire/patches/056-m547x_8x_rtc_rv5c387a.patch
new file mode 100644 (file)
index 0000000..4d5db0a
--- /dev/null
@@ -0,0 +1,127 @@
+From 1353cd9749377dbcc8290dab5c098deec66fb956 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 15 May 2008 13:24:58 -0600
+Subject: [PATCH] Add RTC RV5C387A driver for MCF547x and MCF548x.
+
+LTIBName: m547x-8x-rtc-rv5c387a
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+---
+ drivers/rtc/rtc-rs5c372.c |   67 +++++++++++++++++++++++++++++++++++++++++---
+ 1 files changed, 62 insertions(+), 5 deletions(-)
+
+--- a/drivers/rtc/rtc-rs5c372.c
++++ b/drivers/rtc/rtc-rs5c372.c
+@@ -15,7 +15,6 @@
+ #define DRV_VERSION "0.5"
+-
+ /*
+  * Ricoh has a family of I2C based RTCs, which differ only slightly from
+  * each other.  Differences center on pinout (e.g. how many interrupts,
+@@ -60,6 +59,15 @@
+ /* to read (style 1) or write registers starting at R */
+ #define RS5C_ADDR(R)          (((R) << 4) | 0)
++#ifdef CONFIG_M547X_8X
++#define DRV_NAME "rv5c387a"
++/* i2c configuration */
++#define RV5C387_I2C_ADDR 0x32
++static unsigned short normal_i2c[] = {
++      RV5C387_I2C_ADDR, I2C_CLIENT_END
++};
++I2C_CLIENT_INSMOD; /* defines addr_data */
++#endif
+ enum rtc_type {
+       rtc_undef = 0,
+@@ -506,14 +514,14 @@ static int rs5c372_probe(struct i2c_clie
+               err = -ENODEV;
+               goto exit;
+       }
+-
+-      if (!(rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL))) {
++      rs5c372 = kzalloc(sizeof(struct rs5c372), GFP_KERNEL);
++      if (!rs5c372) {
+               err = -ENOMEM;
+               goto exit;
+       }
+       /* we read registers 0x0f then 0x00-0x0f; skip the first one */
+-      rs5c372->regs=&rs5c372->buf[1];
++      rs5c372->regs = &rs5c372->buf[1];
+       rs5c372->client = client;
+       i2c_set_clientdata(client, rs5c372);
+@@ -605,7 +613,7 @@ static int rs5c372_probe(struct i2c_clie
+                       case rtc_rv5c386:       s = "rv5c386"; break;
+                       case rtc_rv5c387a:      s = "rv5c387a"; break;
+                       default:                s = "chip"; break;
+-                      }; s;}),
++                      }; s; }),
+                       rs5c372->time24 ? "24hr" : "am/pm"
+                       );
+@@ -645,12 +653,61 @@ static int rs5c372_remove(struct i2c_cli
+       return 0;
+ }
++#ifdef CONFIG_M547X_8X
++static int rv5c387_probe(struct i2c_adapter *adapter, int addr, int kind)
++{
++      int rc = 0;
++      struct i2c_client *new_client = NULL;
++
++      if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {
++              rc = -ENODEV;
++              printk(KERN_DEBUG "%s i2c_check_functionality\n", __FUNCTION__);
++              goto failout;
++      }
++
++      new_client = kzalloc(sizeof(struct i2c_client), GFP_KERNEL);
++      if (new_client == NULL) {
++              rc = -ENOMEM;
++              printk(KERN_DEBUG "%s kzalloc new_client\n", __FUNCTION__);
++              goto failout;
++      }
++
++      new_client->addr = addr;
++      new_client->adapter = adapter;
++      new_client->driver = &rs5c372_driver;
++      new_client->flags = 0;
++      strcpy(new_client->name, DRV_NAME);
++
++      rc = i2c_attach_client(new_client);
++      if (rc < 0) {
++              printk(KERN_DEBUG "%s i2c_attach_client\n", __FUNCTION__);
++              goto failout;
++      }
++
++      rs5c372_probe(new_client);
++      return 0;
++failout:
++      kfree(new_client);
++      return rc;
++}
++
++static int
++rv5c387_attach_adapter(struct i2c_adapter *adapter)
++{
++      return i2c_probe(adapter, &addr_data, rv5c387_probe);
++}
++#endif
++
+ static struct i2c_driver rs5c372_driver = {
+       .driver         = {
+               .name   = "rtc-rs5c372",
+       },
++#ifdef CONFIG_M547X_8X
++      .attach_adapter = &rv5c387_attach_adapter,
++#else
+       .probe          = rs5c372_probe,
+       .remove         = rs5c372_remove,
++#endif
+ };
+ static __init int rs5c372_init(void)
diff --git a/target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch b/target/linux/coldfire/patches/057-mcfv4e_add_mm_args.patch
new file mode 100644 (file)
index 0000000..483f030
--- /dev/null
@@ -0,0 +1,55 @@
+From a2360b8ebb8b2b0d55f8aea3fdce51bce9b57b10 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 15 May 2008 15:48:59 -0600
+Subject: [PATCH] Add mm arg to pte/pmd/pud/pgd_free and add pmd_pgtable macro.
+
+Add mm argument to pte/pmd/pud/pgd_free as per commit
+5e5419734c8719cbc01af959ad9c0844002c0df5.
+
+LTIBName: mcfv4e-add-mm-args
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/cf_pgalloc.h |   10 ++++++----
+ 1 files changed, 6 insertions(+), 4 deletions(-)
+
+--- a/include/asm-m68k/cf_pgalloc.h
++++ b/include/asm-m68k/cf_pgalloc.h
+@@ -6,7 +6,7 @@
+ #include <asm/cf_tlbflush.h>
+ #include <asm/cf_cacheflush.h>
+-extern inline void pte_free_kernel(pte_t *pte)
++extern inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
+ {
+       free_page((unsigned long) pte);
+ }
+@@ -40,6 +40,8 @@ extern inline pmd_t *pmd_alloc_kernel(pg
+ #define pmd_populate_kernel(mm, pmd, pte) (pmd_val(*pmd) = (unsigned long)(pte))
++#define pmd_pgtable(pmd) pmd_page(pmd)
++
+ static inline void __pte_free_tlb(struct mmu_gather *tlb, struct page *page)
+ {
+       __free_page(page);
+@@ -68,7 +70,7 @@ static inline struct page *pte_alloc_one
+       return page;
+ }
+-extern inline void pte_free(struct page *page)
++extern inline void pte_free(struct mm_struct *mm, struct page *page)
+ {
+       __free_page(page);
+ }
+@@ -77,9 +79,9 @@ extern inline void pte_free(struct page 
+  * In our implementation, each pgd entry contains 1 pmd that is never allocated
+  * or freed.  pgd_present is always 1, so this should never be called. -NL
+  */
+-#define pmd_free(pmd) BUG()
++#define pmd_free(mm, pmd) BUG()
+-extern inline void pgd_free(pgd_t *pgd)
++extern inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
+ {
+       free_page((unsigned long) pgd);
+ }
diff --git a/target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch b/target/linux/coldfire/patches/058-mcfv4e_tlsnptl_elf_reloc.patch
new file mode 100644 (file)
index 0000000..849e3a6
--- /dev/null
@@ -0,0 +1,43 @@
+From a64bac5fc75aa2872a8abe54a9f9aaa0fce31588 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 22 May 2008 09:50:31 -0600
+Subject: [PATCH] Add elf relocation types for TLS/NPTL.
+
+These relocations are from the draft TLS/NPTL ABI document v0.2
+by Joseph Myers of CodeSourcery.
+
+LTIBName: mcfv4e-tlsnptl-elf-reloc
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/elf.h |   20 ++++++++++++++++++++
+ 1 files changed, 20 insertions(+), 0 deletions(-)
+
+--- a/include/asm-m68k/elf.h
++++ b/include/asm-m68k/elf.h
+@@ -34,6 +34,26 @@
+ #define R_68K_GLOB_DAT        20
+ #define R_68K_JMP_SLOT        21
+ #define R_68K_RELATIVE        22
++/* TLS static relocations */
++#define       R_68K_TLS_GD32          25
++#define       R_68K_TLS_GD16          26
++#define       R_68K_TLS_GD8           27
++#define       R_68K_TLS_LDM32         28
++#define       R_68K_TLS_LDM16         29
++#define       R_68K_TLS_LDM8          30
++#define       R_68K_TLS_LDO32         31
++#define       R_68K_TLS_LDO16         32
++#define       R_68K_TLS_LDO8          33
++#define       R_68K_TLS_IE32          34
++#define       R_68K_TLS_IE16          35
++#define       R_68K_TLS_IE8           36
++#define       R_68K_TLS_LE32          37
++#define       R_68K_TLS_LE16          38
++#define       R_68K_TLS_LE8           39
++/* TLS dynamic relocations */
++#define       R_68K_TLS_DTPMOD32      40
++#define       R_68K_TLS_DTPREL32      41
++#define       R_68K_TLS_TPREL32       42
+ typedef unsigned long elf_greg_t;
diff --git a/target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch b/target/linux/coldfire/patches/059-mcfv4e_vdso_headers.patch
new file mode 100644 (file)
index 0000000..f430ab3
--- /dev/null
@@ -0,0 +1,79 @@
+From a05af27aec00eacf533ff111ba8eb3dec328d9af Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 22 May 2008 11:20:53 -0600
+Subject: [PATCH] Initial vDSO header changes.
+
+LTIBName: mcfv4e-vdso-headers
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/auxvec.h |    9 +++++++++
+ include/asm-m68k/elf.h    |   31 +++++++++++++++++++++++++++++++
+ include/asm-m68k/page.h   |    5 +++++
+ 3 files changed, 45 insertions(+), 0 deletions(-)
+
+--- a/include/asm-m68k/auxvec.h
++++ b/include/asm-m68k/auxvec.h
+@@ -1,4 +1,13 @@
+ #ifndef __ASMm68k_AUXVEC_H
+ #define __ASMm68k_AUXVEC_H
++/*
++ * Architecture-neutral AT_ values in 0-17, leave some room
++ * for more of them.
++ */
++
++#ifdef CONFIG_VSYSCALL
++/* Entry point to the vsyscall page */
++#define       AT_SYSINFO_EHDR         33
++#endif
+ #endif
+--- a/include/asm-m68k/elf.h
++++ b/include/asm-m68k/elf.h
+@@ -136,4 +136,35 @@ typedef struct user_m68kfp_struct elf_fp
+ #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX)
++/*
++ * VDSO
++ */
++#ifdef CONFIG_VSYSCALL
++extern unsigned int vdso_enabled;
++
++#define       VDSO_BASE               ((unsigned long)current->mm->context.vdso)
++#define       VDSO_SYM(x)             (VDSO_BASE + (unsigned long)(x))
++
++#define       VSYSCALL_AUX_ENT                                        \
++      if (vdso_enabled)                                       \
++              NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);
++
++/* additional pages */
++#define ARCH_HAS_SETUP_ADDITIONAL_PAGES       1
++
++struct linux_binprm;
++extern int arch_setup_additional_pages(struct linux_binprm *bprm,
++                                     int executable_stack);
++
++#else
++/* no VSYSCALL_AUX_ENT */
++#define       VSYSCALL_AUX_ENT
++#endif
++
++#define ARCH_DLINFO                                           \
++do {                                                          \
++      /* vsyscall entry */                                    \
++      VSYSCALL_AUX_ENT;                                       \
++} while (0);
++
+ #endif
+--- a/include/asm-m68k/page.h
++++ b/include/asm-m68k/page.h
+@@ -252,4 +252,9 @@ static inline __attribute_const__ int __
+ #include <asm-generic/page.h>
++#ifdef CONFIG_VSYSCALL
++/* vDSO support */
++#define __HAVE_ARCH_GATE_AREA
++#endif
++
+ #endif /* _M68K_PAGE_H */
diff --git a/target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch b/target/linux/coldfire/patches/060-m547x_8x_move_memmap.patch
new file mode 100644 (file)
index 0000000..01d7a6e
--- /dev/null
@@ -0,0 +1,152 @@
+From 961a1f1ccbb2121a4e650cd64ca1f5c15b232e18 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 29 May 2008 22:03:08 -0600
+Subject: [PATCH] Update M547x/M548x memory map.
+
+- Move internal memory
+  0xF0000000 MBAR
+  0xF1000000 MMUBAR
+  0xF3000000 RAMBAR0
+  0xF3001000 RAMBAR1
+
+- Move KMAP area
+  0xD0000000 -> 0xDFFFFFFF
+
+- Update pagefault code for KMAP area
+
+LTIBName: m547x-8x-move-memmap
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S   |    2 +-
+ arch/m68k/mm/cf-mmu.c       |   20 ++++++++++----------
+ arch/m68k/mm/kmap.c         |   18 +++++++++++++++---
+ include/asm-m68k/coldfire.h |    8 ++++----
+ include/asm-m68k/pgtable.h  |    4 ++--
+ 5 files changed, 32 insertions(+), 20 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -87,7 +87,7 @@
+ #else
+ #if defined(CONFIG_M54455)
+ #elif defined(CONFIG_M547X_8X)
+-#define ACR0_DEFAULT  #0xE000C040   /* ACR0 default value */
++#define ACR0_DEFAULT  #0xF00FC040   /* ACR0 default value */
+ #define ACR1_DEFAULT  #0x000FA008   /* ACR1 default value */
+ #define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+ #define ACR3_DEFAULT  #0x000FA008   /* ACR3 default value */
+--- a/arch/m68k/mm/cf-mmu.c
++++ b/arch/m68k/mm/cf-mmu.c
+@@ -35,11 +35,9 @@
+ #include <asm/coldfire.h>
+ #include <asm/tlbflush.h>
+-#if PAGE_OFFSET == CONFIG_SDRAM_BASE
+-#define       KERNRAM(x) ((x >= PAGE_OFFSET) && (x < (PAGE_OFFSET + CONFIG_SDRAM_SIZE)))
+-#else
+-#define       KERNRAM(x) (x >= PAGE_OFFSET)
+-#endif
++#define KMAPAREA(x)   ((x >= KMAP_START) && ( x < KMAP_END))
++
++#undef DEBUG
+ mm_context_t next_mmu_context;
+ unsigned long context_map[LAST_CONTEXT / BITS_PER_LONG + 1];
+@@ -162,7 +160,7 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       mmuar = ( dtlb ) ? regs->mmuar
+                        : regs->pc + (extension_word * sizeof(long));
+-        mm = (!user_mode(regs) && KERNRAM(mmuar)) ? &init_mm : current->mm;
++        mm = (!user_mode(regs) && KMAPAREA(mmuar)) ? &init_mm : current->mm;
+         if (!mm) {
+           local_irq_restore(flags);
+@@ -181,7 +179,7 @@ int cf_tlb_miss(struct pt_regs *regs, in
+           return (-1);
+       }       
+     
+-      pte = (KERNRAM(mmuar)) ? pte_offset_kernel(pmd, mmuar)
++      pte = (KMAPAREA(mmuar)) ? pte_offset_kernel(pmd, mmuar)
+                              : pte_offset_map(pmd, mmuar);
+       if (pte_none(*pte) || !pte_present(*pte)) {
+           local_irq_restore(flags);
+@@ -198,7 +196,7 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       
+         set_pte(pte, pte_mkyoung(*pte));
+         asid = mm->context & 0xff;
+-        if (!pte_dirty(*pte) && !KERNRAM(mmuar))
++        if (!pte_dirty(*pte) && !KMAPAREA(mmuar))
+           set_pte(pte, pte_wrprotect(*pte));
+         *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
+@@ -216,8 +214,10 @@ int cf_tlb_miss(struct pt_regs *regs, in
+       asm("nop");
+-      /*printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
+-                (pte_val(*pte)  & PAGE_MASK));*/
++#ifdef DEBUG
++      printk("cf_tlb_miss: va=%lx, pa=%lx\n", (mmuar & PAGE_MASK), 
++                (pte_val(*pte)  & PAGE_MASK));
++#endif
+       local_irq_restore(flags);
+         return (0);
+ }
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -135,10 +135,22 @@ void __iomem *__ioremap(unsigned long ph
+ #ifdef CONFIG_M54455
+       if (physaddr >= 0xf0000000) {
+-              /* short circuit mappings for xf0000000 */
+-#ifdef DEBUG
+-              printk(KERN_INFO "ioremap: short circuiting 0x%lx mapping\n", physaddr);
++              /*
++               * On the M5445x processors an ACR is setup to map
++               * the 0xF0000000 range into kernel memory as
++               * non-cacheable.
++               */
++              return (void __iomem *)physaddr;
++      }
+ #endif
++
++#ifdef CONFIG_M547X_8X
++      if (physaddr >= 0xf0000000) {
++              /*
++               * On the M547x/M548x processors an ACR is setup to map
++               * the 0xF0000000 range into kernel memory as
++               * non-cacheable.
++               */
+               return (void __iomem *)physaddr;
+       }
+ #endif
+--- a/include/asm-m68k/coldfire.h
++++ b/include/asm-m68k/coldfire.h
+@@ -6,10 +6,10 @@
+ #define MCF_RAMBAR1   0x40000000
+ #define MCF_SRAM      0x80000000
+ #elif defined(CONFIG_M547X_8X)
+-#define MCF_MBAR      0xE0000000
+-#define MCF_MMUBAR    0xE1000000
+-#define MCF_RAMBAR0   0xE3000000
+-#define MCF_RAMBAR1   0xE3001000
++#define MCF_MBAR      0xF0000000
++#define MCF_MMUBAR    0xF1000000
++#define MCF_RAMBAR0   0xF3000000
++#define MCF_RAMBAR1   0xF3001000
+ #endif
+ #define MCF_CLK       CONFIG_MCFCLK
+--- a/include/asm-m68k/pgtable.h
++++ b/include/asm-m68k/pgtable.h
+@@ -73,8 +73,8 @@
+ #define KMAP_START     0x0DC00000
+ #define KMAP_END       0x0E000000
+ #elif defined(CONFIG_COLDFIRE)
+-#define KMAP_START    0xe0000000
+-#define KMAP_END      0xf0000000
++#define KMAP_START    0xd0000000
++#define KMAP_END      0xe0000000
+ #else
+ #define       KMAP_START      0xd0000000
+ #define       KMAP_END        0xf0000000
diff --git a/target/linux/coldfire/patches/061-m5445x_rename_config.patch b/target/linux/coldfire/patches/061-m5445x_rename_config.patch
new file mode 100644 (file)
index 0000000..8f898e3
--- /dev/null
@@ -0,0 +1,791 @@
+From 778c1668df4a4c634fae8ef99a05120121cce838 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 18 Jun 2008 15:17:31 -0600
+Subject: [PATCH] Convert CONFIG_M54455 to CONFIG_M5445X for clarity.
+
+LTIBName: m5445x-rename-config
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig                |   50 ++++++++++++++++++++++++++++---------
+ arch/m68k/Makefile               |    2 +-
+ arch/m68k/coldfire/Makefile      |    2 +-
+ arch/m68k/coldfire/config.c      |   33 +++++++++++++++----------
+ arch/m68k/coldfire/head.S        |   23 ++++++++++-------
+ arch/m68k/coldfire/ints.c        |    6 ++--
+ arch/m68k/kernel/dma.c           |    4 +-
+ arch/m68k/kernel/setup.c         |    2 +-
+ arch/m68k/mm/kmap.c              |    2 +-
+ drivers/crypto/Kconfig           |   12 ++++----
+ drivers/crypto/mcfcau-aes.c      |    2 +-
+ drivers/crypto/mcfcau-des.c      |    2 +-
+ drivers/crypto/mcfcau-md5.c      |    2 +-
+ drivers/crypto/mcfcau-sha1.c     |    2 +-
+ drivers/crypto/mcfcau.c          |    2 +-
+ drivers/crypto/mcfcau.h          |    2 +-
+ drivers/net/Kconfig              |    2 +-
+ drivers/net/fec.c                |   10 ++++----
+ drivers/net/fec.h                |    2 +-
+ drivers/serial/mcfserial.c       |    8 +++---
+ drivers/spi/coldfire_edma.c      |    4 +-
+ drivers/spi/spi_coldfire.c       |    2 +-
+ drivers/spi/ssi_audio.c          |    2 +-
+ include/asm-m68k/cfcache.h       |    2 +-
+ include/asm-m68k/coldfire.h      |    4 +-
+ include/asm-m68k/coldfire_edma.h |    4 +-
+ include/asm-m68k/mcfsim.h        |    2 +-
+ include/asm-m68k/mcfuart.h       |    2 +-
+ include/asm-m68k/page_offset.h   |    2 +-
+ include/asm-m68k/setup.h         |    2 +-
+ 30 files changed, 116 insertions(+), 80 deletions(-)
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -56,7 +56,7 @@ config ARCH_MAY_HAVE_PC_FDC
+       default y
+ config NO_IOPORT
+-      def_bool !(M54455 || M547X_8X)
++      def_bool !(M5445X || M547X_8X)
+ config NO_DMA
+       def_bool SUN3
+@@ -143,7 +143,7 @@ config CFV4E
+ config MCD_DMA
+       bool "ColdFire MCD DMA support"
+-      depends on CFV4E
++      depends on M547X_8X
+       default y
+       help
+         This enables support for the ColdFire 547x/548x family
+@@ -177,7 +177,7 @@ config HADES
+ config PCI
+       bool
+       depends on HADES || M54455
+-      default y
++      default n
+       help
+         Find out whether you have a PCI motherboard. PCI is the name of a
+         bus system, i.e. the way the CPU talks to the other stuff inside
+@@ -325,11 +325,34 @@ config M68060
+         If you anticipate running this kernel on a computer with a MC68060
+         processor, say Y. Otherwise, say N.
+-config M54455
+-      bool "MCF54455 support"
++config M5445X
++      bool "MCF5445x support"
+       depends on COLDFIRE
+       help
+-          This option will add support for the MCF54455 processor with mmu.
++          This option will add support for the MCF5445 processor with mmu.
++
++config M54451
++      bool
++      depends on M5445X
++      default n
++
++config M54455
++      bool
++      depends on M5445X
++      default n
++
++choice
++      prompt "Model"
++      depends on M5445X
++      default M54451EVB
++      config M54451EVB
++              bool "M54451EVB"
++              select M54451
++      config M54455EVB
++              bool "M54455EVB"
++              select M54455
++endchoice
++
+ config M547X_8X
+       bool "MCF547x/MCF548x support"
+@@ -393,7 +416,8 @@ endchoice
+ config MCFCLK
+       int
+-      default 266666666 if M54455
++      default 266666666 if M54455EVB
++      default 240000000 if M54451EVB
+       default 266000000 if M547X
+       default 200000000 if M548X
+       help
+@@ -401,7 +425,7 @@ config MCFCLK
+ config MCF_USER_HALT
+       bool "Coldfire User Halt Enable"
+-      depends on M54455 || M547X_8X
++      depends on M5445X || M547X_8X
+       default n
+       help
+         Enables the HALT instruction in User Mode.
+@@ -420,19 +444,21 @@ config MMU_CFV4E
+ config SDRAM_BASE
+       hex
+       depends on COLDFIRE
+-      default 0x40000000 if M54455
++      default 0x40000000 if M5445X
+       default 0x00000000 if M547X_8X
+ config SDRAM_SIZE
+       hex
+       depends on COLDFIRE
+-      default 0x0FFFFFFF if M54455
++      default 0x08000000 if M54451EVB
++      default 0x10000000 if M54455EVB
+       default 0x04000000 if M547X_8X
+ config NOR_FLASH_BASE
+       hex "NOR Flash Base Address"
+-      depends on M54455
+-      default 0x00000000
++      depends on COLDFIRE
++      default 0x00000000 if M54451EVB
++      default 0x00000000 if M54455EVB
+ config M68KFPU_EMU
+       bool "Math emulation support (EXPERIMENTAL)"
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -59,7 +59,7 @@ endif
+ endif
+ endif
+-ifdef CONFIG_M54455
++ifdef CONFIG_M5445X
+ KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
+ KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float  
+ endif
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -9,7 +9,7 @@ ifneq ($(strip $(CONFIG_USB) $(CONFIG_US
+ endif
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
+-obj-$(CONFIG_M54455)  += mcf5445x-devices.o
++obj-$(CONFIG_M5445X)  += mcf5445x-devices.o
+ obj-$(CONFIG_M547X_8X)        += m547x_8x-devices.o
+ obj-$(CONFIG_M547X_8X)        += mcf548x-devices.o
+ obj-$(CONFIG_MCD_DMA) += m547x_8x-dma.o
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -35,14 +35,14 @@
+ #include <asm/mcfsim.h>
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ #define UBOOT_EXTRA_CLOCKS
+ #elif defined(CONFIG_M547X_8X)
+ #define UBOOT_PCI
+ #endif
+ #include <asm/bootinfo.h>
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ #include <asm/mcf5445x_intc.h>
+ #include <asm/mcf5445x_sdramc.h>
+ #include <asm/mcf5445x_fbcs.h>
+@@ -132,8 +132,9 @@ int __init uboot_commandline(char *boota
+ /*
+  * This routine does things not done in the bootloader.
+  */
+-#if defined(CONFIG_M54455)
+-#define DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++#if defined(CONFIG_M5445X)
++#define FOO_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1"
+ #elif defined(CONFIG_M547X_8X)
+ #define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
+ #endif
+@@ -143,14 +144,14 @@ asmlinkage void __init cf_early_init(voi
+       extern char _end;
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       SET_VBR((void *)MCF_RAMBAR1);
+ #elif defined(CONFIG_M547X_8X)
+       SET_VBR((void *)MCF_RAMBAR0);
+ #endif
+       /* Mask all interrupts */
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       MCF_INTC0_IMRL = 0xFFFFFFFF;
+       MCF_INTC0_IMRH = 0xFFFFFFFF;
+       MCF_INTC1_IMRL = 0xFFFFFFFF;
+@@ -160,7 +161,7 @@ asmlinkage void __init cf_early_init(voi
+       MCF_IMRH = 0xFFFFFFFF;
+ #endif
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ #if defined(CONFIG_NOR_FLASH_BASE)
+       MCF_FBCS_CSAR(1) = CONFIG_NOR_FLASH_BASE;
+ #else
+@@ -171,9 +172,9 @@ asmlinkage void __init cf_early_init(voi
+       /* Init optional SDRAM chip select */
+       MCF_SDRAMC_SDCS(1) = (256*1024*1024) | 0x1B;
+ #endif
+-#endif /* CONFIG_M54455 */
++#endif /* CONFIG_M5445X */
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       /* Setup SDRAM crossbar(XBS) priorities */
+       MCF_XBS_PRS2 = (MCF_XBS_PRS_M0(MCF_XBS_PRI_2) |
+                       MCF_XBS_PRS_M1(MCF_XBS_PRI_3) |
+@@ -193,6 +194,7 @@ asmlinkage void __init cf_early_init(voi
+       m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
+       m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
++#if 0
+       if (!uboot_commandline(m68k_command_line)) {
+ #if defined(CONFIG_BOOTPARAM)
+               strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
+@@ -200,6 +202,10 @@ asmlinkage void __init cf_early_init(voi
+               strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+ #endif
+       }
++#endif
++/* JKM -- temporary! */
++strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
++/* JKM -- temporary! */
+ #if defined(CONFIG_BLK_DEV_INITRD)
+       /* add initrd image */
+@@ -223,9 +229,10 @@ asmlinkage void __init cf_early_init(voi
+       /* Turn on caches via CACR, enable EUSP */
+       cacr_set(CACHE_INITIAL_MODE);
++
+ }
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ void settimericr(unsigned int timer, unsigned int level)
+ {
+       volatile unsigned char *icrp;
+@@ -256,7 +263,7 @@ void __init coldfire_trap_init(void)
+       int i = 0;
+       e_vector *vectors;
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       vectors = (e_vector *)MCF_RAMBAR1;
+ #elif defined(CONFIG_M547X_8X)
+       vectors = (e_vector *)MCF_RAMBAR0;
+@@ -281,7 +288,7 @@ void __init coldfire_trap_init(void)
+       vectors[32] = system_call;
+ }
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ void coldfire_tick(void)
+ {
+@@ -369,7 +376,7 @@ unsigned long coldfire_gettimeoffset(voi
+ void coldfire_reboot(void)
+ {
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       /* disable interrupts and do a software reset */
+       asm("movew #0x2700, %%sr\n\t"
+           "moveb #0x80, %%d0\n\t"
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -63,8 +63,8 @@
+  *     None currently (mapped via TLBs)
+  */
+-#if CONFIG_SDRAM_BASE != PAGE_BASE
+-#if defined(CONFIG_M54455)
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
++#if defined(CONFIG_M5445X)
+ #if 0
+ #define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
+ #endif
+@@ -85,7 +85,11 @@
+ #endif
+ #else
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
++#define ACR0_DEFAULT  #0xF00FC040   /* ACR0 default value */
++#define ACR1_DEFAULT  #0x400FA008   /* ACR1 default value */
++#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
++#define ACR3_DEFAULT  #0x400FA008   /* ACR3 default value */
+ #elif defined(CONFIG_M547X_8X)
+ #define ACR0_DEFAULT  #0xF00FC040   /* ACR0 default value */
+ #define ACR1_DEFAULT  #0x000FA008   /* ACR1 default value */
+@@ -280,7 +284,7 @@ ENTRY(__start)
+       subl    %a0,%a0
+       movel   %a0,%usp
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       movel  #(MCF_RAMBAR1 + 0x221), %d0
+       movec   %d0, %rambar1
+ #elif defined(CONFIG_M547X_8X)
+@@ -331,12 +335,11 @@ _loop_bss:
+       cmpl    %a0,%a1
+       bne     _loop_bss
+ #endif
+-
+       /* If you change the memory size to another value make a matching 
+          change in paging_init(cf-mmu.c) to zones_size[]. */
+ #if CONFIG_SDRAM_BASE != PAGE_OFFSET
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       /* Map 256MB as code */
+       mmu_map (PAGE_OFFSET+0*0x1000000),  (PHYS_OFFSET+0*0x1000000), \
+               MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_IC,  MMUDR_SP, \
+@@ -502,7 +505,7 @@ _loop_bss:
+        * enabled and we are executing in high memory.
+        */
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       /* Map first 16 MB as code */
+       mmu_map (PHYS_OFFSET+0*0x1000000), (PHYS_OFFSET+0*0x1000000), \
+               MMUOR_ITLB, 0, MMUTR_SG, MMUDR_SZ16M, MMUDR_INC,  MMUDR_SP, 0, \
+@@ -562,7 +565,7 @@ ENTRY(__running_high)
+       /* Unmap unity mappings */
+ #if CONFIG_SDRAM_BASE != PAGE_OFFSET
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), MMUOR_ITLB, %d0
+       mmu_unmap (PHYS_OFFSET+0*0x1000000), 0, %d0
+ #elif defined(CONFIG_M547X_8X)
+@@ -599,9 +602,9 @@ func_start set_context,%d0,(1*4)
+       movec   %d0,%asid
+ func_return   set_context
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ /*
+- * set_fpga(addr,val) on the M54455EVB
++ * set_fpga(addr,val) on the M5445X
+  *
+  * Map in 0x00000000 -> 0x0fffffff and then do the write.
+  */
+--- a/arch/m68k/coldfire/ints.c
++++ b/arch/m68k/coldfire/ints.c
+@@ -47,7 +47,7 @@ static int irq_depth[SYS_IRQS];
+ /*
+  * IRQ Controller
+  */
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ void m5445x_irq_enable(unsigned int irq);
+ void m5445x_irq_disable(unsigned int irq);
+ static struct irq_controller m5445x_irq_controller = {
+@@ -87,7 +87,7 @@ void __init init_IRQ(void)
+ {
+       int i;
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       for (i = 0; i < SYS_IRQS; i++)
+               irq_controller[i] = &m5445x_irq_controller;
+ #elif defined(CONFIG_M547X_8X)
+@@ -337,7 +337,7 @@ asmlinkage void handle_badint(struct pt_
+ }
+ EXPORT_SYMBOL(handle_badint);
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ /*
+  * M5445X Implementation
+  */
+--- a/arch/m68k/kernel/dma.c
++++ b/arch/m68k/kernel/dma.c
+@@ -17,7 +17,7 @@
+ void *dma_alloc_coherent(struct device *dev, size_t size,
+                        dma_addr_t *handle, gfp_t flag)
+ {
+-#ifndef CONFIG_M54455
++#ifndef CONFIG_M5445X
+       struct page *page, **map;
+       pgprot_t pgprot;
+       void *addr;
+@@ -75,7 +75,7 @@ void dma_free_coherent(struct device *de
+                      void *addr, dma_addr_t handle)
+ {
+       pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
+-#ifndef CONFIG_M54455
++#ifndef CONFIG_M5445X
+       vfree(addr);
+ #else
+       kfree(addr);
+--- a/arch/m68k/kernel/setup.c
++++ b/arch/m68k/kernel/setup.c
+@@ -519,7 +519,7 @@ int get_hardware_list(char *buffer)
+ void check_bugs(void)
+ {
+-#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M54455)
++#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X)
+       if (m68k_fputype == 0) {
+               printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
+                       "WHICH IS REQUIRED BY LINUX/M68K ***\n");
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -133,7 +133,7 @@ void __iomem *__ioremap(unsigned long ph
+       }
+ #endif
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+       if (physaddr >= 0xf0000000) {
+               /*
+                * On the M5445x processors an ACR is setup to map
+--- a/drivers/crypto/Kconfig
++++ b/drivers/crypto/Kconfig
+@@ -62,15 +62,15 @@ config CRYPTO_DEV_GEODE
+ config CRYPTO_DEV_MCFCAU
+       bool "Support for Freescale Coldfire Cryptographic Acceleration Unit (CAU)"
+-      depends on M54455
++      depends on M5445X
+       select CRYPTO_ALGAPI
+       help
+         The cryptographic acceleration unit (CAU) is a ColdFire coprocessor
+         implementing a set of specialized operations in hardware. For example, you can
+-        find it on MCF54455.
++        find it on MCF5445X.
+ config CRYPTO_DEV_MCFCAU_DES
+-      tristate "DES and Triple DES cipher algorithms (MCF54455)"
++      tristate "DES and Triple DES cipher algorithms (MCF5445X)"
+       depends on CRYPTO_DEV_MCFCAU
+       select CRYPTO_ALGAPI
+       select CRYPTO_BLKCIPHER
+@@ -84,7 +84,7 @@ config CRYPTO_DEV_MCFCAU_DES
+         will be called mcfcau-des.
+ config CRYPTO_DEV_MCFCAU_AES
+-      tristate "AES cipher algorithm (MCF54455)"
++      tristate "AES cipher algorithm (MCF5445X)"
+       depends on CRYPTO_DEV_MCFCAU
+       select CRYPTO_ALGAPI
+       select CRYPTO_BLKCIPHER
+@@ -98,7 +98,7 @@ config CRYPTO_DEV_MCFCAU_AES
+         will be called mcfcau-aes.
+ config CRYPTO_DEV_MCFCAU_MD5
+-      tristate "MD5 digest algorithm (MCF54455)"
++      tristate "MD5 digest algorithm (MCF5445X)"
+       depends on CRYPTO_DEV_MCFCAU
+       select CRYPTO_ALGAPI
+       help
+@@ -111,7 +111,7 @@ config CRYPTO_DEV_MCFCAU_MD5
+         will be called mcfcau-md5.
+ config CRYPTO_DEV_MCFCAU_SHA1
+-      tristate "SHA1 digest algorithm (MCF54455)"
++      tristate "SHA1 digest algorithm (MCF5445X)"
+       depends on CRYPTO_DEV_MCFCAU
+       select CRYPTO_ALGAPI
+       help
+--- a/drivers/crypto/mcfcau-aes.c
++++ b/drivers/crypto/mcfcau-aes.c
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/crypto/mcfcau-des.c
++++ b/drivers/crypto/mcfcau-des.c
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/crypto/mcfcau-md5.c
++++ b/drivers/crypto/mcfcau-md5.c
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/crypto/mcfcau-sha1.c
++++ b/drivers/crypto/mcfcau-sha1.c
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/crypto/mcfcau.c
++++ b/drivers/crypto/mcfcau.c
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/crypto/mcfcau.h
++++ b/drivers/crypto/mcfcau.h
+@@ -5,7 +5,7 @@
+  * Author: Andrey Butok
+  * Copyright Freescale Semiconductor Inc.  2007
+  *
+- * NOTE: You can find the ColdFire CAU module on MCF54455 and MCF52235.
++ * NOTE: You can find the ColdFire CAU module on MCF5445X and MCF52235.
+  *
+  * 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
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -1975,7 +1975,7 @@ config 68360_ENET
+ config FEC
+       bool "FEC ethernet controller (of ColdFire CPUs)"
+-      depends on M523x || M527x || M5272 || M528x || M520x || M54455
++      depends on M523x || M527x || M5272 || M528x || M520x || M5445X
+       help
+         Say Y here if you want to use the built-in 10/100 Fast ethernet
+         controller on some Motorola ColdFire processors.
+--- a/drivers/net/fec.c
++++ b/drivers/net/fec.c
+@@ -52,7 +52,7 @@
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || \
+     defined(CONFIG_M5272) || defined(CONFIG_M528x) || \
+     defined(CONFIG_M520x) || defined(CONFIG_M532x) || \
+-    defined(CONFIG_M54455)
++    defined(CONFIG_M5445X)
+ #include <asm/coldfire.h>
+ #include <asm/mcfsim.h>
+@@ -84,7 +84,7 @@ static unsigned int fec_hw[] = {
+       (MCF_MBAR+0x30000),
+ #elif defined(CONFIG_M532x)
+       (MCF_MBAR+0xfc030000),
+-#elif defined(CONFIG_M54455)
++#elif defined(CONFIG_M5445X)
+       (MCF_MBAR+0xfc030000),
+ #if defined(CONFIG_FEC2)
+       (MCF_MBAR+0xfc034000),
+@@ -179,7 +179,7 @@ typedef struct {
+  * account when setting it.
+  */
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X)
+ #define       OPT_FRAME_SIZE  (PKT_MAXBUF_SIZE << 16)
+ #else
+ #define       OPT_FRAME_SIZE  0
+@@ -1831,9 +1831,9 @@ static void __inline__ fec_uncache(unsig
+ /* ------------------------------------------------------------------------- */
+-#elif defined(CONFIG_M54455)
++#elif defined(CONFIG_M5445X)
+ /*
+- * Code specific for M54455
++ * Code specific for M5445X
+  */
+ static void __inline__ fec_request_intrs(struct net_device *dev)
+--- a/drivers/net/fec.h
++++ b/drivers/net/fec.h
+@@ -14,7 +14,7 @@
+ /****************************************************************************/
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455)
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X)
+ /*
+  *    Just figures, Motorola would have to change the offsets for
+  *    registers in the same peripheral device on different models
+--- a/drivers/serial/mcfserial.c
++++ b/drivers/serial/mcfserial.c
+@@ -69,7 +69,7 @@ struct timer_list mcfrs_timer_struct;
+ #define       DEFAULT_CBAUD           B38400
+ #elif defined(CONFIG_MOD5272) || defined(CONFIG_M5208EVB) || \
+       defined(CONFIG_M5329EVB) || defined(CONFIG_GILBARCO) || \
+-      defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)
++      defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
+ #define CONSOLE_BAUD_RATE     115200
+ #define DEFAULT_CBAUD         B115200
+ #elif defined(CONFIG_ARNEWSH) || defined(CONFIG_FREESCALE) || \
+@@ -102,7 +102,7 @@ static struct tty_driver *mcfrs_serial_d
+ #undef SERIAL_DEBUG_FLOW
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+-    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M54455) || \
++    defined(CONFIG_M520x) || defined(CONFIG_M532x) || defined(CONFIG_M5445X) || \
+     defined(CONFIG_M547X_8X)
+ #define       IRQBASE (MCFINT_VECBASE+MCFINT_UART0)
+ #else
+@@ -1630,7 +1630,7 @@ static void mcfrs_irqinit(struct mcf_ser
+               /* GPIOs also must be initalized, depends on board */
+               break;
+       }
+-#elif defined(CONFIG_M54455)
++#elif defined(CONFIG_M5445X)
+       volatile unsigned char *uartp;
+       uartp = info->addr;
+       switch (info->line) {
+@@ -2022,7 +2022,7 @@ struct console mcfrs_console = {
+ static int __init mcfrs_console_init(void)
+ {
+-#if !(defined(CONFIG_M54455) || defined(CONFIG_M547X_8X))
++#if !(defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X))
+       register_console(&mcfrs_console);
+ #endif
+       return 0;
+--- a/drivers/spi/coldfire_edma.c
++++ b/drivers/spi/coldfire_edma.c
+@@ -20,10 +20,10 @@
+ #include <linux/cdev.h>
+ #include <linux/seq_file.h>
+ #include <linux/proc_fs.h>
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ #include <asm/mcf5445x_edma.h>
+ #include <asm/mcf5445x_intc.h>
+-#endif /* CONFIG_M54455 */
++#endif /* CONFIG_M5445X */
+ #include <asm/coldfire_edma.h>
+ /*
+--- a/drivers/spi/spi_coldfire.c
++++ b/drivers/spi/spi_coldfire.c
+@@ -57,7 +57,7 @@
+ #include <asm/mcfqspi.h>
+ #include <asm/coldfire.h>
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+       #include <asm/virtconvert.h>
+       #define SPI_DSPI
+--- a/drivers/spi/ssi_audio.c
++++ b/drivers/spi/ssi_audio.c
+@@ -25,7 +25,7 @@
+ #include <asm/coldfire.h>
+ #include <asm/coldfire_edma.h>
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ #include <asm/mcf5445x_ssi.h>
+ #include <asm/mcf5445x_ccm.h>
+ #include <asm/mcf5445x_gpio.h>
+--- a/include/asm-m68k/cfcache.h
++++ b/include/asm-m68k/cfcache.h
+@@ -40,7 +40,7 @@
+ #define CF_CACR_IDSP      (0x00000080) /* Ins default supervisor-protect   */
+ #define CF_CACR_EUSP        (0x00000020) /* Switch stacks in user mode       */
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ /*
+  * M5445x Cache Configuration
+  *    - cache line size is 16 bytes
+--- a/include/asm-m68k/coldfire.h
++++ b/include/asm-m68k/coldfire.h
+@@ -1,9 +1,9 @@
+ #ifndef _COLDFIRE_H_
+ #define _COLDFIRE_H_
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ #define MCF_MBAR      0x0
+-#define MCF_RAMBAR1   0x40000000
++#define MCF_RAMBAR1   0x80000000
+ #define MCF_SRAM      0x80000000
+ #elif defined(CONFIG_M547X_8X)
+ #define MCF_MBAR      0xF0000000
+--- a/include/asm-m68k/coldfire_edma.h
++++ b/include/asm-m68k/coldfire_edma.h
+@@ -20,14 +20,14 @@
+ #define EDMA_DRIVER_NAME "ColdFire-eDMA"
+ #define DMA_DEV_MINOR 1
+-#ifdef CONFIG_M54455
++#ifdef CONFIG_M5445X
+ #define EDMA_INT_CHANNEL_BASE                 8
+ #define EDMA_INT_CONTROLLER_BASE      64
+ #define EDMA_INT_BASE                 (EDMA_INT_CHANNEL_BASE + \
+                                        EDMA_INT_CONTROLLER_BASE)
+ #define EDMA_CHANNELS                 16
+ #define EDMA_INT_ERR                  16      /* edma error interrupt */
+-#endif /* CONFIG_M54455 */
++#endif /* CONFIG_M5445X */
+  
+ typedef irqreturn_t (*edma_irq_handler)(int, void *);
+ typedef void (*edma_error_handler)(int, void *);
+--- a/include/asm-m68k/mcfsim.h
++++ b/include/asm-m68k/mcfsim.h
+@@ -12,7 +12,7 @@
+ #include <asm/coldfire.h>
+ #endif
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ #include <asm/mcf5445x_intc.h>
+ #include <asm/mcf5445x_gpio.h>
+ #include <asm/mcf5445x_i2c.h>
+--- a/include/asm-m68k/mcfuart.h
++++ b/include/asm-m68k/mcfuart.h
+@@ -15,7 +15,7 @@
+  *    Define the base address of the UARTS within the MBAR address
+  *    space.
+  */
+-#if defined(CONFIG_M54455)
++#if defined(CONFIG_M5445X)
+ #include <asm/mcf5445x_intc.h>
+ #define MCFUART_BASE1         0xfc060000      /* Base address of UART1 */
+ #define MCFUART_BASE2         0xfc064000      /* Base address of UART2 */
+--- a/include/asm-m68k/page_offset.h
++++ b/include/asm-m68k/page_offset.h
+@@ -4,7 +4,7 @@
+ #if defined(CONFIG_SUN3)
+ #define PAGE_OFFSET_RAW               0x0E000000
+-#elif defined(CONFIG_M54455) || defined(CONFIG_M547X_8X)
++#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
+ #define       PHYS_OFFSET             CONFIG_SDRAM_BASE
+ #define PAGE_OFFSET_RAW               (PHYS_OFFSET)
+ /* #define PAGE_OFFSET_RAW            0xC0000000 */
+--- a/include/asm-m68k/setup.h
++++ b/include/asm-m68k/setup.h
+@@ -240,7 +240,7 @@ extern unsigned long m68k_machtype;
+ #define FPU_68040      (1<<FPUB_68040)
+ #define FPU_68060      (1<<FPUB_68060)
+ #define FPU_SUNFPA     (1<<FPUB_SUNFPA)
+-#ifndef CONFIG_M54455
++#ifndef CONFIG_M5445X
+ #define FPU_CFV4E      (1<<FPUB_CFV4E)
+ #else
+ #define FPU_CFV4E      0
diff --git a/target/linux/coldfire/patches/062-mcfv4e_cache_split.patch b/target/linux/coldfire/patches/062-mcfv4e_cache_split.patch
new file mode 100644 (file)
index 0000000..a98c334
--- /dev/null
@@ -0,0 +1,979 @@
+From 940b4fea5ebfde3abe03c6469a57c01ee961497a Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 18 Jun 2008 15:20:21 -0600
+Subject: [PATCH] Split 547x/548x and 5445x cache routines into separate files.
+
+LTIBName: mcfv4e-cache-split
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ include/asm-m68k/cf_5445x_cacheflush.h |  447 ++++++++++++++++++++++++++++++++
+ include/asm-m68k/cf_548x_cacheflush.h  |  259 ++++++++++++++++++
+ include/asm-m68k/cf_cacheflush.h       |  244 +-----------------
+ 3 files changed, 711 insertions(+), 239 deletions(-)
+ create mode 100644 include/asm-m68k/cf_5445x_cacheflush.h
+ create mode 100644 include/asm-m68k/cf_548x_cacheflush.h
+
+--- /dev/null
++++ b/include/asm-m68k/cf_5445x_cacheflush.h
+@@ -0,0 +1,447 @@
++/*
++ * include/asm-m68k/cf_5445x_cacheflush.h - Coldfire 5445x Cache
++ *
++ * Based on include/asm-m68k/cacheflush.h
++ *
++ * Coldfire pieces by:
++ *   Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007, 2008
++ *
++ * 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.
++ */
++#ifndef M68K_CF_5445x_CACHEFLUSH_H
++#define M68K_CF_5445x_CACHEFLUSH_H
++
++#include <asm/cfcache.h>
++
++/*
++ * Coldfire Cache Model
++ *
++ * The Coldfire processors use a Harvard architecture cache configured
++ * as four-way set associative.  The cache does not implement bus snooping
++ * so cache coherency with other masters must be maintained in software.
++ *
++ * The cache is managed via the CPUSHL instruction in conjunction with
++ * bits set in the CACR (cache control register).  Currently the code
++ * uses the CPUSHL enhancement which adds the ability to
++ * invalidate/clear/push a cacheline by physical address.  This feature
++ * is designated in the Hardware Configuration Register [D1-CPES].
++ *
++ * CACR Bits:
++ *    DPI[28]         cpushl invalidate disable for d-cache
++ *    IDPI[12]        cpushl invalidate disable for i-cache
++ *    SPA[14]         cpushl search by physical address
++ *    IVO[20]         cpushl invalidate only
++ *
++ * Random Terminology:
++ *  * invalidate = reset the cache line's valid bit
++ *  * push = generate a line-sized store of the data if its contents are marked
++ *         as modifed (the modified flag is cleared after the store)
++ *  * clear = push + invalidate
++ */
++
++/**
++ * flush_icache - Flush all of the instruction cache
++ */
++static inline void flush_icache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%ic,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
++
++/**
++ * flush_dcache - Flush all of the data cache
++ */
++static inline void flush_dcache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%dc,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
++
++/**
++ * flush_bcache - Flush all of both caches
++ */
++static inline void flush_bcache(void)
++{
++      asm volatile("nop\n"
++                   "moveq%.l  #0,%%d0\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "add%.l    #0x0010,%%a0\n"
++                   "addq%.l   #1,%%d1\n"
++                   "cmpi%.l   %0,%%d1\n"
++                   "bne       1b\n"
++                   "moveq%.l  #0,%%d1\n"
++                   "addq%.l   #1,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "cmpi%.l   #4,%%d0\n"
++                   "bne       1b\n"
++                   : : "i" (CACHE_SETS)
++                   : "a0", "d0", "d1");
++}
++
++/**
++ * cf_cache_clear - invalidate cache
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Invalidate cache lines starting at paddr for len bytes.
++ * Those lines are not pushed.
++ */
++static inline void cf_cache_clear(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne%.b    1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA+CF_CACR_IVO)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_push - Push dirty cache out with no invalidate
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Push the any dirty lines starting at paddr for len bytes.
++ * Those lines are not invalidated.
++ */
++static inline void cf_cache_push(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA+CF_CACR_DPI+CF_CACR_IDPI)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_flush - Push dirty cache out and invalidate
++ * @paddr: starting physical address
++ * @len: number of bytes
++ *
++ * Push the any dirty lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_cache_flush(unsigned long paddr, int len)
++{
++      /* number of lines */
++      len = (len + (CACHE_LINE_SIZE-1)) / CACHE_LINE_SIZE;
++      if (len == 0)
++              return;
++
++      /* align on set boundary */
++      paddr &= 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (paddr), "r" (len),
++                       "r" (shadow_cacr),
++                       "i" (CF_CACR_SPA)
++                   : "a0", "d0");
++}
++
++/**
++ * cf_cache_flush_range - Push dirty data/inst cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty data/instr lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_cache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      int len;
++
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = PAGE_ALIGN((vend + (CACHE_LINE_SIZE-1))) & 0xfffffff0;
++      len = vend - vstart;
++      if (len == 0)
++              return;
++      vstart = __pa(vstart);
++      vend = vstart + len;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (vstart), "a" (vend),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
++
++/**
++ * cf_dcache_flush_range - Push dirty data cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty data lines starting at paddr for len bytes and
++ * invalidate those lines.
++ */
++static inline void cf_dcache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%dc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (__pa(vstart)), "a" (__pa(vend)),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
++
++/**
++ * cf_icache_flush_range - Push dirty inst cache in range out and invalidate
++ * @vstart - starting virtual address
++ * @vend: ending virtual address
++ *
++ * Push the any dirty instr lines starting at paddr for len bytes and
++ * invalidate those lines.  This should just be an invalidate since you
++ * shouldn't be able to have dirty instruction cache.
++ */
++static inline void cf_icache_flush_range(unsigned long vstart, unsigned long vend)
++{
++      /* align on set boundary */
++      vstart &= 0xfffffff0;
++      vend = (vend + (CACHE_LINE_SIZE-1)) & 0xfffffff0;
++
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%a0\n"
++                   "move%.l   %1,%%a1\n"
++                   "1:\n"
++                   "cpushl    %%ic,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "cmpa%.l   %%a0,%%a1\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : /* no return */
++                   : "a" (__pa(vstart)), "a" (__pa(vend)),
++                     "r" (shadow_cacr),
++                     "i" (CF_CACR_SPA)
++                   : "a0", "a1", "d0");
++}
++
++/**
++ * flush_cache_mm - Flush an mm_struct
++ * @mm: mm_struct to flush
++ */
++static inline void flush_cache_mm(struct mm_struct *mm)
++{
++      if (mm == current->mm)
++              flush_bcache();
++}
++
++#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
++
++/**
++ * flush_cache_range - Flush a cache range
++ * @vma: vma struct
++ * @start: Starting address
++ * @end: Ending address
++ *
++ * flush_cache_range must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_range(struct vm_area_struct *vma,
++      unsigned long start, unsigned long end)
++{
++      if (vma->vm_mm == current->mm)
++              cf_cache_flush_range(start, end);
++}
++
++/**
++ * flush_cache_page - Flush a page of the cache
++ * @vma: vma struct
++ * @vmaddr:
++ * @pfn: page numer
++ *
++ * flush_cache_page must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_page(struct vm_area_struct *vma,
++      unsigned long vmaddr, unsigned long pfn)
++{
++      if (vma->vm_mm == current->mm)
++              cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
++}
++
++/**
++ * __flush_page_to_ram - Push a page out of the cache
++ * @vaddr: Virtual address at start of page
++ *
++ * Push the page at kernel virtual address *vaddr* and clear
++ * the icache.
++ */
++static inline void __flush_page_to_ram(void *vaddr)
++{
++      asm volatile("nop\n"
++                   "move%.l   %2,%%d0\n"
++                   "or%.l     %3,%%d0\n"
++                   "movec     %%d0,%%cacr\n"
++                   "move%.l   %0,%%d0\n"
++                   "and%.l    #0xfffffff0,%%d0\n"
++                   "move%.l   %%d0,%%a0\n"
++                   "move%.l   %1,%%d0\n"
++                   "1:\n"
++                   "cpushl    %%bc,(%%a0)\n"
++                   "lea       0x10(%%a0),%%a0\n"
++                   "subq%.l   #1,%%d0\n"
++                   "bne.b     1b\n"
++                   "movec     %2,%%cacr\n"
++                   : : "a" (__pa(vaddr)), "i" (PAGE_SIZE / CACHE_LINE_SIZE),
++                       "r" (shadow_cacr), "i" (CF_CACR_SPA)
++                   : "a0", "d0");
++}
++
++/*
++ * Various defines for the kernel.
++ */
++
++extern void cache_clear(unsigned long paddr, int len);
++extern void cache_push(unsigned long paddr, int len);
++extern void flush_icache_range(unsigned long address, unsigned long endaddr);
++
++#define flush_cache_all()                     flush_bcache()
++#define flush_cache_vmap(start, end)          flush_bcache()
++#define flush_cache_vunmap(start, end)                flush_bcache()
++
++#define flush_dcache_range(vstart, vend)      cf_dcache_flush_range(vstart, vend)
++#define flush_dcache_page(page)                       __flush_page_to_ram(page_address(page))
++#define flush_dcache_mmap_lock(mapping)               do { } while (0)
++#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++
++#define flush_icache_page(vma, page)          __flush_page_to_ram(page_address(page))
++
++/**
++ * copy_to_user_page - Copy memory to user page
++ */
++static inline void copy_to_user_page(struct vm_area_struct *vma,
++                                   struct page *page, unsigned long vaddr,
++                                   void *dst, void *src, int len)
++{
++      memcpy(dst, src, len);
++      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
++}
++
++/**
++ * copy_from_user_page - Copy memory from user page
++ */
++static inline void copy_from_user_page(struct vm_area_struct *vma,
++                                     struct page *page, unsigned long vaddr,
++                                     void *dst, void *src, int len)
++{
++      cf_cache_flush(page_to_phys(page), PAGE_SIZE);
++      memcpy(dst, src, len);
++}
++
++#endif /* M68K_CF_5445x_CACHEFLUSH_H */
+--- /dev/null
++++ b/include/asm-m68k/cf_548x_cacheflush.h
+@@ -0,0 +1,259 @@
++/*
++ * include/asm-m68k/cf_548x_cacheflush.h - Coldfire 547x/548x Cache
++ *
++ * Based on include/asm-m68k/cacheflush.h
++ *
++ * Coldfire pieces by:
++ *   Kurt Mahan kmahan@freescale.com
++ *
++ * Copyright Freescale Semiconductor, Inc. 2007, 2008
++ *
++ * 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.
++ */
++#ifndef M68K_CF_548x_CACHEFLUSH_H
++#define M68K_CF_548x_CACHEFLUSH_H
++
++#include <asm/cfcache.h>
++/*
++ * Cache handling functions
++ */
++
++#define flush_icache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%ic,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
++
++#define flush_dcache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%dc,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
++
++#define flush_bcache()                                                \
++({                                                            \
++  unsigned long set;                                          \
++  unsigned long start_set;                                    \
++  unsigned long end_set;                                      \
++                                                              \
++  start_set = 0;                                              \
++  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
++                                                              \
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
++    asm volatile("cpushl %%bc,(%0)\n"                         \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)\n"                               \
++                 "\taddq%.l #1,%0\n"                          \
++                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));              \
++  }                                                           \
++})
++
++/*
++ * invalidate the cache for the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
++ */
++extern void cache_clear(unsigned long paddr, int len);
++/*
++ * push any dirty cache in the specified memory range.
++ * It starts at the physical address specified for
++ * the given number of bytes.
++ */
++extern void cache_push(unsigned long paddr, int len);
++
++/*
++ * push and invalidate pages in the specified user virtual
++ * memory range.
++ */
++extern void cache_push_v(unsigned long vaddr, int len);
++
++/* This is needed whenever the virtual mapping of the current
++   process changes.  */
++
++/**
++ * flush_cache_mm - Flush an mm_struct
++ * @mm: mm_struct to flush
++ */
++static inline void flush_cache_mm(struct mm_struct *mm)
++{
++      if (mm == current->mm)
++              flush_bcache();
++}
++
++#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
++
++#define flush_cache_all()             flush_bcache()
++
++/**
++ * flush_cache_range - Flush a cache range
++ * @vma: vma struct
++ * @start: Starting address
++ * @end: Ending address
++ *
++ * flush_cache_range must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_range(struct vm_area_struct *vma,
++      unsigned long start, unsigned long end)
++{
++      if (vma->vm_mm == current->mm)
++              flush_bcache();
++//            cf_cache_flush_range(start, end);
++}
++
++/**
++ * flush_cache_page - Flush a page of the cache
++ * @vma: vma struct
++ * @vmaddr:
++ * @pfn: page numer
++ *
++ * flush_cache_page must be a macro to avoid a dependency on
++ * linux/mm.h which includes this file.
++ */
++static inline void flush_cache_page(struct vm_area_struct *vma,
++      unsigned long vmaddr, unsigned long pfn)
++{
++      if (vma->vm_mm == current->mm)
++              flush_bcache();
++//            cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
++}
++
++/* Push the page at kernel virtual address and clear the icache */
++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
++#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
++extern inline void __flush_page_to_ram(void *address)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++  unsigned long addr = (unsigned long) address;
++
++  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
++
++  start_set = addr & _ICACHE_SET_MASK;
++  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3)) {
++      asm volatile("cpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
++    }
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;    
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
++    asm volatile("cpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
++  }
++}
++
++/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */
++#define flush_dcache_page(page)                       \
++      __flush_page_to_ram((void *) page_address(page))
++#define flush_icache_page(vma,pg)             \
++      __flush_page_to_ram((void *) page_address(pg))
++#define flush_icache_user_range(adr,len)      do { } while (0)
++/* NL */
++#define flush_icache_user_page(vma,page,addr,len)     do { } while (0)
++
++/* Push n pages at kernel virtual address and clear the icache */
++/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
++extern inline void flush_icache_range (unsigned long address,
++                                     unsigned long endaddr)
++{
++  unsigned long set;
++  unsigned long start_set;
++  unsigned long end_set;
++
++  start_set = address & _ICACHE_SET_MASK;
++  end_set = endaddr & _ICACHE_SET_MASK;
++
++  if (start_set > end_set) {
++    /* from the begining to the lowest address */
++    for (set = 0; set <= end_set; set += (0x10 - 3)) {
++      asm volatile("cpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)\n"
++                   "\taddq%.l #1,%0\n"
++                   "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
++    }
++    /* next loop will finish the cache ie pass the hole */
++    end_set = LAST_ICACHE_ADDR;    
++  }
++  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
++    asm volatile("cpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)\n"
++                 "\taddq%.l #1,%0\n"
++                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
++  }
++}
++
++static inline void copy_to_user_page(struct vm_area_struct *vma,
++                                   struct page *page, unsigned long vaddr,
++                                   void *dst, void *src, int len)
++{
++      memcpy(dst, src, len);
++      flush_icache_user_page(vma, page, vaddr, len);
++}
++static inline void copy_from_user_page(struct vm_area_struct *vma,
++                                     struct page *page, unsigned long vaddr,
++                                     void *dst, void *src, int len)
++{
++      memcpy(dst, src, len);
++}
++
++#define flush_cache_vmap(start, end)          flush_cache_all()
++#define flush_cache_vunmap(start, end)                flush_cache_all()
++#define flush_dcache_mmap_lock(mapping)               do { } while (0)
++#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++
++#endif /* M68K_CF_548x_CACHEFLUSH_H */
+--- a/include/asm-m68k/cf_cacheflush.h
++++ b/include/asm-m68k/cf_cacheflush.h
+@@ -1,244 +1,10 @@
+ #ifndef M68K_CF_CACHEFLUSH_H
+ #define M68K_CF_CACHEFLUSH_H
+-#include <asm/cfcache.h>
+-/*
+- * Cache handling functions
+- */
+-
+-#define flush_icache()                                                \
+-({                                                            \
+-  unsigned long set;                                          \
+-  unsigned long start_set;                                    \
+-  unsigned long end_set;                                      \
+-                                                              \
+-  start_set = 0;                                              \
+-  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
+-                                                              \
+-  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
+-    asm volatile("cpushl %%ic,(%0)\n"                         \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%ic,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%ic,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));              \
+-  }                                                           \
+-})
+-
+-#define flush_dcache()                                                \
+-({                                                            \
+-  unsigned long set;                                          \
+-  unsigned long start_set;                                    \
+-  unsigned long end_set;                                      \
+-                                                              \
+-  start_set = 0;                                              \
+-  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
+-                                                              \
+-  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
+-    asm volatile("cpushl %%dc,(%0)\n"                         \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%dc,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%dc,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%dc,(%0)" : "=a" (set) : "a" (set));              \
+-  }                                                           \
+-})
+-
+-#define flush_bcache()                                                \
+-({                                                            \
+-  unsigned long set;                                          \
+-  unsigned long start_set;                                    \
+-  unsigned long end_set;                                      \
+-                                                              \
+-  start_set = 0;                                              \
+-  end_set = (unsigned long)LAST_DCACHE_ADDR;                  \
+-                                                              \
+-  for (set = start_set; set <= end_set; set += (0x10 - 3)) {  \
+-    asm volatile("cpushl %%bc,(%0)\n"                         \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%bc,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%bc,(%0)\n"                               \
+-                 "\taddq%.l #1,%0\n"                          \
+-                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));              \
+-  }                                                           \
+-})
+-
+-/*
+- * invalidate the cache for the specified memory range.
+- * It starts at the physical address specified for
+- * the given number of bytes.
+- */
+-extern void cache_clear(unsigned long paddr, int len);
+-/*
+- * push any dirty cache in the specified memory range.
+- * It starts at the physical address specified for
+- * the given number of bytes.
+- */
+-extern void cache_push(unsigned long paddr, int len);
+-
+-/*
+- * push and invalidate pages in the specified user virtual
+- * memory range.
+- */
+-extern void cache_push_v(unsigned long vaddr, int len);
+-
+-/* This is needed whenever the virtual mapping of the current
+-   process changes.  */
+-
+-/**
+- * flush_cache_mm - Flush an mm_struct
+- * @mm: mm_struct to flush
+- */
+-static inline void flush_cache_mm(struct mm_struct *mm)
+-{
+-      if (mm == current->mm)
+-              flush_bcache();
+-}
+-
+-#define flush_cache_dup_mm(mm)        flush_cache_mm(mm)
+-
+-#define flush_cache_all()             flush_bcache()
+-
+-/**
+- * flush_cache_range - Flush a cache range
+- * @vma: vma struct
+- * @start: Starting address
+- * @end: Ending address
+- *
+- * flush_cache_range must be a macro to avoid a dependency on
+- * linux/mm.h which includes this file.
+- */
+-static inline void flush_cache_range(struct vm_area_struct *vma,
+-      unsigned long start, unsigned long end)
+-{
+-      if (vma->vm_mm == current->mm)
+-              flush_bcache();
+-//            cf_cache_flush_range(start, end);
+-}
+-
+-/**
+- * flush_cache_page - Flush a page of the cache
+- * @vma: vma struct
+- * @vmaddr:
+- * @pfn: page numer
+- *
+- * flush_cache_page must be a macro to avoid a dependency on
+- * linux/mm.h which includes this file.
+- */
+-static inline void flush_cache_page(struct vm_area_struct *vma,
+-      unsigned long vmaddr, unsigned long pfn)
+-{
+-      if (vma->vm_mm == current->mm)
+-              flush_bcache();
+-//            cf_cache_flush_range(vmaddr, vmaddr+PAGE_SIZE);
+-}
+-
+-/* Push the page at kernel virtual address and clear the icache */
+-/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
+-#define flush_page_to_ram(page) __flush_page_to_ram((void *) page_address(page))
+-extern inline void __flush_page_to_ram(void *address)
+-{
+-  unsigned long set;
+-  unsigned long start_set;
+-  unsigned long end_set;
+-  unsigned long addr = (unsigned long) address;
+-
+-  addr &= ~(PAGE_SIZE - 1); /* round down to page start address */
+-
+-  start_set = addr & _ICACHE_SET_MASK;
+-  end_set = (addr + PAGE_SIZE-1) & _ICACHE_SET_MASK;
+-
+-  if (start_set > end_set) {
+-    /* from the begining to the lowest address */
+-    for (set = 0; set <= end_set; set += (0x10 - 3)) {
+-      asm volatile("cpushl %%bc,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%bc,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%bc,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
+-    }
+-    /* next loop will finish the cache ie pass the hole */
+-    end_set = LAST_ICACHE_ADDR;    
+-  }
+-  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
+-    asm volatile("cpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%bc,(%0)" : "=a" (set) : "a" (set));
+-  }
+-}
+-
+-/* Use __flush_page_to_ram() for flush_dcache_page all values are same - MW */
+-#define flush_dcache_page(page)                       \
+-      __flush_page_to_ram((void *) page_address(page))
+-#define flush_icache_page(vma,pg)             \
+-      __flush_page_to_ram((void *) page_address(pg))
+-#define flush_icache_user_range(adr,len)      do { } while (0)
+-/* NL */
+-#define flush_icache_user_page(vma,page,addr,len)     do { } while (0)
+-
+-/* Push n pages at kernel virtual address and clear the icache */
+-/* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
+-extern inline void flush_icache_range (unsigned long address,
+-                                     unsigned long endaddr)
+-{
+-  unsigned long set;
+-  unsigned long start_set;
+-  unsigned long end_set;
+-
+-  start_set = address & _ICACHE_SET_MASK;
+-  end_set = endaddr & _ICACHE_SET_MASK;
+-
+-  if (start_set > end_set) {
+-    /* from the begining to the lowest address */
+-    for (set = 0; set <= end_set; set += (0x10 - 3)) {
+-      asm volatile("cpushl %%ic,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%ic,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%ic,(%0)\n"
+-                   "\taddq%.l #1,%0\n"
+-                   "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
+-    }
+-    /* next loop will finish the cache ie pass the hole */
+-    end_set = LAST_ICACHE_ADDR;    
+-  }
+-  for (set = start_set; set <= end_set; set += (0x10 - 3)) {
+-    asm volatile("cpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)\n"
+-                 "\taddq%.l #1,%0\n"
+-                 "\tcpushl %%ic,(%0)" : "=a" (set) : "a" (set));
+-  }
+-}
+-
+-static inline void copy_to_user_page(struct vm_area_struct *vma,
+-                                   struct page *page, unsigned long vaddr,
+-                                   void *dst, void *src, int len)
+-{
+-      memcpy(dst, src, len);
+-      flush_icache_user_page(vma, page, vaddr, len);
+-}
+-static inline void copy_from_user_page(struct vm_area_struct *vma,
+-                                     struct page *page, unsigned long vaddr,
+-                                     void *dst, void *src, int len)
+-{
+-      memcpy(dst, src, len);
+-}
+-
+-#define flush_cache_vmap(start, end)          flush_cache_all()
+-#define flush_cache_vunmap(start, end)                flush_cache_all()
+-#define flush_dcache_mmap_lock(mapping)               do { } while (0)
+-#define flush_dcache_mmap_unlock(mapping)     do { } while (0)
++#ifdef CONFIG_M5445X
++#include "cf_5445x_cacheflush.h"
++#else
++#include "cf_548x_cacheflush.h"
++#endif
+ #endif /* M68K_CF_CACHEFLUSH_H */
diff --git a/target/linux/coldfire/patches/063-m5445x_rambar_config.patch b/target/linux/coldfire/patches/063-m5445x_rambar_config.patch
new file mode 100644 (file)
index 0000000..ba4e18e
--- /dev/null
@@ -0,0 +1,44 @@
+From 6651009d31bfcb8e364e25e944618465f510bd0b Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 21:23:58 -0600
+Subject: [PATCH] Update SRAM/RAMBAR1 configuration for M5445x.
+
+LTIBName: m5445x-rambar-config
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S   |    5 +++--
+ include/asm-m68k/coldfire.h |    9 +++++++--
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -285,8 +285,9 @@ ENTRY(__start)
+       movel   %a0,%usp
+ #if defined(CONFIG_M5445X)
+-      movel  #(MCF_RAMBAR1 + 0x221), %d0
+-      movec   %d0, %rambar1
++/* JKM -- don't enable it currently -- fix    */
++/*    movel  #(MCF_RAMBAR1 + 0x221), %d0      */
++/*    movec   %d0, %rambar1                   */
+ #elif defined(CONFIG_M547X_8X)
+       movel   #MCF_MBAR, %d0
+       movec   %d0, %mbar
+--- a/include/asm-m68k/coldfire.h
++++ b/include/asm-m68k/coldfire.h
+@@ -3,8 +3,13 @@
+ #if defined(CONFIG_M5445X)
+ #define MCF_MBAR      0x0
+-#define MCF_RAMBAR1   0x80000000
+-#define MCF_SRAM      0x80000000
++/*
++ * Even though RAMBAR1 should be in the 0x8xxxxxxx range there
++ * is a problem that needs to be resolved.  Currently head.S
++ * disables SRAM/RAMBAR1.
++ */
++#define MCF_RAMBAR1   0x40000000
++#define MCF_SRAM      0x40000000
+ #elif defined(CONFIG_M547X_8X)
+ #define MCF_MBAR      0xF0000000
+ #define MCF_MMUBAR    0xF1000000
diff --git a/target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch b/target/linux/coldfire/patches/064-mcfv4e_update_cmdlines.patch
new file mode 100644 (file)
index 0000000..0b382d2
--- /dev/null
@@ -0,0 +1,30 @@
+From 7b2dd837d32050d88eadfb0c71c381f7478f55b3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 22:09:34 -0600
+Subject: [PATCH] Update default command lines.
+
+LTIBName: mcfv4e-update-cmdlines
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c |    8 +++++---
+ 1 files changed, 5 insertions(+), 3 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -132,11 +132,13 @@ int __init uboot_commandline(char *boota
+ /*
+  * This routine does things not done in the bootloader.
+  */
+-#if defined(CONFIG_M5445X)
+-#define FOO_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++#if defined(CONFIG_M54451)
+ #define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.51:172.27.155.1"
++#elif defined(CONFIG_M54455)
++#define MTD_DEFAULT_COMMAND_LINE "root=/dev/mtdblock1 rw rootfstype=jffs2 ip=none mtdparts=physmap-flash.0:5M(kernel)ro,-(jffs2)"
++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/redstripe/rootfs/ ip=172.27.155.55:172.27.155.1"
+ #elif defined(CONFIG_M547X_8X)
+-#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.85:172.27.155.1"
++#define DEFAULT_COMMAND_LINE "debug root=/dev/nfs rw nfsroot=172.27.155.1:/tftpboot/rigo/rootfs/ ip=172.27.155.75:172.27.155.1"
+ #endif
+ asmlinkage void __init cf_early_init(void)
+ {
diff --git a/target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch b/target/linux/coldfire/patches/065-mcfv4e_bss_clear_move.patch
new file mode 100644 (file)
index 0000000..84a26a3
--- /dev/null
@@ -0,0 +1,46 @@
+From 87ea76988875856dc1c3657b27ac792d2f0311e9 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 22:12:17 -0600
+Subject: [PATCH] Move BSS initialization after mmu setup.
+
+LTIBName: mcfv4e-bss-clear-move
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S |   19 +++++++++----------
+ 1 files changed, 9 insertions(+), 10 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -326,16 +326,6 @@ ENTRY(__start)
+       movec   %d0, %acr3
+       nop
+-#ifdef CONFIG_COLDFIRE
+-/* zero bss */
+-      lea     _sbss,%a0
+-      lea     _ebss,%a1
+-      clrl    %d0
+-_loop_bss:
+-      movel   %d0,(%a0)+
+-      cmpl    %a0,%a1
+-      bne     _loop_bss
+-#endif
+       /* If you change the memory size to another value make a matching 
+          change in paging_init(cf-mmu.c) to zones_size[]. */
+@@ -564,6 +554,15 @@ ENTRY(__running_high)
+       addl    #PAGE_OFFSET,%a1
+       movel   %a1,%a0@
++/* zero bss */
++      lea     _sbss,%a0
++      lea     _ebss,%a1
++      clrl    %d0
++_loop_bss:
++      movel   %d0,(%a0)+
++      cmpl    %a0,%a1
++      bne     _loop_bss
++
+       /* Unmap unity mappings */
+ #if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ #if defined(CONFIG_M5445X)
diff --git a/target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch b/target/linux/coldfire/patches/066-mcfv4e_endmem_fix.patch
new file mode 100644 (file)
index 0000000..e334f42
--- /dev/null
@@ -0,0 +1,22 @@
+From 601145f682eab66abca5d154a8a9fdf275acd8ba Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 22:20:31 -0600
+Subject: [PATCH] Fix off by 1 error with endmem.
+
+LTIBName: mcfv4e-endmem-fix
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -449,7 +449,7 @@ void __init config_coldfire(void)
+ /*    mach_hwclk              = coldfire_hwclk; to be done */
+       mach_get_model          = coldfire_get_model;
+-      coldfire_bootmem_alloc(startmem, endmem);
++      coldfire_bootmem_alloc(startmem, endmem-1);
+       /*
+        * initrd setup
diff --git a/target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch b/target/linux/coldfire/patches/067-mcfv4e_acr_cleanup.patch
new file mode 100644 (file)
index 0000000..3a0736c
--- /dev/null
@@ -0,0 +1,112 @@
+From ddc092180bd24b34afdd6fd7cd48b77b55a5bd5e Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 23:21:07 -0600
+Subject: [PATCH] Cleanup ACR mappings and document.
+
+LTIBName: mcfv4e-acr-cleanup
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S |   81 +++++++++++++++++++++++++-------------------
+ 1 files changed, 46 insertions(+), 35 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -53,52 +53,63 @@
+ #define __FINIT               .previous
+ #endif
+-/* JKM -- REVISE DOCS FOR M547x_8x and PHYS MAPPING */
++#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ /*
+- * Setup ACR mappings to provide the following memory map:
+- *   Data
+- *     0xA0000000 -> 0xAFFFFFFF [0] NO CACHE / PRECISE / SUPER ONLY
+- *     0xF0000000 -> 0xFFFFFFFF [1] NO CACHE / PRECISE / SUPER ONLY
+- *   Code
+- *     None currently (mapped via TLBs)
++ * Kernel mapped to virtual ram address.
++ *
++ * M5445x:
++ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
++ *    Data[1]: 0xA0000000 -> 0xAFFFFFFF       PCI
++ *    Code[0]: Not Mapped
++ *    Code[1]: Not Mapped
++ *
++ * M547x/M548x
++ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
++ *    Data[1]: Not Mapped
++ *    Code[0]: Not Mapped
++ *    Code[1]: Not Mapped
+  */
+-
+-#if CONFIG_SDRAM_BASE != PAGE_OFFSET
+ #if defined(CONFIG_M5445X)
+-#if 0
+-#define ACR0_DEFAULT  #0xA00FA048   /* ACR0 default value */
+-#endif
+-#define ACR0_DEFAULT  #0x400FA028   /* ACR0 default value */
+-#define ACR1_DEFAULT  #0xF00FA040   /* ACR1 default value */
+-#if 0
+-#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+-#endif
+-#define ACR2_DEFAULT  #0x400FA028   /* ACR2 default value */
+-#define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
+-/* ACR mapping for FPGA (maps 0) */
+-#define ACR0_FPGA     #0x000FA048   /* ACR0 enable FPGA */
++#define ACR0_DEFAULT  #0xF00FA048   /* System regs */
++#define ACR1_DEFAULT  #0xA00FA048   /* PCI */
++#define ACR2_DEFAULT  #0x00000000   /* Not Mapped */
++#define ACR3_DEFAULT  #0x00000000   /* Not Mapped */
+ #elif defined(CONFIG_M547X_8X)
+-#define ACR0_DEFAULT  #0xE000C040   /* ACR0 default value */
+-#define ACR1_DEFAULT  #0x00000000   /* ACR1 default value */
+-#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+-#define ACR3_DEFAULT  #0x00000000   /* ACR3 default value */
++#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
++#define ACR1_DEFAULT  #0x00000000   /* Not Mapped */
++#define ACR2_DEFAULT  #0x00000000   /* Not Mapped */
++#define ACR3_DEFAULT  #0x00000000   /* Not Mapped */
+ #endif
+-#else
++#else /* CONFIG_SDRAM_BASE = PAGE_OFFSET */
++/*
++ * Kernel mapped to physical ram address.
++ *
++ * M5445x:
++ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
++ *    Data[1]: 0x40000000 -> 0x4FFFFFFF       SDRAM - uncached
++ *    Code[0]: Not Mapped
++ *    Code[1]: 0x40000000 -> 0x4FFFFFFF       SDRAM - cached
++ *
++ * M547x/M548x
++ *    Data[0]: 0xF0000000 -> 0xFFFFFFFF       System regs
++ *    Data[1]: 0x00000000 -> 0x0FFFFFFF       SDRAM - uncached
++ *    Code[0]: Not Mapped
++ *    Code[1]: 0x00000000 -> 0x0FFFFFFF       SDRAM - cached
++ */
+ #if defined(CONFIG_M5445X)
+-#define ACR0_DEFAULT  #0xF00FC040   /* ACR0 default value */
+-#define ACR1_DEFAULT  #0x400FA008   /* ACR1 default value */
+-#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+-#define ACR3_DEFAULT  #0x400FA008   /* ACR3 default value */
++#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
++#define ACR1_DEFAULT  #0x400FA048   /* SDRAM uncached */
++#define ACR2_DEFAULT  #0x00000000   /* Not mapped */
++#define ACR3_DEFAULT  #0x400FA008   /* SDRAM cached */
+ #elif defined(CONFIG_M547X_8X)
+-#define ACR0_DEFAULT  #0xF00FC040   /* ACR0 default value */
+-#define ACR1_DEFAULT  #0x000FA008   /* ACR1 default value */
+-#define ACR2_DEFAULT  #0x00000000   /* ACR2 default value */
+-#define ACR3_DEFAULT  #0x000FA008   /* ACR3 default value */
++#define ACR0_DEFAULT  #0xF00FA048   /* System Regs */
++#define ACR1_DEFAULT  #0x000FA048   /* SDRAM uncached */
++#define ACR2_DEFAULT  #0x00000000   /* Not mapped */
++#define ACR3_DEFAULT  #0x000FA008   /* SDRAM cached */
+ #endif
+ #endif
+-
+ /* Several macros to make the writing of subroutines easier:
+  * - func_start marks the beginning of the routine which setups the frame
+  *   register and saves the registers, it also defines another macro
diff --git a/target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch b/target/linux/coldfire/patches/068-m547x_8x_NOR_FLASH_baseaddr.patch
new file mode 100644 (file)
index 0000000..a2891de
--- /dev/null
@@ -0,0 +1,21 @@
+From 423d67db899b8f2e20b09fac7da1f7eaaa4523cb Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 23:24:30 -0600
+Subject: [PATCH] Add the M547x/M548x NOR_FLASH base address.
+
+LTIBName: m547x-8x-NOR-FLASH-baseaddr
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/Kconfig |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -459,6 +459,7 @@ config NOR_FLASH_BASE
+       depends on COLDFIRE
+       default 0x00000000 if M54451EVB
+       default 0x00000000 if M54455EVB
++      default 0xE0000000 if M547X_8X
+ config M68KFPU_EMU
+       bool "Math emulation support (EXPERIMENTAL)"
diff --git a/target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch b/target/linux/coldfire/patches/069-m5445x_fecint_nest_1.patch
new file mode 100644 (file)
index 0000000..a3f14eb
--- /dev/null
@@ -0,0 +1,32 @@
+From 8809b176ecde425d13cab8920a66fbfd6fb4c3b7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 24 Jun 2008 23:26:54 -0600
+Subject: [PATCH] Make sure interrupt handler calls aren't nested.
+
+LTIBName: m5445x-fecint-nest
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/net/fec.c |    5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+--- a/drivers/net/fec.c
++++ b/drivers/net/fec.c
+@@ -23,6 +23,9 @@
+  *
+  * Bug fixes and cleanup by Philippe De Muyter (phdm@macqel.be)
+  * Copyright (c) 2004-2006 Macq Electronique SA.
++ *
++ * Coldfire bug fixes and cleanup by Kurt Mahan (kmahan@freescale.com)
++ * Copyright 2007-2008 Freescale Semiconductor, Inc. All Rights Reserved.
+  */
+ #include <linux/module.h>
+@@ -1865,7 +1868,7 @@ static void __inline__ fec_request_intrs
+       /* Setup interrupt handlers. */
+       for (idp = id; idp->name; idp++) {
+-              if (request_irq(b+idp->irq, fec_enet_interrupt, 0,
++              if (request_irq(b+idp->irq, fec_enet_interrupt, IRQF_DISABLED,
+                   idp->name, dev) != 0)
+                       printk(KERN_ERR "FEC: Could not alloc %s IRQ(%d)!\n",
+                               idp->name, b+idp->irq);
diff --git a/target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch b/target/linux/coldfire/patches/070-m5445x_rambar_init_1.patch
new file mode 100644 (file)
index 0000000..e07eba3
--- /dev/null
@@ -0,0 +1,25 @@
+From 1667ce157c8cc2ffc13f1e31c64982d0af95d5a5 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 25 Jun 2008 01:34:30 -0600
+Subject: [PATCH] Disable RAMBAR1 on initialization.
+
+LTIBName: m5445x-rambar-init
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/head.S |    5 ++---
+ 1 files changed, 2 insertions(+), 3 deletions(-)
+
+--- a/arch/m68k/coldfire/head.S
++++ b/arch/m68k/coldfire/head.S
+@@ -296,9 +296,8 @@ ENTRY(__start)
+       movel   %a0,%usp
+ #if defined(CONFIG_M5445X)
+-/* JKM -- don't enable it currently -- fix    */
+-/*    movel  #(MCF_RAMBAR1 + 0x221), %d0      */
+-/*    movec   %d0, %rambar1                   */
++      movel   #0x80000000, %d0
++      movec   %d0, %rambar1
+ #elif defined(CONFIG_M547X_8X)
+       movel   #MCF_MBAR, %d0
+       movec   %d0, %mbar
diff --git a/target/linux/coldfire/patches/071-m5445x_i2c.patch b/target/linux/coldfire/patches/071-m5445x_i2c.patch
new file mode 100644 (file)
index 0000000..ecda4d6
--- /dev/null
@@ -0,0 +1,699 @@
+From e1618e943f60a4f8f778c4f7c389e2fa13eb0a83 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 26 Jun 2008 16:29:56 -0600
+Subject: [PATCH] Add I2C support for the M5445x platforms.
+
+LTIBName: m5445x-i2c
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/i2c/busses/Kconfig   |   10 +
+ drivers/i2c/busses/Makefile  |    1 +
+ drivers/i2c/busses/i2c-mcf.c |  573 ++++++++++++++++++++++++++++++++++++++++++
+ drivers/i2c/busses/i2c-mcf.h |   75 ++++++
+ 4 files changed, 659 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/i2c/busses/i2c-mcf.c
+ create mode 100644 drivers/i2c/busses/i2c-mcf.h
+
+--- a/drivers/i2c/busses/Kconfig
++++ b/drivers/i2c/busses/Kconfig
+@@ -302,6 +302,16 @@ config I2C_POWERMAC
+         This support is also available as a module.  If so, the module
+         will be called i2c-powermac.
++config I2C_MCF
++      tristate "MCF ColdFire"
++      depends on I2C && EXPERIMENTAL
++      help
++        If you say yes to this option, support will be included for the
++        I2C on most ColdFire CPUs
++
++        This driver can also be built as a module.  If so, the module
++        will be called i2c-mcf.
++ 
+ config I2C_MPC
+       tristate "MPC107/824x/85xx/52xx/86xx"
+       depends on PPC32
+--- a/drivers/i2c/busses/Makefile
++++ b/drivers/i2c/busses/Makefile
+@@ -53,6 +53,7 @@ obj-$(CONFIG_I2C_VOODOO3)    += i2c-voodoo3
+ obj-$(CONFIG_SCx200_ACB)      += scx200_acb.o
+ obj-$(CONFIG_SCx200_I2C)      += scx200_i2c.o
+ obj-$(CONFIG_I2C_MCF548x)       += i2c-mcf548x.o
++obj-$(CONFIG_I2C_MCF)         += i2c-mcf.o
+ ifeq ($(CONFIG_I2C_DEBUG_BUS),y)
+ EXTRA_CFLAGS += -DDEBUG
+--- /dev/null
++++ b/drivers/i2c/busses/i2c-mcf.c
+@@ -0,0 +1,573 @@
++/*
++    i2c-mcf.c - Part of lm_sensors, Linux kernel modules for hardware monitoring
++
++    Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca>
++                                      <http://www3.sympatico.ca/derek.cheung>
++
++    Copyright (c) 2006-2007, emlix
++                      Sebastian Hess <sh@emlix.com>
++
++    Copyright (c) 2006-2007 Freescale Semiconductor, Inc
++                      Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com>
++                      Matt Waddel <Matt.Waddel@freescale.com>
++
++    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.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++    Changes:
++    v0.1      26 March 2005
++              Initial Release - developed on uClinux with 2.6.9 kernel
++
++    v0.2      29 May 2006
++              Modified to be more generic and added support for
++              i2c_master_xfer
++
++    This I2C adaptor supports the ColdFire CPU I2C module. Since most Coldfire
++    CPUs' I2C module use the same register set (e.g., MCF5249), the code is very
++    portable and re-usable to other Coldfire CPUs.
++
++    The transmission frequency is set at about 100KHz for the CPU board with
++    8MHz crystal. If the CPU board uses different system clock frequency, you 
++    should change the following line:
++                static int __init i2c_coldfire_init(void)
++                {
++                                .........
++                        // Set transmission frequency 0x15 = ~100kHz
++                        *MCF_I2C_I2FDR = 0x15;
++                                ........
++                }
++
++    Remember to perform a dummy read to set the ColdFire CPU's I2C module for 
++    read before reading the actual byte from a device
++
++    The I2C_SM_BUS_BLOCK_DATA function are not yet ready but most lm_senors 
++    do not care
++*/
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/i2c.h>
++#include <linux/delay.h>
++#include <linux/string.h>
++#include <asm/coldfire.h>
++#include <asm/mcfsim.h>
++#include <asm/types.h>
++#include <linux/platform_device.h>
++#include "i2c-mcf.h"
++
++
++static struct i2c_algorithm coldfire_algorithm = {
++      /*.name         = "ColdFire I2C algorithm",
++      .id             = I2C_ALGO_SMBUS,*/
++      .smbus_xfer     = coldfire_i2c_access,
++      .master_xfer    = coldfire_i2c_master,
++      .functionality  = coldfire_func,
++};
++
++
++static struct i2c_adapter coldfire_adapter = {
++      .owner          = THIS_MODULE,
++      .class          = I2C_CLASS_HWMON,
++      .algo           = &coldfire_algorithm,
++      .name           = "ColdFire I2C adapter",
++};
++
++
++__u16 lastaddr;
++__u16 lastop;
++
++static inline int coldfire_do_first_start(__u16 addr,__u16 flags)
++{
++      int err;
++      /*
++       * Generate a stop and put the I2C module into slave mode
++       */
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
++
++      /*
++       * Generate a new Start signal
++       */
++      err = coldfire_i2c_start(flags & I2C_M_RD ? I2C_SMBUS_READ : I2C_SMBUS_WRITE,
++                              addr, FIRST_START);
++      if(err) return err;
++
++      lastaddr = addr;
++      lastop = flags & I2C_M_RD;      /* Ensure everything for new start */
++      return 0;
++}
++
++
++/*
++ *  read one byte data from the I2C bus
++ */
++static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType) {
++
++      int timeout;
++
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MTX;             /* master receive mode*/
++
++      if (ackType == NACK)
++              *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK;     /* generate NA */
++      else
++              *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;    /* generate ACK */
++
++
++      /* read data from the I2C bus */
++      *rxData = *MCF_I2C_I2DR;
++
++      /* printk(">>> %s I2DR data is %.2x \n", __FUNCTION__, *rxData); */
++
++      /* wait for data transfer to complete */
++      timeout = 500;
++      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
++              udelay(1);
++      if (timeout <= 0)
++              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__,
++                      timeout);
++
++
++      /* reset the interrupt bit */
++      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
++
++      if (timeout <= 0 )
++              return -1;
++      else
++              return 0;
++
++};
++
++
++/*
++ *  write one byte data onto the I2C bus
++ */
++static int coldfire_write_data(const u8 txData) {
++
++      int timeout;
++
++      timeout = 500;
++
++      *MCF_I2C_I2CR |= MCF_I2C_I2CR_MTX;      /* I2C module into TX mode */
++      *MCF_I2C_I2DR = txData;                 /* send the data */
++
++      /* wait for data transfer to complete */
++      /* rely on the interrupt handling bit */
++      timeout = 500;
++      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
++              udelay(1);
++      if (timeout <=0)
++              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__,
++                      timeout);
++
++
++      /* reset the interrupt bit */
++      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
++
++      if (timeout <= 0 )
++              return -1;
++      else
++              return 0;
++
++};
++
++
++
++
++/*
++ *  Generate I2C start or repeat start signal
++ *  Combine the 7 bit target_address and the R/W bit and put it onto the I2C bus
++ */
++static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE start_type) {
++
++      int timeout;
++
++      /* printk(">>> %s START TYPE %s \n", __FUNCTION__, 
++                 start_type == FIRST_START ? "FIRST_START":"REPEAT_START");*/
++
++      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN;
++
++      if (start_type == FIRST_START) {
++              /* Make sure the I2C bus is idle */
++              timeout = 500;          /* 500us timeout */
++              while (timeout-- && (*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB))
++                      udelay(1);
++              if (timeout <= 0) {
++                      printk("%s - I2C bus always busy in the past 500us timeout is %d \n", __FUNCTION__, timeout);
++                      goto check_rc;
++              }
++              /* generate a START and put the I2C module into MASTER TX mode*/
++              *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX);
++
++              /* wait for bus busy to be set */
++              timeout = 500;
++              while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB))
++                      udelay(1);
++              if (timeout <= 0) {
++                      printk("%s - I2C bus is never busy after START. Timeout is %d \n", __FUNCTION__, timeout);
++                      goto check_rc;
++              }
++
++      } else {
++              /* this is repeat START */
++              udelay(500);    /* need some delay before repeat start */
++              *MCF_I2C_I2CR |= (MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_RSTA);
++      }
++
++
++      /* combine the R/W bit and the 7 bit target address and put it onto 
++         the I2C bus */
++      *MCF_I2C_I2DR = ((target_address & 0x7F) << 1) | (read_write == I2C_SMBUS_WRITE ? 0x00 : 0x01);
++
++      /* wait for bus transfer to complete */
++      /* when one byte transfer is completed, IIF set at the faling edge of 
++         the 9th clock */
++      timeout = 500;
++      while (timeout-- && !(*MCF_I2C_I2SR & MCF_I2C_I2SR_IIF))
++              udelay(1);
++      if (timeout <= 0)
++              printk("%s - I2C IIF never set. Timeout is %d \n", __FUNCTION__, timeout);
++
++
++check_rc:
++      /* reset the interrupt bit */
++      *MCF_I2C_I2SR &= ~MCF_I2C_I2SR_IIF;
++
++      if (timeout <= 0)
++              return -1;
++      else
++              return 0;
++};
++
++
++/*
++ *  5282 SMBUS supporting functions
++ */
++
++static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 addr,
++                            unsigned short flags, char read_write,
++                            u8 command, int size, union i2c_smbus_data *data)
++{
++      int rc = 0;
++      u8 rxData, tempRxData[2];
++
++      switch (size) {
++              case I2C_SMBUS_QUICK:
++                      rc = coldfire_i2c_start(read_write, addr, FIRST_START);         /* generate START */
++                        break;
++              case I2C_SMBUS_BYTE:
++                      rc = coldfire_i2c_start(read_write, addr, FIRST_START);
++                      *MCF_I2C_I2CR |= MCF_I2C_I2CR_TXAK;     /*generate NA */
++                      if (read_write == I2C_SMBUS_WRITE)
++                              rc += coldfire_write_data(command);
++                      else {
++                              coldfire_read_data(&rxData, NACK);/*dummy read*/
++                              rc += coldfire_read_data(&rxData, NACK);
++                              data->byte = rxData;
++                      }
++                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK; /* reset ACK bit */
++                      break;
++              case I2C_SMBUS_BYTE_DATA:
++                      rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, FIRST_START);
++                      rc += coldfire_write_data(command);
++                      if (read_write == I2C_SMBUS_WRITE)
++                              rc += coldfire_write_data(data->byte);
++                      else {
++                              /* This is SMBus READ Byte Data Request. 
++                                 Perform REPEAT START */
++                              rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, 
++                                                       REPEAT_START);
++                              coldfire_read_data(&rxData, ACK);/* dummy read*/
++                              /* Disable Acknowledge, generate STOP after 
++                                 next byte transfer */
++                              rc += coldfire_read_data(&rxData, NACK);
++                              data->byte = rxData;
++                      }
++                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;/* reset to normal ACk */
++                      break;
++              case I2C_SMBUS_PROC_CALL:
++              case I2C_SMBUS_WORD_DATA:
++                      dev_info(&adap->dev, "size = I2C_SMBUS_WORD_DATA \n");
++                      rc = coldfire_i2c_start(I2C_SMBUS_WRITE, addr, 
++                                              FIRST_START);
++                      rc += coldfire_write_data(command);
++                      if (read_write == I2C_SMBUS_WRITE) {
++                              rc += coldfire_write_data(data->word & 0x00FF);
++                              rc += coldfire_write_data((data->word & 0x00FF) >> 8);
++                      } else {
++                              /* This is SMBUS READ WORD request. 
++                                 Peform REPEAT START */
++                              rc += coldfire_i2c_start(I2C_SMBUS_READ, addr, 
++                                                       REPEAT_START);
++                              coldfire_read_data(&rxData, ACK);/* dummy read*/
++                              /* Disable Acknowledge, generate STOP after 
++                                 next byte transfer */
++                              /* read the MS byte from the device */
++                              rc += coldfire_read_data(&rxData, NACK);
++                              tempRxData[1] = rxData;
++                              /* read the LS byte from the device */
++                              rc += coldfire_read_data(&rxData, NACK);
++                              tempRxData[0] = rxData;
++                              /* the host driver expect little endian 
++                                 convention. Swap the byte */
++                              data->word = (tempRxData[0] << 8)|tempRxData[1];
++                      }
++                      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;
++                      break;
++              case I2C_SMBUS_BLOCK_DATA:
++                      /* Not done yet */
++                      break;
++              default:
++                      printk("Unsupported I2C size \n");
++                      rc = -1;
++                      break;
++      };
++
++      /* Generate a STOP and put I2C module into slave mode */
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
++
++      /* restore interrupt */
++      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN;
++
++      if (rc < 0)
++              return -1;
++      else
++              return 0;
++};
++
++
++/*
++ *  List the SMBUS functions supported by this I2C adaptor
++ *  Also tell the I2C Subsystem that we are able of master_xfer()
++ */
++static u32 coldfire_func(struct i2c_adapter *adapter)
++{
++      return(I2C_FUNC_SMBUS_QUICK |
++             I2C_FUNC_SMBUS_BYTE |
++             I2C_FUNC_SMBUS_PROC_CALL |
++             I2C_FUNC_SMBUS_BYTE_DATA |
++             I2C_FUNC_SMBUS_WORD_DATA |
++             I2C_FUNC_I2C |
++             I2C_FUNC_SMBUS_BLOCK_DATA);
++};
++
++static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs,
++                             int num)
++{
++      u8 dummyRead;
++      struct i2c_msg *p;
++      int i, err = 0;
++      int ic=0;
++
++      lastaddr = 0;
++      lastop = 8;
++
++      /* disable the IRQ, we are doing polling */
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_IIEN;
++
++      dev_dbg(&adap->dev,"Num of actions: %d\n", num);
++
++      for (i = 0; !err && i < num; i++) {
++              p = &msgs[i];
++
++
++              if (!p->len)
++              {
++                      dev_dbg(&adap->dev,"p->len == 0!\n");
++                      continue;
++              }
++              /*
++               * Generate a new Start, if the target address differs from 
++               * the last target, generate a stop in this case first
++               */
++              if(p->addr != lastaddr)
++              {
++                      err = coldfire_do_first_start(p->addr,p->flags);
++                      if(err)
++                      {
++                              dev_dbg(&adap->dev,"First Init failed!\n");
++                              break;
++                      }
++              }
++
++              else if((p->flags & I2C_M_RD)  != lastop)
++              {
++                      /*
++                       * If the Operational Mode changed, we need to do this 
++                       * here ...
++                       */
++                      dev_dbg(&adap->dev,"%s(): Direction changed, was: %d; is now: %d\n", __FUNCTION__, lastop, p->flags & I2C_M_RD);
++
++                      /* Last op was an read, now it's write: complete stop 
++                         and reinit */
++                      if (lastop & I2C_M_RD)
++                      {
++                              dev_dbg(&adap->dev,"%s(): The device is in read state, we must reset!\n", __FUNCTION__);
++                              if((err = coldfire_do_first_start(p->addr,p->flags)))
++                                      break;
++                      }
++                      else
++                      {
++                              dev_dbg(&adap->dev,"%s(): We switchted to read mode\n",__FUNCTION__);
++                              if((err = coldfire_i2c_start((p->flags & I2C_M_RD) ? I2C_SMBUS_READ : I2C_SMBUS_WRITE,
++                                        p->addr, REPEAT_START)))
++                                      break;
++                      }
++
++                      lastop = p->flags & I2C_M_RD;   /* Save the last op */
++              }
++
++              if (p->flags & I2C_M_RD)
++              {
++                      /*
++                       * When ever we get here, a new session was activated, 
++                       * so read a dummy byte
++                       */
++                      coldfire_read_data(&dummyRead, ACK);
++                      /*
++                       * read p->len -1 bytes with ACK to the slave,
++                       * read the last byte without the ACK, to inform him 
++                       * about the stop afterwards
++                       */
++                      ic = 0;
++                      while(!err && (ic < p->len-1 ))
++                      {
++                              err = coldfire_read_data(p->buf+ic, ACK );
++                              ic++;
++                      }
++                      if(!err)
++                              err = coldfire_read_data(p->buf+ic, NACK);
++                      dev_dbg(&coldfire_adapter.dev,"read: %2x\n",p->buf[ic]);
++              }
++              else
++              {
++                      if(p->len == 2)
++                              dev_dbg(&coldfire_adapter.dev,"writing: 0x %2x %2x\n", p->buf[0], p->buf[1]);
++
++                      /*
++                       * Write data to the slave
++                       */
++                      for(ic=0; !err && ic < p->len; ic++)
++                      {
++                              err = coldfire_write_data(p->buf[ic]);
++                              if(err)
++                              {
++                                      dev_dbg(&coldfire_adapter.dev, "Failed to write data\n");
++                              }
++                      }
++              }
++      }
++
++      /*
++       * Put the device into slave mode to enable the STOP Generation 
++       * (the RTC needs this)
++       */
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_MSTA;
++
++      *MCF_I2C_I2CR &= ~MCF_I2C_I2CR_TXAK;    /* reset the ACK bit */
++
++      /* restore interrupt */
++      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IIEN;
++
++      /* Return the number of messages processed, or the error code. */
++      if (err == 0)
++              err = num;
++      return err;
++}
++
++
++/*
++ *  Initalize the 5282 I2C module
++ *  Disable the 5282 I2C interrupt capability. Just use callback
++ */
++
++static int __init i2c_coldfire_init(void)
++{
++      int retval;
++      u8  dummyRead;
++
++#if defined(CONFIG_M532x) || defined(CONFIG_M5445X)
++      /*
++       * Initialize the GPIOs for I2C
++       */
++      MCF_GPIO_PAR_FECI2C |= (0
++                          | MCF_GPIO_PAR_FECI2C_PAR_SDA(3)
++                          | MCF_GPIO_PAR_FECI2C_PAR_SCL(3));
++#elif defined(CONFIG_M5253)
++      {
++      volatile u32 *reg;
++      /* GPIO Bit 41 = SCL0, Bit 42 = SDA0 */
++      reg = (volatile u32 *)(MCF_MBAR2 + MCFSIM2_GPIO1FUNC);
++      *reg &= 0xFFFFF9FF;
++      }
++#else
++      /* Initialize PASP0 and PASP1 to I2C functions, 5282 user guide 26-19 */
++      /* Port AS Pin Assignment Register (PASPAR)             */
++      /*              PASPA1 = 11 = AS1 pin is I2C SDA        */
++      /*              PASPA0 = 11 = AS0 pin is I2C SCL        */
++      *MCF_GPIO_PASPAR |= 0x000F;             /* u16 declaration */
++#endif
++
++
++      /* Set transmission frequency 0x15 = ~100kHz */
++      *MCF_I2C_I2FDR = 0x15;
++
++      /* set the 5282 I2C slave address though we never use it */
++      *MCF_I2C_I2ADR = 0x6A;
++
++      /* Enable I2C module and if IBB is set, do the special initialzation */
++      /* procedures as are documented at the 5282 User Guide page 24-11 */
++      *MCF_I2C_I2CR |= MCF_I2C_I2CR_IEN;
++      if ((*MCF_I2C_I2SR & MCF_I2C_I2SR_IBB) == 1) {
++              printk("%s - do special 5282 I2C init procedures \n", 
++                      __FUNCTION__);
++              *MCF_I2C_I2CR = 0x00;
++              *MCF_I2C_I2CR = 0xA0;
++              dummyRead = *MCF_I2C_I2DR;
++              *MCF_I2C_I2SR = 0x00;
++              *MCF_I2C_I2CR = 0x00;
++      }
++
++      /* default I2C mode is - slave and receive */
++      *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_MSTA | MCF_I2C_I2CR_MTX);
++
++      coldfire_adapter.dev.parent = &platform_bus;
++      retval = i2c_add_adapter(&coldfire_adapter);
++
++      if (retval < 0)
++              printk("%s - return code is: %d \n", __FUNCTION__, retval);
++
++      return retval;
++};
++
++
++/*
++ *  I2C module exit function
++ */
++
++static void __exit i2c_coldfire_exit(void)
++{
++      /* disable I2C and Interrupt */
++      *MCF_I2C_I2CR &= ~(MCF_I2C_I2CR_IEN | MCF_I2C_I2CR_IIEN);
++      i2c_del_adapter(&coldfire_adapter);
++
++};
++
++
++MODULE_AUTHOR("Derek CL Cheung <derek.cheung@sympatico.ca>");
++MODULE_DESCRIPTION("MCF5282 I2C adaptor");
++MODULE_LICENSE("GPL");
++
++module_init(i2c_coldfire_init);
++module_exit(i2c_coldfire_exit);
+--- /dev/null
++++ b/drivers/i2c/busses/i2c-mcf.h
+@@ -0,0 +1,75 @@
++/*
++    i2c-mcf.h - header file for i2c-mcf.c
++
++    Copyright (c) 2005, Derek CL Cheung <derek.cheung@sympatico.ca>
++                                        <http://www3.sympatico.ca/derek.cheung>
++
++    Copyright (c) 2006-2007, emlix
++                      Sebastian Hess <sh@emlix.com>
++
++    Copyright (c) 2006-2007 Freescale Semiconductor, Inc
++                      Yaroslav Vinogradov <yaroslav.vinogradov@freescale.com>
++                      Matt Waddel <Matt.Waddel@freescale.com>
++
++    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.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++    Changes:
++    v0.1      26 March 2005
++              Initial Release - developed on uClinux with 2.6.9 kernel
++    v0.2      29 May 2006
++              Modified to be more generic and added support for
++              i2c_master_xfer
++*/
++
++
++#ifndef __I2C_MCF_H__
++#define __I2C_MCF_H__
++
++enum I2C_START_TYPE { FIRST_START, REPEAT_START };
++enum I2C_ACK_TYPE { ACK, NACK};
++
++/* Function prototypes */
++static u32 coldfire_func(struct i2c_adapter *adapter);
++static s32 coldfire_i2c_access(struct i2c_adapter *adap, u16 address,
++                              unsigned short flags, char read_write,
++                              u8 command, int size, union i2c_smbus_data *data);
++static int coldfire_write_data(const u8 data);
++static int coldfire_i2c_start(const char read_write, const u16 target_address, const enum I2C_START_TYPE i2c_start);
++static int coldfire_read_data(u8 * const rxData, const enum I2C_ACK_TYPE ackType);
++static int coldfire_i2c_master(struct i2c_adapter *adap,struct i2c_msg *msgs, int num);
++void dumpReg(char *, u16 addr, u8 data);
++
++#define MCF_I2C_I2ADR_ADDR(x) (((x)&0x7F)<<0x01)
++#define MCF_I2C_I2FDR_IC(x)   (((x)&0x3F))
++
++/* I2C Control Register */
++#define MCF_I2C_I2CR_IEN      (0x80)  /* I2C enable */
++#define MCF_I2C_I2CR_IIEN     (0x40)  /* interrupt enable */
++#define MCF_I2C_I2CR_MSTA     (0x20)  /* master/slave mode */
++#define MCF_I2C_I2CR_MTX      (0x10)  /* transmit/receive mode */
++#define MCF_I2C_I2CR_TXAK     (0x08)  /* transmit acknowledge enable */
++#define MCF_I2C_I2CR_RSTA     (0x04)  /* repeat start */
++
++/* I2C Status Register */
++#define MCF_I2C_I2SR_ICF      (0x80)  /* data transfer bit */
++#define MCF_I2C_I2SR_IAAS     (0x40)  /* I2C addressed as a slave */
++#define MCF_I2C_I2SR_IBB      (0x20)  /* I2C bus busy */
++#define MCF_I2C_I2SR_IAL      (0x10)  /* aribitration lost */
++#define MCF_I2C_I2SR_SRW      (0x04)  /* slave read/write */
++#define MCF_I2C_I2SR_IIF      (0x02)  /* I2C interrupt */
++#define MCF_I2C_I2SR_RXAK     (0x01)  /* received acknowledge */
++
++/********************************************************************/
++#endif /*  __I2C_MCF_H__ */
diff --git a/target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch b/target/linux/coldfire/patches/072-mcfv4e_disable_irq_nosync.patch
new file mode 100644 (file)
index 0000000..c93c6f7
--- /dev/null
@@ -0,0 +1,24 @@
+From 69446dbc7af1fddf00f3ad0629008dd6875704a7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Wed, 2 Jul 2008 16:03:56 -0600
+Subject: [PATCH] Add disable_irq_nosync alias to disable_irq.
+
+LTIBName: mcfv4e-disable-irq-nosync
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/ints.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+--- a/arch/m68k/coldfire/ints.c
++++ b/arch/m68k/coldfire/ints.c
+@@ -317,6 +317,10 @@ void disable_irq(unsigned int irq)
+ }
+ EXPORT_SYMBOL(disable_irq);
++void disable_irq_nosync(unsigned int irq) __attribute__((alias("disable_irq")));
++EXPORT_SYMBOL(disable_irq_nosync);
++
++
+ unsigned long probe_irq_on(void)
+ {
+       return 0;
diff --git a/target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch b/target/linux/coldfire/patches/073-mcfv4e_uboot_bootargs.patch
new file mode 100644 (file)
index 0000000..34d1e3b
--- /dev/null
@@ -0,0 +1,32 @@
+From 39929365081d5aa7c311ee8325c7f1a0ffb88a76 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Mon, 7 Jul 2008 23:37:30 -0600
+Subject: [PATCH] Enable uboot bootargs.
+
+LTIBName: mcfv4e-uboot-bootargs
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c |    5 -----
+ 1 files changed, 0 insertions(+), 5 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -196,7 +196,6 @@ asmlinkage void __init cf_early_init(voi
+       m68k_memory[m68k_num_memory].addr = CONFIG_SDRAM_BASE;
+       m68k_memory[m68k_num_memory++].size = CONFIG_SDRAM_SIZE;
+-#if 0
+       if (!uboot_commandline(m68k_command_line)) {
+ #if defined(CONFIG_BOOTPARAM)
+               strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE-1);
+@@ -204,10 +203,6 @@ asmlinkage void __init cf_early_init(voi
+               strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+ #endif
+       }
+-#endif
+-/* JKM -- temporary! */
+-strcpy(m68k_command_line, DEFAULT_COMMAND_LINE);
+-/* JKM -- temporary! */
+ #if defined(CONFIG_BLK_DEV_INITRD)
+       /* add initrd image */
diff --git a/target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch b/target/linux/coldfire/patches/074-mcfv4e_except_vector_fix.patch
new file mode 100644 (file)
index 0000000..9956ba7
--- /dev/null
@@ -0,0 +1,56 @@
+From 09895934aaddf4f08345798068b41344068c7b56 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 8 Jul 2008 00:59:38 -0600
+Subject: [PATCH] Fix exception handling to properly get vector.
+
+LTIBName: mcfv4e-except-vector-fix
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/traps.c |   11 ++++++-----
+ 1 files changed, 6 insertions(+), 5 deletions(-)
+
+--- a/arch/m68k/coldfire/traps.c
++++ b/arch/m68k/coldfire/traps.c
+@@ -7,6 +7,7 @@
+  *  68040 fixes by Martin Apel
+  *  68060 fixes by Roman Hodek
+  *  68060 fixes by Jesper Skov
++ *  Coldfire fixes by Kurt Mahan
+  *
+  * This file is subject to the terms and conditions of the GNU General Public
+  * License.  See the file COPYING in the main directory of this archive
+@@ -288,13 +289,13 @@ void show_stack(struct task_struct *task
+ void bad_super_trap(struct frame *fp)
+ {
+       console_verbose();
+-      if (fp->ptregs.vector < 4*sizeof(vec_names)/sizeof(vec_names[0]))
++      if (fp->ptregs.vector < sizeof(vec_names)/sizeof(vec_names[0]))
+               printk(KERN_WARNING "*** %s ***   FORMAT=%X\n",
+-                      vec_names[(fp->ptregs.vector) >> 2],
++                      vec_names[fp->ptregs.vector],
+                       fp->ptregs.format);
+       else
+               printk(KERN_WARNING "*** Exception %d ***   FORMAT=%X\n",
+-                      (fp->ptregs.vector) >> 2,
++                      fp->ptregs.vector,
+                       fp->ptregs.format);
+       printk(KERN_WARNING "Current process id is %d\n", current->pid);
+       die_if_kernel("BAD KERNEL TRAP", &fp->ptregs, 0);
+@@ -306,7 +307,7 @@ asmlinkage void trap_c(struct frame *fp)
+       siginfo_t info;
+       if (fp->ptregs.sr & PS_S) {
+-              if ((fp->ptregs.vector >> 2) == VEC_TRACE) {
++              if (fp->ptregs.vector == VEC_TRACE) {
+                       /* traced a trapping instruction */
+                       current->ptrace |= PT_DTRACE;
+               } else
+@@ -315,7 +316,7 @@ asmlinkage void trap_c(struct frame *fp)
+       }
+       /* send the appropriate signal to the user program */
+-      switch ((fp->ptregs.vector) >> 2) {
++      switch (fp->ptregs.vector) {
+       case VEC_ADDRERR:
+               info.si_code = BUS_ADRALN;
+               sig = SIGBUS;
diff --git a/target/linux/coldfire/patches/075-mcfv4e_watchdog.patch b/target/linux/coldfire/patches/075-mcfv4e_watchdog.patch
new file mode 100644 (file)
index 0000000..5b865bd
--- /dev/null
@@ -0,0 +1,265 @@
+From 3c6c80a04d6ca99c4f9fbb5e4f279bd644b2df48 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 8 Jul 2008 14:10:46 -0600
+Subject: [PATCH] Add Coldfire Watchdog support.
+
+LTIBName: mcfv4e-watchdog
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ drivers/watchdog/Kconfig   |    9 ++
+ drivers/watchdog/Makefile  |    1 +
+ drivers/watchdog/mcf_wdt.c |  220 ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 230 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/watchdog/mcf_wdt.c
+
+--- a/drivers/watchdog/Kconfig
++++ b/drivers/watchdog/Kconfig
+@@ -672,6 +672,15 @@ config TXX9_WDT
+ # PARISC Architecture
++# ColdFire Architecture
++
++config COLDFIRE_WATCHDOG
++      tristate "ColdFire watchdog support"
++      depends on WATCHDOG
++      help
++        To compile this driver as a module, choose M here: the
++        module will be called softdog.
++
+ # POWERPC Architecture
+ config MPC5200_WDT
+--- a/drivers/watchdog/Makefile
++++ b/drivers/watchdog/Makefile
+@@ -86,6 +86,7 @@ obj-$(CONFIG_SBC_EPX_C3_WATCHDOG) += sbc
+ # M32R Architecture
+ # M68K Architecture
++obj-$(CONFIG_COLDFIRE_WATCHDOG) += mcf_wdt.o
+ # M68KNOMMU Architecture
+--- /dev/null
++++ b/drivers/watchdog/mcf_wdt.c
+@@ -0,0 +1,220 @@
++/*
++ * drivers/watchdog/mcf_wdt.c
++ *
++ * Watchdog driver for ColdFire processors
++ *
++ * Adapted from the IXP4xx watchdog driver.
++ * The original version carries these notices:
++ *
++ * Author: Deepak Saxena <dsaxena@plexity.net>
++ *
++ * Copyright 2004 (c) MontaVista, Software, Inc.
++ * Based on sa1100 driver, Copyright (C) 2000 Oleg Drokin <green@crimea.edu>
++ *
++ * 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.
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/fs.h>
++#include <linux/miscdevice.h>
++#include <linux/watchdog.h>
++#include <linux/init.h>
++#include <linux/bitops.h>
++
++#include <asm-m68k/uaccess.h>
++#include <asm-m68k/coldfire.h>
++#include <asm-m68k/m5485gpt.h>
++
++static int nowayout;
++static unsigned int heartbeat = 30;   /* (secs) Default is 0.5 minute */
++static unsigned long wdt_status;
++
++#define       WDT_IN_USE              0
++#define       WDT_OK_TO_CLOSE         1
++
++static unsigned long wdt_tick_rate;
++
++static void
++wdt_enable(void)
++{
++      MCF_GPT_GMS0 = 0;
++      MCF_GPT_GCIR0 =  MCF_GPT_GCIR_PRE(heartbeat*wdt_tick_rate) |
++                              MCF_GPT_GCIR_CNT(0xffff);
++      MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS_WDEN |
++                              MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS_GPIO;
++}
++
++static void
++wdt_disable(void)
++{
++      MCF_GPT_GMS0 = 0;
++}
++
++static void
++wdt_keepalive(void)
++{
++      MCF_GPT_GMS0 = MCF_GPT_GMS_OCPW(0xA5) | MCF_GPT_GMS0;
++}
++
++static int
++mcf_wdt_open(struct inode *inode, struct file *file)
++{
++      if (test_and_set_bit(WDT_IN_USE, &wdt_status))
++              return -EBUSY;
++
++      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
++
++      wdt_enable();
++
++      return nonseekable_open(inode, file);
++}
++
++static ssize_t
++mcf_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos)
++{
++      if (len) {
++              if (!nowayout) {
++                      size_t i;
++
++                      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
++
++                      for (i = 0; i != len; i++) {
++                              char c;
++
++                              if (get_user(c, data + i))
++                                      return -EFAULT;
++                              if (c == 'V')
++                                      set_bit(WDT_OK_TO_CLOSE, &wdt_status);
++                      }
++              }
++              wdt_keepalive();
++      }
++
++      return len;
++}
++
++
++static struct watchdog_info ident = {
++      .options        = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT |
++                              WDIOF_KEEPALIVEPING,
++      .identity       = "Coldfire Watchdog",
++};
++
++static int
++mcf_wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
++                      unsigned long arg)
++{
++      int ret = -ENOIOCTLCMD;
++      int time;
++
++      switch (cmd) {
++      case WDIOC_GETSUPPORT:
++              ret = copy_to_user((struct watchdog_info *)arg, &ident,
++                                 sizeof(ident)) ? -EFAULT : 0;
++              break;
++
++      case WDIOC_GETSTATUS:
++              ret = put_user(0, (int *)arg);
++              break;
++
++      case WDIOC_GETBOOTSTATUS:
++              ret = put_user(0, (int *)arg);
++              break;
++
++      case WDIOC_SETTIMEOUT:
++              ret = get_user(time, (int *)arg);
++              if (ret)
++                      break;
++
++              if (time <= 0 || time > 30) {
++                      ret = -EINVAL;
++                      break;
++              }
++
++              heartbeat = time;
++              wdt_enable();
++              /* Fall through */
++
++      case WDIOC_GETTIMEOUT:
++              ret = put_user(heartbeat, (int *)arg);
++              break;
++
++      case WDIOC_KEEPALIVE:
++              wdt_keepalive();
++              ret = 0;
++              break;
++      }
++
++      return ret;
++}
++
++static int
++mcf_wdt_release(struct inode *inode, struct file *file)
++{
++      if (test_bit(WDT_OK_TO_CLOSE, &wdt_status)) {
++              wdt_disable();
++      } else {
++              printk(KERN_CRIT "WATCHDOG: Device closed unexpectdly - "
++                                      "timer will not stop\n");
++      }
++
++      clear_bit(WDT_IN_USE, &wdt_status);
++      clear_bit(WDT_OK_TO_CLOSE, &wdt_status);
++
++      return 0;
++}
++
++
++static struct file_operations mcf_wdt_fops = {
++      .owner          = THIS_MODULE,
++      .llseek         = no_llseek,
++      .write          = mcf_wdt_write,
++      .ioctl          = mcf_wdt_ioctl,
++      .open           = mcf_wdt_open,
++      .release        = mcf_wdt_release,
++};
++
++static struct miscdevice mcf_wdt_miscdev = {
++      .minor          = WATCHDOG_MINOR,
++      .name           = "watchdog",
++      .fops           = &mcf_wdt_fops,
++};
++
++static int __init mcf_wdt_init(void)
++{
++      wdt_tick_rate = MCF_BUSCLK/0xffff;
++#ifdef CONFIG_WATCHDOG_NOWAYOUT
++      nowayout = 1;
++#else
++      nowayout = 0;
++#endif
++      printk("ColdFire watchdog driver is loaded.\n");
++
++      return misc_register(&mcf_wdt_miscdev);
++}
++
++static void __exit mcf_wdt_exit(void)
++{
++      misc_deregister(&mcf_wdt_miscdev);
++}
++
++module_init(mcf_wdt_init);
++module_exit(mcf_wdt_exit);
++
++MODULE_AUTHOR("Deepak Saxena");
++MODULE_DESCRIPTION("ColdFire Watchdog");
++
++module_param(heartbeat, int, 0);
++MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds (default 60s)");
++
++module_param(nowayout, int, 0);
++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
++
++MODULE_LICENSE("GPL");
++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
++
diff --git a/target/linux/coldfire/patches/076-mcfv4e_irda.patch b/target/linux/coldfire/patches/076-mcfv4e_irda.patch
new file mode 100644 (file)
index 0000000..0452a47
--- /dev/null
@@ -0,0 +1,237 @@
+From 5f645d0668b469c4738fe1e9d3994287a519d0f3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 8 Jul 2008 15:57:47 -0600
+Subject: [PATCH] Add Coldfire IRDA support in serial driver.
+
+LTIBName: mcfv4e-irda
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Huan, Wang <b18965@freescale.com>
+---
+ drivers/serial/Kconfig     |    6 ++
+ drivers/serial/mcfserial.c |  110 ++++++++++++++++++++++++++++++++++++++++++--
+ net/irda/irlap.c           |    2 +-
+ 3 files changed, 113 insertions(+), 5 deletions(-)
+
+--- a/drivers/serial/Kconfig
++++ b/drivers/serial/Kconfig
+@@ -979,6 +979,12 @@ config SERIAL_COLDFIRE
+         This driver supports the built-in serial ports of the Motorola ColdFire
+         family of CPUs.
++config SERIAL_COLDFIRE_IRDA
++      bool "ColdFire IRDA support"
++      depends on SERIAL_COLDFIRE
++      help
++        This driver supports IRDA on the Motorola ColdFire.
++
+ config SERIAL_MCF
+       bool "Coldfire serial support (new style driver)"
+       depends on COLDFIRE
+--- a/drivers/serial/mcfserial.c
++++ b/drivers/serial/mcfserial.c
+@@ -109,6 +109,10 @@ static struct tty_driver *mcfrs_serial_d
+ #define       IRQBASE 73
+ #endif
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++#define SERIAL_IRDA_LINE (2)
++#endif
++
+ /*
+  *    Configuration table, UARTs to look for at startup.
+  */
+@@ -393,6 +397,9 @@ static inline void receive_chars(struct 
+ static inline void transmit_chars(struct mcf_serial *info)
+ {
+       volatile unsigned char  *uartp;
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      int i;
++#endif
+       uartp = info->addr;
+@@ -404,13 +411,36 @@ static inline void transmit_chars(struct
+       }
+       if ((info->xmit_cnt <= 0) || info->tty->stopped) {
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++              if (info->line == SERIAL_IRDA_LINE) {
++                      /* Enable receiver for IRDA */
++                      uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;
++                      /* reset RX */
++                      uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE | MCFUART_UCR_RXENABLE;
++              }
++#endif
+               info->imr &= ~MCFUART_UIR_TXREADY;
+               uartp[MCFUART_UIMR] = info->imr;
+               return;
+       }
+       while (uartp[MCFUART_USR] & MCFUART_USR_TXREADY) {
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++              if (info->line == SERIAL_IRDA_LINE) {
++                      while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY));
++                      i = 0;
++                      /* delay for settle */
++#if defined(CONFIG_M548X)
++                      udelay(1);
++#elif defined(CONFIG_M547X)
++                      udelay(2);
++#else
++                      while (i++ < 25000) udelay(1);
++#endif
++              }
++#endif
+               uartp[MCFUART_UTB] = info->xmit_buf[info->xmit_tail++];
++
+               info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1);
+               info->stats.tx++;
+               if (--info->xmit_cnt <= 0)
+@@ -567,6 +597,28 @@ static int startup(struct mcf_serial * i
+        */
+       mcfrs_change_speed(info);
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      if (info->line == SERIAL_IRDA_LINE) {
++              /* Put PSC in IrDA mode */
++              MCF_PSC_SICR(info->line) = MCF_PSC_SICR_SIM_SIR;
++
++              /* Set pulse width to 1.6 uS */
++              MCF_PSC_IRSDR(info->line) = (uint8_t)
++                                          (16 * (CONFIG_MCFCLK / 10000000));
++              MCF_PSC_IRCR1(info->line) = MCF_PSC_IRCR1_SPUL;
++              MCF_PSC_IRCR2(info->line) = 0;
++
++              /* Enable RTS to send */
++              MCF_PSC_OPSET(info->line) = MCF_PSC_OPSET_RTS;
++
++              /* Setup FIFO Alarms */
++              MCF_PSC_RFAR(info->line) = MCF_PSC_RFAR_ALARM(248);
++              MCF_PSC_TFAR(info->line) = MCF_PSC_TFAR_ALARM(248);
++
++              MCF_PSC_RFCR(info->line) = MCF_PSC_RFCR_FRMEN | MCF_PSC_RFCR_GR(4);
++              MCF_PSC_TFCR(info->line) = MCF_PSC_TFCR_FRMEN | MCF_PSC_RFCR_GR(4);
++      }
++#endif
+       /*
+        * Lastly enable the UART transmitter and receiver, and
+        * interrupt enables.
+@@ -588,10 +640,20 @@ static void shutdown(struct mcf_serial *
+ {
+       volatile unsigned char  *uartp;
+       unsigned long           flags;
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      unsigned long           delay_counter = 0;
++#endif
+       if (!(info->flags & ASYNC_INITIALIZED))
+               return;
+-
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      uartp = (volatile unsigned char *) info->addr;
++      while (!(uartp[MCFUART_USR] & MCFUART_USR_TXEMPTY)) {
++              if(delay_counter++ > 25000)
++                      break;
++              udelay(10);
++      }
++#endif
+ #ifdef SERIAL_DEBUG_OPEN
+       printk("Shutting down serial port %d (irq %d)....\n", info->line,
+              info->irq);
+@@ -820,10 +882,19 @@ static int mcfrs_write(struct tty_struct
+       local_irq_disable();
+       uartp = info->addr;
++
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      if (info->line == SERIAL_IRDA_LINE) {
++              /* Disable IRDA receiver*/
++              uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETRX;    /* reset RX */
++              uartp[MCFUART_UCR] = MCFUART_UCR_CMDRESETTX;    /* reset TX */
++
++              uartp[MCFUART_UCR] = MCFUART_UCR_TXENABLE;
++      }
++#endif
+       info->imr |= MCFUART_UIR_TXREADY;
+       uartp[MCFUART_UIMR] = info->imr;
+       local_irq_restore(flags);
+-
+       return total;
+ }
+@@ -884,9 +955,21 @@ static void mcfrs_throttle(struct tty_st
+       if (serial_paranoia_check(info, tty->name, "mcfrs_throttle"))
+               return;
+-      
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      if (I_IXOFF(tty)) {
++              /* Force STOP_CHAR (xoff) out */
++              volatile unsigned char  *uartp;
++              unsigned long           flags;
++              uartp = (volatile unsigned char *) info->addr;
++              local_irq_save(flags);
++              info->imr |= MCFUART_UIR_TXREADY;
++              uartp[MCFUART_UIMR] = info->imr;
++              local_irq_restore(flags);
++      }
++#else
+       if (I_IXOFF(tty))
+               info->x_char = STOP_CHAR(tty);
++#endif
+       /* Turn off RTS line (do this atomic) */
+ }
+@@ -907,8 +990,22 @@ static void mcfrs_unthrottle(struct tty_
+       if (I_IXOFF(tty)) {
+               if (info->x_char)
+                       info->x_char = 0;
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++              else {
++                      /* Force START_CHAR (xon) out */
++                      volatile unsigned char  *uartp;
++                      unsigned long           flags;
++                      info->x_char = START_CHAR(tty);
++                      uartp = (volatile unsigned char *) info->addr;
++                      local_irq_save(flags);
++                      info->imr |= MCFUART_UIR_TXREADY;
++                      uartp[MCFUART_UIMR] = info->imr;
++                      local_irq_restore(flags);
++              }
++#else
+               else
+                       info->x_char = START_CHAR(tty);
++#endif
+       }
+       /* Assert RTS line (do this atomic) */
+@@ -1156,12 +1253,17 @@ static int mcfrs_ioctl(struct tty_struct
+ static void mcfrs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
+ {
+       struct mcf_serial *info = (struct mcf_serial *)tty->driver_data;
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      int i = 0;      /* hush GCC */
++#endif
+       if (tty->termios->c_cflag == old_termios->c_cflag)
+               return;
++#ifdef CONFIG_SERIAL_COLDFIRE_IRDA
++      while (i++ < 35000) udelay(1);
++#endif
+       mcfrs_change_speed(info);
+-
+       if ((old_termios->c_cflag & CRTSCTS) &&
+           !(tty->termios->c_cflag & CRTSCTS)) {
+               tty->hw_stopped = 0;
+--- a/net/irda/irlap.c
++++ b/net/irda/irlap.c
+@@ -627,7 +627,7 @@ void irlap_status_indication(struct irla
+ {
+       switch (quality_of_link) {
+       case STATUS_NO_ACTIVITY:
+-              IRDA_MESSAGE("IrLAP, no activity on link!\n");
++              /* IRDA_MESSAGE("IrLAP, no activity on link!\n"); */
+               break;
+       case STATUS_NOISY:
+               IRDA_MESSAGE("IrLAP, noisy link!\n");
diff --git a/target/linux/coldfire/patches/077-mcfv4e_flexcan.patch b/target/linux/coldfire/patches/077-mcfv4e_flexcan.patch
new file mode 100644 (file)
index 0000000..ae7aefd
--- /dev/null
@@ -0,0 +1,1376 @@
+From c44de58d0972d05851512ba8cbd928b7adef5187 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 8 Jul 2008 17:11:33 -0600
+Subject: [PATCH] Add FlexCAN support.
+
+LTIBName: mcfv4e-flexcan
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Huan Wang <b18965@freescale.com>
+---
+ drivers/net/can/Kconfig               |   13 ++
+ drivers/net/can/Makefile              |    1 +
+ drivers/net/can/flexcan/Makefile      |    5 +
+ drivers/net/can/flexcan/flexcan.c     |  378 +++++++++++++++++++++++++++++++++
+ drivers/net/can/flexcan/flexcan.h     |  148 +++++++++++++
+ drivers/net/can/flexcan/mcf548x_can.c |  213 ++++++++++++++++++
+ include/asm-m68k/m5485sim.h           |    2 +
+ include/linux/can/dev.h               |   62 ++++++
+ include/linux/can/ioctl.h             |  152 +++++++++++++
+ include/linux/can/version.h           |   22 ++
+ net/can/Makefile                      |    3 +
+ net/can/dev.c                         |  292 +++++++++++++++++++++++++
+ 12 files changed, 1291 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/net/can/flexcan/Makefile
+ create mode 100644 drivers/net/can/flexcan/flexcan.c
+ create mode 100644 drivers/net/can/flexcan/flexcan.h
+ create mode 100644 drivers/net/can/flexcan/mcf548x_can.c
+ create mode 100644 include/linux/can/dev.h
+ create mode 100644 include/linux/can/ioctl.h
+ create mode 100644 include/linux/can/version.h
+ create mode 100644 net/can/dev.c
+
+--- a/drivers/net/can/Kconfig
++++ b/drivers/net/can/Kconfig
+@@ -12,6 +12,19 @@ config CAN_VCAN
+         This driver can also be built as a module.  If so, the module
+         will be called vcan.
++config CAN_FLEXCAN
++      tristate "Support for Freescale FLEXCAN based chips"
++      depends on CAN && (PPC || M68K || M68KNOMMU)
++      ---help---
++        Say Y here if you want to support for Freescale FlexCAN.
++
++config CAN_MCF547X_8X
++      tristate "Freescale MCF547X/MCF548X onboard CAN controller"
++      depends on CAN_FLEXCAN && (M547X || M548X)
++      ---help---
++        Say Y here if you want to support for Freescale MCF547x/MCF548x
++        onboard dualCAN controller.
++
+ config CAN_DEBUG_DEVICES
+       bool "CAN devices debugging messages"
+       depends on CAN
+--- a/drivers/net/can/Makefile
++++ b/drivers/net/can/Makefile
+@@ -3,3 +3,4 @@
+ #
+ obj-$(CONFIG_CAN_VCAN)                += vcan.o
++obj-$(CONFIG_CAN_FLEXCAN)     += flexcan/
+--- /dev/null
++++ b/drivers/net/can/flexcan/Makefile
+@@ -0,0 +1,5 @@
++
++obj-$(CONFIG_CAN_MCF547X_8X)  += flexcan-mcf548x.o
++
++flexcan-mcf548x-objs  := flexcan.o mcf548x_can.o
++
+--- /dev/null
++++ b/drivers/net/can/flexcan/flexcan.c
+@@ -0,0 +1,378 @@
++/*
++ * flexcan.c
++ *
++ * DESCRIPTION:
++ *  CAN bus driver for the alone generic (as possible as) FLEXCAN controller.
++ *
++ * AUTHOR:
++ *  Andrey Volkov <avolkov@varma-el.com>
++ *
++ * COPYRIGHT:
++ *  2005-2006, Varma Electronics Oy
++ *
++ * LICENCE:
++ *  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.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ *  HISTORY:
++ *    2008-06-23 Support for MCF548x's FlexCAN
++ *                    Huan, Wang <b18965@freescale.com>
++ */
++
++
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/delay.h>
++#include <linux/netdevice.h>
++#include <linux/if_arp.h>
++#include <linux/if_ether.h>
++#include <linux/can.h>
++#include <linux/list.h>
++#include <linux/io.h>
++
++#include <linux/can/dev.h>
++#include <linux/can/error.h>
++#include "flexcan.h"
++#include <asm/coldfire.h>
++#include <asm/m5485sim.h>
++#include <linux/can/version.h>        /* for RCSID. Removed by mkpatch script */
++RCSID("$Id$");
++
++struct flexcan_priv {
++      struct can_priv can;
++      volatile unsigned long flags;
++      u8 shadow_statflg;
++      u8 shadow_canrier;
++      u8 cur_pri;
++      u8 tx_active;
++
++      struct list_head tx_head;
++      struct napi_struct napi;
++      struct net_device *dev;
++};
++
++
++static int flexcan_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
++{
++      struct can_frame *frame = (struct can_frame *)skb->data;
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++      int i, len;
++      int txbuf = 0;
++      u32 can_id, can_ext, tmp, tmp1;
++
++      /* Transmission inactive */
++      regs->cantxfg[txbuf].can_dlc = MB_CNT_CODE(0x08);
++
++      can_ext = frame->can_id;
++      if (can_ext & CAN_EFF_FLAG) {
++              /* Frame format is extended */
++              regs->cantxfg[txbuf].can_dlc |= (1 << 21);
++              regs->cantxfg[txbuf].can_dlc |= (1 << 22);
++              can_id = frame->can_id & MB_ID_EXT;
++              if (frame->can_id & CAN_RTR_FLAG)
++                      regs->cantxfg[txbuf].can_dlc |= (1 << 20);
++
++              tmp = (can_id & CAN_SFF_MASK) << 18;
++              tmp1 = can_id >> 11;
++              can_id = tmp | tmp1;
++              regs->cantxfg[txbuf].can_id = can_id;
++      } else {
++              /* Frame format is standard */
++              can_id = frame->can_id & MB_ID_EXT;
++              if (frame->can_id & CAN_RTR_FLAG)
++                      regs->cantxfg[txbuf].can_dlc |= (1 << 20);
++
++              regs->cantxfg[txbuf].can_id = can_id << 18;
++      }
++
++      len = 8;
++      for (i = 0; i < len; i++)
++              regs->cantxfg[txbuf].data[i] = frame->data[i];
++
++      regs->cantxfg[txbuf].can_dlc |= len << 16;
++      /* Transmission active */
++      regs->cantxfg[txbuf].can_dlc |= MB_CNT_CODE(0x0c);
++      kfree_skb(skb);
++      return NETDEV_TX_OK;
++}
++
++static void flexcan_tx_timeout(struct net_device *dev)
++{
++      struct sk_buff *skb;
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++      struct can_frame *frame;
++      int length = 8;
++
++      /* Diable the interrupts */
++      regs->imask = IMASK_BUFF_DISABLE_ALL;
++
++      skb = dev_alloc_skb(sizeof(struct can_frame));
++      if (!skb) {
++              if (printk_ratelimit())
++                      dev_notice(ND2D(dev), "TIMEOUT packet dropped.\n");
++              return;
++      }
++      frame = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
++
++      frame->can_dlc = length;
++
++      skb->dev = dev;
++      skb->protocol = __constant_htons(ETH_P_CAN);
++      skb->pkt_type = PACKET_BROADCAST;
++      skb->ip_summed = CHECKSUM_UNNECESSARY;
++
++      netif_rx(skb);
++}
++
++static irqreturn_t flexcan_isr(int irq, void *dev_id)
++{
++      struct net_device *dev = (struct net_device *)dev_id;
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++      struct net_device_stats *stats = dev->get_stats(dev);
++      struct sk_buff *skb;
++      struct can_frame *frame;
++      u32 iflags, oflags;
++      int i, k;
++      int retval = 1;
++
++      iflags = regs->iflag;
++      oflags = iflags;
++      for (i = 0; i < 16; i++) {
++              if (iflags & (0x01 << i)) {
++                      struct flexcan_mb *mb = &regs->cantxfg[i];
++                      int ctrl = mb->can_dlc;
++                      int code = (ctrl >> 24) & 0x0f;
++                      int length = (ctrl >> 16) & 0x0f;
++                      u32 tmp, tmp1;
++
++                      if (code < 8 && (length > 0)) {
++                              /* receive frame */
++                              skb = dev_alloc_skb(sizeof(struct can_frame));
++                              if (!skb)
++                                      dev_notice(ND2D(dev),
++                                                      "Packets dropped.\n");
++                              skb->dev = dev;
++                              frame = (struct can_frame *)skb_put(skb,
++                                              sizeof(struct can_frame));
++
++                              frame->can_id &= 0x0;
++                              frame->can_dlc = length;
++                              tmp1 = mb->can_id & MB_ID_EXT;
++                              if (ctrl & MB_CNT_IDE) {
++                                      tmp = tmp1;
++                                      tmp = (tmp >> 18) & CAN_SFF_MASK;
++                                      frame->can_id = (tmp1 << 11) | tmp;
++                                      frame->can_id &= CAN_EFF_MASK;
++                                      frame->can_id |= CAN_EFF_FLAG;
++                                      if (ctrl & MB_CNT_RTR)
++                                              frame->can_id |= CAN_RTR_FLAG;
++                              } else {
++                                      frame->can_id  = tmp1 >> 18;
++                                      if (ctrl & MB_CNT_RTR)
++                                              frame->can_id |= CAN_RTR_FLAG;
++                              }
++
++                              for (k = 0; k < 8; k++)
++                                      frame->data[k] = mb->data[k];
++
++                              mb->can_dlc &= MB_CODE_MASK;
++                              mb->can_dlc |= MB_CNT_CODE(0x04);
++
++                              stats->rx_packets++;
++                              stats->rx_bytes += frame->can_dlc;
++                              skb->dev = dev;
++                              skb->protocol = __constant_htons(ETH_P_CAN);
++                              skb->ip_summed = CHECKSUM_UNNECESSARY;
++
++                              retval = netif_rx(skb);
++                              if (retval == NET_RX_DROP)
++                                      dev_notice(ND2D(dev),
++                                                      "Packets dropped.\n");
++                      } else {
++                              /* transmit frame */
++                              mb->can_dlc = MB_CNT_CODE(0x04);
++                      }
++              }
++      }
++      regs->iflag = oflags;
++
++      return IRQ_HANDLED;
++}
++
++static int flexcan_do_set_bit_time(struct net_device *dev,
++                               struct can_bittime *bt)
++{
++      struct flexcan_priv *priv = netdev_priv(dev);
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++      int ret = 0;
++      u32 reg;
++
++      if (bt->type != CAN_BITTIME_STD)
++              return -EINVAL;
++
++      spin_lock_irq(&priv->can.irq_lock);
++
++      reg = CANCTRL_PRESDIV(bt->std.brp) | CANCTRL_PSEG1(bt->std.phase_seg1
++                      - 1) | CANCTRL_PSEG2(bt->std.phase_seg2 - 1);
++      regs->canctrl &= CANCTRL_BITTIME;
++      regs->canctrl |= (reg | CANCTRL_SAMP(bt->std.sam) |
++              CANCTRL_PROPSEG(bt->std.prop_seg - 1));
++
++      spin_unlock_irq(&priv->can.irq_lock);
++      return ret;
++}
++
++
++static int flexcan_open(struct net_device *dev)
++{
++      int ret, i, j;
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++
++#if defined(CONFIG_M547X_8X)
++      MCF_PAR_TIMER = MCF_PAR_TIMER | 0x28;
++      MCF_PAR_TIMER = MCF_PAR_TIMER & 0xf8;
++      MCF_PAR_DSPI = MCF_PAR_DSPI | 0x0a00;
++      MCF_PAR_FECI2CIRQ = MCF_PAR_FECI2CIRQ | 0x0283;
++      MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) & 0x0f;
++      MCF_PAR_PSCn(2) = MCF_PAR_PSCn(2) | 0x50;
++#endif
++
++      regs->canmcr |= CANMCR_SOFTRST;
++      regs->canmcr |= CANMCR_MDIS;
++      udelay(10);
++
++      if ((regs->canmcr & CANMCR_SOFTRST) != 0x0) {
++              dev_err(ND2D(dev), "Failed to softreset can module.\n");
++              return -1;
++      }
++
++      /* Enable error and bus off interrupt */
++      regs->canctrl |= (CANCTRL_RJW(3) | CANCTRL_ERRMSK |
++                      CANCTRL_BOFFMSK);
++
++      /* Set lowest buffer transmitted first */
++      regs->canctrl |= CANCTRL_LBUF;
++
++      for (i = 0; i < 16; i++) {
++              regs->cantxfg[i].can_dlc = 0;
++              regs->cantxfg[i].can_id = 0;
++              for (j = 0; j < 8; j++)
++                      regs->cantxfg[i].data[j] = 0;
++
++              /* Put MB into rx queue */
++              regs->cantxfg[i].can_dlc = MB_CNT_CODE(0x04);
++      }
++
++      /* acceptance mask/acceptance code (accept everything) */
++      regs->rxgmask = 0x00000000;
++      regs->rx14mask = 0x00000000;
++      regs->rx15mask = 0x00000000;
++      /* extended frame */
++      regs->cantxfg[14].can_dlc |= 0x600000;
++      /* Enable flexcan module */
++      regs->canmcr &= ~CANMCR_MDIS;
++      /* Synchronize with the can bus */
++      regs->canmcr &= ~CANMCR_HALT;
++
++#if defined(CONFIG_M547X_8X)
++      for (i = 0; i < 2; i++) {
++              MCF_ICR(ISC_CANn_MBOR(i)) = 0x33;
++              MCF_ICR(ISC_CANn_ERR(i)) = 0x33;
++              MCF_ICR(ISC_CANn_BUSOFF(i)) = 0x33;
++      }
++
++      ret = request_irq(dev->irq + 64, flexcan_isr, IRQF_DISABLED,
++                      dev->name, dev);
++      ret = request_irq(dev->irq + 1 + 64, flexcan_isr, IRQF_DISABLED,
++                      dev->name, dev);
++      ret = request_irq(dev->irq + 2 + 64, flexcan_isr, IRQF_DISABLED,
++                      dev->name, dev);
++      if (ret < 0) {
++              printk(KERN_ERR "%s - failed to attach interrupt.\n",
++                     dev->name);
++              return ret;
++      }
++#endif
++
++      /* Enable all interrupts */
++      regs->imask = IMASK_BUFF_ENABLE_ALL;
++      netif_start_queue(dev);
++      return 0;
++}
++
++static int flexcan_close(struct net_device *dev)
++{
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++
++      netif_stop_queue(dev);
++
++      /* Disable all interrupts */
++      regs->imask = IMASK_BUFF_DISABLE_ALL;
++      free_irq(dev->irq + 64, dev);
++      free_irq(dev->irq + 1 + 64, dev);
++      free_irq(dev->irq + 2 + 64, dev);
++
++      /* Disable module */
++      regs->canmcr |= CANMCR_MDIS;
++      return 0;
++}
++
++int register_flexcandev(struct net_device *dev, int clock_src)
++{
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++
++      regs->canmcr &= ~CANMCR_MDIS;
++      udelay(100);
++      regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT);
++      return register_netdev(dev);
++}
++EXPORT_SYMBOL(register_flexcandev);
++
++void unregister_flexcandev(struct net_device *dev)
++{
++      struct flexcan_regs *regs = (struct flexcan_regs *)dev->base_addr;
++
++      regs->canmcr |= (CANMCR_FRZ | CANMCR_HALT);
++      regs->canmcr |= CANMCR_MDIS;
++
++      unregister_netdev(dev);
++}
++EXPORT_SYMBOL(unregister_flexcandev);
++
++struct net_device *alloc_flexcandev(void)
++{
++      struct net_device *dev;
++      struct flexcan_priv *priv;
++
++      dev = alloc_candev(sizeof(struct flexcan_priv));
++      if (!dev)
++              return NULL;
++
++      priv = netdev_priv(dev);
++      priv->dev = dev;
++      dev->open = flexcan_open;
++      dev->stop = flexcan_close;
++      dev->hard_start_xmit = flexcan_hard_start_xmit;
++      dev->tx_timeout = flexcan_tx_timeout;
++      dev->flags |= IFF_NOARP;
++      priv->can.do_set_bit_time = flexcan_do_set_bit_time;
++      return dev;
++}
++EXPORT_SYMBOL(alloc_flexcandev);
++
++MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
++MODULE_LICENSE("GPL v2");
++MODULE_DESCRIPTION("CAN port driver for flexcan based chip");
+--- /dev/null
++++ b/drivers/net/can/flexcan/flexcan.h
+@@ -0,0 +1,148 @@
++/*
++ * flexcan.h
++ *
++ * DESCRIPTION:
++ *  Definitions of consts/structs to drive the Freescale FLEXCAN.
++ *
++ */
++
++#ifndef __FLEXCAN_H__
++#define __FLEXCAN_H__
++
++#include <linux/autoconf.h>
++#include <linux/types.h>
++
++/* FLEXCAN module configuration register (CANMCR) bits */
++#define CANMCR_MDIS                           0x80000000
++#define CANMCR_FRZ                            0x40000000
++#define CANMCR_HALT                           0x10000000
++#define CANMCR_SOFTRST                                0x02000000
++#define CANMCR_FRZACK                         0x01000000
++#define CANMCR_SUPV                           0x00800000
++#define CANMCR_MAXMB(x)                               ((x)&0x0f)
++
++/* FLEXCAN control register (CANCTRL) bits */
++#define CANCTRL_PRESDIV(x)                    (((x)&0xff)<<24)
++#define CANCTRL_RJW(x)                                (((x)&0x03)<<22)
++#define CANCTRL_PSEG1(x)                      (((x)&0x07)<<19)
++#define CANCTRL_PSEG2(x)                      (((x)&0x07)<<16)
++#define CANCTRL_BOFFMSK                               0x00008000
++#define CANCTRL_ERRMSK                                0x00004000
++#define CANCTRL_LPB                           0x00001000
++#define CANCTRL_SAMP(x)                               (((x)&0x1)<<7)
++#define CANCTRL_BOFFREC                               0x00000040
++#define CANCTRL_TSYNC                         0x00000020
++#define CANCTRL_LBUF                          0x00000010
++#define CANCTRL_LOM                           0x00000008
++#define CANCTRL_PROPSEG(x)                    ((x)&0x07)
++#define CANCTRL_BITTIME                               0x00c0d078
++
++/* FLEXCAN error counter register (ERRCNT) bits */
++#define ERRCNT_REXECTR(x)                     (((x)&0xff)<<8)
++#define ERRCNT_TXECTR(x)                      ((x)&0xff)
++
++/* FLEXCAN error and status register (ERRSTAT) bits */
++#define ERRSTAT_BITERR(x)                     (((x)&0x03)<<14)
++#define ERRSTAT_ACKERR                                0x00002000
++#define ERRSTAT_CRCERR                                0x00001000
++#define ERRSTAT_FRMERR                                0x00000800
++#define ERRSTAT_STFERR                                0x00000400
++#define ERRSTAT_TXWRN                         0x00000200
++#define ERRSTAT_RXWRN                         0x00000100
++#define ERRSTAT_IDLE                          0x00000080
++#define ERRSTAT_TXRX                          0x00000040
++#define ERRSTAT_FLTCONF(x)                    (((x)&0x03)<<4)
++#define ERRSTAT_BOFFINT                               0x00000004
++#define ERRSTAT_ERRINT                        0x00000002
++
++/* FLEXCAN interrupt mask register (IMASK) bits */
++#define IMASK_BUF15M                          0x8000
++#define IMASK_BUF14M                          0x4000
++#define IMASK_BUF13M                          0x2000
++#define IMASK_BUF12M                          0x1000
++#define IMASK_BUF11M                          0x0800
++#define IMASK_BUF10M                          0x0400
++#define IMASK_BUF9M                           0x0200
++#define IMASK_BUF8M                           0x0100
++#define IMASK_BUF7M                           0x0080
++#define IMASK_BUF6M                           0x0040
++#define IMASK_BUF5M                           0x0020
++#define IMASK_BUF4M                           0x0010
++#define IMASK_BUF3M                           0x0008
++#define IMASK_BUF2M                           0x0004
++#define IMASK_BUF1M                           0x0002
++#define IMASK_BUF0M                           0x0001
++#define IMASK_BUFnM(x)                                (0x1<<(x))
++#define IMASK_BUFF_ENABLE_ALL                 0xffff
++#define IMASK_BUFF_DISABLE_ALL                        0x0000
++
++/* FLEXCAN interrupt flag register (IFLAG) bits */
++#define IFLAG_BUF15M                          0x8000
++#define IFLAG_BUF14M                          0x4000
++#define IFLAG_BUF13M                          0x2000
++#define IFLAG_BUF12M                          0x1000
++#define IFLAG_BUF11M                          0x0800
++#define IFLAG_BUF10M                          0x0400
++#define IFLAG_BUF9M                           0x0200
++#define IFLAG_BUF8M                           0x0100
++#define IFLAG_BUF7M                           0x0080
++#define IFLAG_BUF6M                           0x0040
++#define IFLAG_BUF5M                           0x0020
++#define IFLAG_BUF4M                           0x0010
++#define IFLAG_BUF3M                           0x0008
++#define IFLAG_BUF2M                           0x0004
++#define IFLAG_BUF1M                           0x0002
++#define IFLAG_BUF0M                           0x0001
++#define IFLAG_BUFnM(x)                                (0x1<<(x))
++#define IFLAG_BUFF_SET_ALL                    0xffff
++#define IFLAG_BUFF_DISABLE_ALL                        0x0000
++
++/* FLEXCAN message buffers */
++#define MB_CNT_CODE(x)                                (((x)&0x0f)<<24)
++#define MB_CNT_SRR                            0x00400000
++#define MB_CNT_IDE                            0x00200000
++#define MB_CNT_RTR                            0x00100000
++#define MB_CNT_LENGTH(x)                      (((x)&0x0f)<<16)
++#define MB_CNT_TIMESTAMP(x)                   ((x)&0xffff)
++
++#define MB_ID_STD                             ((0x7ff)<<18)
++#define MB_ID_EXT                             0x1fffffff
++#define MB_CODE_MASK                          0xf0ffffff
++
++/* Structure of the message buffer */
++struct flexcan_mb {
++      u32     can_dlc;
++      u32     can_id;
++      u8      data[8];
++};
++
++/* Structure of the hardware registers */
++struct flexcan_regs {
++      u32     canmcr;
++      u32     canctrl;
++      u32     timer;
++      u32     reserved1;
++      u32     rxgmask;
++      u32     rx14mask;
++      u32     rx15mask;
++      u32     errcnt;
++      u32     errstat;
++      u32     reserved2;
++      u32     imask;
++      u32     reserved3;
++      u32     iflag;
++      u32     reserved4[19];
++      struct  flexcan_mb cantxfg[16];
++};
++
++struct flexcan_platform_data {
++      u8 clock_src;           /* FLEXCAN clock source CRIN or SYSCLK */
++      u32 clock_frq;          /* can ref. clock, in Hz */
++};
++
++struct net_device *alloc_flexcandev(void);
++
++extern int register_flexcandev(struct net_device *dev, int clock_src);
++extern void unregister_flexcandev(struct net_device *dev);
++
++#endif                                /* __FLEXCAN_H__ */
+--- /dev/null
++++ b/drivers/net/can/flexcan/mcf548x_can.c
+@@ -0,0 +1,213 @@
++/*
++ * DESCRIPTION:
++ *  CAN bus driver for the Freescale MCF548x embedded CPU.
++ *
++ * AUTHOR:
++ *  Andrey Volkov <avolkov@varma-el.com>
++ *
++ * COPYRIGHT:
++ *  2004-2005, Varma Electronics Oy
++ *
++ * LICENCE:
++ *  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.
++ *
++ *  This program is distributed in the hope that it will be useful,
++ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *  GNU General Public License for more details.
++ *
++ *  You should have received a copy of the GNU General Public License
++ *  along with this program; if not, write to the Free Software
++ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ * HISTORY:
++ *    2008-06-23 support for MCF548x's FlexCAN
++ *            Huan, Wang  <b18965@freescale.com>
++ *    2005-02-03 created
++ *
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/netdevice.h>
++#include <linux/can.h>
++#include <linux/can/dev.h>
++#include <linux/io.h>
++
++#include "flexcan.h"
++#include <asm/coldfire.h>
++#include <asm/m5485sim.h>
++#include <linux/can/version.h>        /* for RCSID. Removed by mkpatch script */
++
++RCSID("$Id$");
++
++#define PDEV_MAX 2
++
++struct platform_device *pdev[PDEV_MAX];
++
++static int __devinit mcf548x_can_probe(struct platform_device *pdev)
++{
++      struct resource *mem;
++      struct net_device *dev;
++      struct flexcan_platform_data *pdata = pdev->dev.platform_data;
++      struct can_priv *can;
++      u32 mem_size;
++      int ret = -ENODEV;
++
++      if (!pdata)
++              return ret;
++
++      dev = alloc_flexcandev();
++      if (!dev)
++              return -ENOMEM;
++      can = netdev_priv(dev);
++
++      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++
++      dev->irq = platform_get_irq(pdev, 0);
++      if (!mem || !dev->irq)
++              goto req_error;
++
++      mem_size = mem->end - mem->start + 1;
++      if (!request_mem_region(mem->start, mem_size, pdev->dev.driver->name)) {
++              dev_err(&pdev->dev, "resource unavailable\n");
++              goto req_error;
++      }
++      SET_NETDEV_DEV(dev, &pdev->dev);
++
++      dev->base_addr = (unsigned long)ioremap_nocache(mem->start, mem_size);
++      if (!dev->base_addr) {
++              dev_err(&pdev->dev, "failed to map can port\n");
++              ret = -ENOMEM;
++              goto fail_map;
++      }
++      can->can_sys_clock = pdata->clock_frq;
++      platform_set_drvdata(pdev, dev);
++      ret = register_flexcandev(dev, pdata->clock_src);
++      if (ret >= 0) {
++              dev_info(&pdev->dev, "probe for port 0x%lX done\n",
++                       dev->base_addr);
++              return ret;
++      }
++
++      iounmap((unsigned long *)dev->base_addr);
++fail_map:
++      release_mem_region(mem->start, mem_size);
++req_error:
++      free_candev(dev);
++      dev_err(&pdev->dev, "probe failed\n");
++      return ret;
++}
++
++static int __devexit mcf548x_can_remove(struct platform_device *pdev)
++{
++      struct net_device *dev = platform_get_drvdata(pdev);
++      struct resource *mem;
++
++      platform_set_drvdata(pdev, NULL);
++      unregister_flexcandev(dev);
++      iounmap((unsigned long *)dev->base_addr);
++
++      mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      release_mem_region(mem->start, mem->end - mem->start + 1);
++      free_candev(dev);
++      return 0;
++}
++
++static struct platform_driver mcf548x_can_driver = {
++      .driver = {
++                 .name = "mcf548x-flexcan",
++                 },
++      .probe = mcf548x_can_probe,
++      .remove = __devexit_p(mcf548x_can_remove),
++};
++
++static struct resource mcf548x_can0_resources[] = {
++      [0] = {
++              .start          = MCF_MBAR + 0x0000A000,
++              .end            = MCF_MBAR + 0x0000A7FF,
++              .flags          = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start          = 49,
++              .end            = 49,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct resource mcf548x_can1_resources[] = {
++      [0] = {
++              .start          = MCF_MBAR + 0x0000A800,
++              .end            = MCF_MBAR + 0x0000AFFF,
++              .flags          = IORESOURCE_MEM,
++      },
++      [1] = {
++              .start          = 55,
++              .end            = 55,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++
++static int __init mcf548x_of_to_pdev(void)
++{
++      unsigned int i;
++      int err = -ENODEV;
++      struct flexcan_platform_data pdata;
++
++      pdev[0] = platform_device_register_simple("mcf548x-flexcan", 0,
++                      mcf548x_can0_resources, 2);
++      if (IS_ERR(pdev[0])) {
++              err = PTR_ERR(pdev[0]);
++              return err;
++      }
++      pdev[1] = platform_device_register_simple("mcf548x-flexcan", 1,
++                      mcf548x_can1_resources, 2);
++      if (IS_ERR(pdev[1])) {
++              err = PTR_ERR(pdev[1]);
++              return err;
++      }
++
++      /* FlexCAN clock */
++      pdata.clock_frq = 100000000;
++
++      for (i = 0; i < PDEV_MAX; i++) {
++              err = platform_device_add_data(pdev[i], &pdata, sizeof(pdata));
++              if (err)
++                      return err;
++      }
++      return err;
++}
++
++int __init mcf548x_can_init(void)
++{
++      int err = mcf548x_of_to_pdev();
++
++      if (err) {
++              printk(KERN_ERR "%s init failed with err=%d\n",
++                      mcf548x_can_driver.driver.name, err);
++              return err;
++      }
++
++      return platform_driver_register(&mcf548x_can_driver);
++}
++
++void __exit mcf548x_can_exit(void)
++{
++      int i;
++      platform_driver_unregister(&mcf548x_can_driver);
++      for (i = 0; i < PDEV_MAX; i++)
++              platform_device_unregister(pdev[i]);
++}
++
++module_init(mcf548x_can_init);
++module_exit(mcf548x_can_exit);
++
++MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");
++MODULE_DESCRIPTION("Freescale MCF548x CAN driver");
++MODULE_LICENSE("GPL v2");
+--- a/include/asm-m68k/m5485sim.h
++++ b/include/asm-m68k/m5485sim.h
+@@ -186,6 +186,8 @@
+ #define MCF_PAR_PCIBR            MCF_REG16(0x000A4A)
+ #define MCF_PAR_PSCn(x)            MCF_REG08(0x000A4F-((x)&0x3))
+ #define MCF_PAR_FECI2CIRQ        MCF_REG16(0x000A44)
++#define MCF_PAR_DSPI               MCF_REG16(0x000A50)
++#define MCF_PAR_TIMER              MCF_REG08(0X000A52)
+ #define MCF_EPPAR                MCF_REG16(0x000F00)
+ #define MCF_EPIER                MCF_REG08(0x000F05)
+ #define MCF_EPFR                         MCF_REG08(0x000F0C)
+--- /dev/null
++++ b/include/linux/can/dev.h
+@@ -0,0 +1,62 @@
++/*
++ * linux/can/dev.h
++ *
++ * Definitions for CAN controller network devices lib (work in progress)
++ *
++ * * * $Id$
++ *
++ * Author: Andrey Volkov <avolkov@varma-el.com>
++ * Copyright (c) 2006 Varma Electronics Oy
++ *
++ */
++
++#ifndef CAN_DEVICE_H
++#define CAN_DEVICE_H
++
++#include <linux/version.h>
++#include <linux/can/error.h>
++#include <linux/can/ioctl.h>
++
++struct can_priv {
++      struct can_device_stats can_stats;
++
++      /* can-bus oscillator frequency, in Hz,
++         BE CAREFUL! SOME CONTROLLERS (LIKE SJA1000)
++         FOOLISH ABOUT THIS FRQ (for sja1000 as ex. this
++         clock must be xtal clock divided by 2). */
++      u32     can_sys_clock;
++
++      /* by default max_brp is equal 64,
++         but for a Freescale TouCAN, as ex., it can be 255*/
++      u32     max_brp;
++      /* For the mostly all controllers, max_sjw is equal 4, but
++         some, hmm, CAN implementations hardwared it to 1 */
++      u8      max_sjw;
++
++      u32     baudrate;       /* in bauds */
++      struct can_bittime      bit_time;
++
++      spinlock_t irq_lock;
++      /* Please hold this lock when touching net_stats/can_stats*/
++      spinlock_t stats_lock;
++
++      can_state_t state;
++      can_mode_t  mode;
++      can_ctrlmode_t ctrlmode;
++
++      int (*do_set_bit_time)(struct net_device *dev, struct can_bittime *br);
++      int (*do_get_state)   (struct net_device *dev, can_state_t *state);
++      int (*do_set_mode)    (struct net_device *dev, can_mode_t mode);
++      int (*do_set_ctrlmode)(struct net_device *dev, can_ctrlmode_t ctrlmode);
++      int (*do_get_ctrlmode)(struct net_device *dev, can_ctrlmode_t *ctrlmode);
++};
++
++#define ND2D(_ndev)           (_ndev->dev.parent)
++
++struct net_device *alloc_candev(int sizeof_priv);
++void free_candev(struct net_device *dev);
++
++int can_calc_bit_time(struct can_priv *can, u32 baudrate,
++                    struct can_bittime_std *bit_time);
++
++#endif /* CAN_DEVICE_H */
+--- /dev/null
++++ b/include/linux/can/ioctl.h
+@@ -0,0 +1,152 @@
++/*
++ * linux/can/ioctl.h
++ *
++ * Definitions for CAN controller setup (work in progress)
++ *
++ * $Id$
++ *
++ * Send feedback to <socketcan-users@lists.berlios.de>
++ *
++ */
++
++#ifndef CAN_IOCTL_H
++#define CAN_IOCTL_H
++
++#include <linux/sockios.h>
++
++
++/* max. 16 private ioctls */
++
++#define SIOCSCANBAUDRATE      (SIOCDEVPRIVATE+0)
++#define SIOCGCANBAUDRATE      (SIOCDEVPRIVATE+1)
++
++#define SIOCSCANCUSTOMBITTIME   (SIOCDEVPRIVATE+2)
++#define SIOCGCANCUSTOMBITTIME   (SIOCDEVPRIVATE+3)
++
++#define SIOCSCANMODE          (SIOCDEVPRIVATE+4)
++#define SIOCGCANMODE          (SIOCDEVPRIVATE+5)
++
++#define SIOCSCANCTRLMODE      (SIOCDEVPRIVATE+6)
++#define SIOCGCANCTRLMODE      (SIOCDEVPRIVATE+7)
++
++#define SIOCSCANFILTER                (SIOCDEVPRIVATE+8)
++#define SIOCGCANFILTER                (SIOCDEVPRIVATE+9)
++
++#define SIOCGCANSTATE         (SIOCDEVPRIVATE+10)
++#define SIOCGCANSTATS         (SIOCDEVPRIVATE+11)
++
++#define SIOCSCANERRORCONFIG   (SIOCDEVPRIVATE+12)
++#define SIOCGCANERRORCONFIG   (SIOCDEVPRIVATE+13)
++
++/* parameters for ioctls */
++
++/* SIOC[SG]CANBAUDRATE */
++/* baudrate for CAN-controller in bits per second. */
++/* 0 = Scan for baudrate (Autobaud) */
++
++typedef __u32 can_baudrate_t;
++
++
++/* SIOC[SG]CANCUSTOMBITTIME */
++
++typedef enum CAN_BITTIME_TYPE {
++      CAN_BITTIME_STD,
++      CAN_BITTIME_BTR
++} can_bittime_type_t;
++
++/* TSEG1 of controllers usually is a sum of synch_seg (always 1),
++ * prop_seg and phase_seg1, TSEG2 = phase_seg2 */
++
++struct can_bittime_std {
++      __u32 brp;        /* baud rate prescaler */
++      __u8  prop_seg;   /* from 1 to 8 */
++      __u8  phase_seg1; /* from 1 to 8 */
++      __u8  phase_seg2; /* from 1 to 8 */
++      __u8  sjw:7;      /* from 1 to 4 */
++      __u8  sam:1;      /* 1 - enable triple sampling */
++};
++
++struct can_bittime_btr {
++      __u8  btr0;
++      __u8  btr1;
++};
++
++struct can_bittime {
++      can_bittime_type_t type;
++      union {
++              struct can_bittime_std std;
++              struct can_bittime_btr btr;
++      };
++};
++
++#define CAN_BAUDRATE_UNCONFIGURED     ((__u32) 0xFFFFFFFFU)
++#define CAN_BAUDRATE_UNKNOWN          0
++
++/* SIOC[SG]CANMODE */
++
++typedef __u32 can_mode_t;
++
++#define CAN_MODE_STOP 0
++#define CAN_MODE_START        1
++#define CAN_MODE_SLEEP        2
++
++
++/* SIOC[SG]CANCTRLMODE */
++
++typedef __u32 can_ctrlmode_t;
++
++#define CAN_CTRLMODE_LOOPBACK   0x1
++#define CAN_CTRLMODE_LISTENONLY 0x2
++
++
++/* SIOCGCANFILTER */
++
++typedef __u32 can_filter_t;
++
++/* filter modes (may vary due to controller specific capabilities) */
++#define CAN_FILTER_CAPAB       0  /* get filter type capabilities
++                                   (32 Bit value) */
++#define CAN_FILTER_MASK_VALUE  1  /* easy bit filter (see struct can_filter) */
++#define CAN_FILTER_SFF_BITMASK 2  /* bitfield with 2048 bit SFF filter */
++                                /* filters 3 - 31 currently undefined */
++
++#define CAN_FILTER_MAX         31 /* max. filter type value */
++
++
++/* SIOCGCANSTATE */
++
++typedef __u32 can_state_t;
++
++#define CAN_STATE_ACTIVE              0
++#define CAN_STATE_BUS_WARNING         1
++#define CAN_STATE_BUS_PASSIVE         2
++#define CAN_STATE_BUS_OFF             3
++#define CAN_STATE_SCANNING_BAUDRATE   4
++#define CAN_STATE_STOPPED             5
++#define CAN_STATE_SLEEPING            6
++
++
++/* SIOCGCANSTATS */
++
++struct can_device_stats {
++      int error_warning;
++      int data_overrun;
++      int wakeup;
++      int bus_error;
++      int error_passive;
++      int arbitration_lost;
++      int restarts;
++      int bus_error_at_init;
++};
++
++/* SIOC[SG]CANERRORCONFIG */
++
++typedef enum CAN_ERRCFG_TYPE {
++      CAN_ERRCFG_MASK,
++      CAN_ERRCFG_BUSERR,
++      CAN_ERRCFG_BUSOFF
++} can_errcfg_type_t;
++
++/* tbd */
++
++#endif /* CAN_IOCTL_H */
+--- /dev/null
++++ b/include/linux/can/version.h
+@@ -0,0 +1,22 @@
++/*
++ * linux/can/version.h
++ *
++ * Version information for the CAN network layer implementation
++
++ * Author: Urs Thuermann   <urs.thuermann@volkswagen.de>
++ * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
++ * All rights reserved.
++ *
++ * Send feedback to <socketcan-users@lists.berlios.de>
++ *
++ */
++
++#ifndef CAN_VERSION_H
++#define CAN_VERSION_H
++
++#define RCSID(s) asm(".section .rodata.str1.1,\"aMS\",@progbits,1\n\t" \
++                   ".string \"" s "\"\n\t.previous\n")
++
++RCSID("$Id$");
++
++#endif /* CAN_VERSION_H */
+--- a/net/can/Makefile
++++ b/net/can/Makefile
+@@ -10,3 +10,6 @@ can-raw-objs         := raw.o
+ obj-$(CONFIG_CAN_BCM) += can-bcm.o
+ can-bcm-objs          := bcm.o
++
++obj-$(CONFIG_CAN)       += candev.o
++candev-objs             := dev.o
+--- /dev/null
++++ b/net/can/dev.c
+@@ -0,0 +1,292 @@
++/*
++ * $Id$
++ *
++ * Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
++ * Copyright (C) 2006 Andrey Volkov, Varma Electronics
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the version 2 of the GNU General Public License
++ * as published by the Free Software Foundation
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ */
++
++#include <linux/module.h>
++#include <linux/netdevice.h>
++#include <linux/if_arp.h>
++#include <linux/can.h>
++#include <linux/can/dev.h>
++
++MODULE_DESCRIPTION("CAN netdevice library");
++MODULE_LICENSE("GPL v2");
++MODULE_AUTHOR("Marc Kleine-Budde <mkl@pengutronix.de>, "
++            "Andrey Volkov <avolkov@varma-el.com>");
++
++/*
++ Abstract:
++      Baud rate calculated with next formula:
++      baud = frq/(brp*(1 + prop_seg+ phase_seg1 + phase_seg2))
++
++      This calc function based on work of Florian Hartwich and Armin Bassemi
++      "The Configuration of the CAN Bit Timing"
++      (http://www.semiconductors.bosch.de/pdf/CiA99Paper.pdf)
++
++ Parameters:
++  [in]
++    bit_time_nsec - expected bit time in nanosecs
++
++  [out]
++      bit_time        - calculated time segments, for meaning of
++                        each field read CAN standard.
++*/
++
++#define DEFAULT_MAX_BRP                       64U
++#define DEFAULT_MAX_SJW                       4U
++
++/* All below values in tq units */
++#define MAX_BIT_TIME  25U
++#define MIN_BIT_TIME  8U
++#define MAX_PROP_SEG  8U
++#define MAX_PHASE_SEG1        8U
++#define MAX_PHASE_SEG2        8U
++
++int can_calc_bit_time(struct can_priv *can, u32 baudrate,
++                    struct can_bittime_std *bit_time)
++{
++      int best_error  = -1; /* Ariphmetic error */
++      int df, best_df = -1; /* oscillator's tolerance range */
++      u32 quanta;           /*in tq units*/
++      u32 brp, phase_seg1, phase_seg2, sjw, prop_seg;
++      u32 brp_min, brp_max, brp_expected;
++      u64 tmp;
++
++      /* baudrate range [1baud,1Mbaud] */
++      if (baudrate == 0 || baudrate > 1000000UL)
++              return -EINVAL;
++
++      tmp = (u64)can->can_sys_clock*1000;
++      do_div(tmp, baudrate);
++      brp_expected = (u32)tmp;
++
++      brp_min = brp_expected / (1000 * MAX_BIT_TIME);
++      if (brp_min == 0)
++              brp_min = 1;
++      if (brp_min > can->max_brp)
++              return -ERANGE;
++
++      brp_max = (brp_expected + 500 * MIN_BIT_TIME) / (1000 * MIN_BIT_TIME);
++      if (brp_max == 0)
++              brp_max = 1;
++      if (brp_max > can->max_brp)
++              brp_max = can->max_brp;
++
++      for (brp = brp_min; brp <= brp_max; brp++) {
++              quanta = brp_expected / (brp * 1000);
++              if (quanta < MAX_BIT_TIME && quanta * brp * 1000 !=
++                              brp_expected)
++                      quanta++;
++              if (quanta < MIN_BIT_TIME || quanta > MAX_BIT_TIME)
++                      continue;
++
++              phase_seg2 = min((quanta - 3) / 2, MAX_PHASE_SEG2);
++              for (sjw = can->max_sjw; sjw > 0; sjw--) {
++                      for (; phase_seg2 > sjw; phase_seg2--) {
++                              u32 err1, err2;
++                              phase_seg1 = phase_seg2 % 2 ?
++                                      phase_seg2-1 : phase_seg2;
++                              prop_seg = quanta-1 - phase_seg2 - phase_seg1;
++                              /*
++                               * FIXME: support of longer lines
++                               * (i.e. bigger prop_seg) is more prefered
++                               * than support of cheap oscillators
++                               * (i.e. bigger df/phase_seg1/phase_seg2)
++                               * */
++
++                              if (prop_seg < phase_seg1)
++                                              continue;
++                              if (prop_seg > MAX_PROP_SEG)
++                                              goto next_brp;
++
++                              err1 = phase_seg1 * brp * 500 * 1000 /
++                                      (13 * brp_expected - phase_seg2 *
++                                       brp * 1000);
++                              err2 = sjw * brp * 50 * 1000 / brp_expected;
++
++                              df = min(err1, err2);
++                              if (df >= best_df) {
++                                      unsigned error = abs(brp_expected * 10 /
++                                                      (brp * (1 + prop_seg +
++                                                              phase_seg1 +
++                                                              phase_seg2)) - 10000);
++
++                                      if (error > 10 || error > best_error)
++                                              continue;
++
++                                      if (error == best_error && prop_seg <
++                                                      bit_time->prop_seg)
++                                              continue;
++
++                                      best_error = error;
++                                      best_df = df;
++                                      bit_time->brp = brp;
++                                      bit_time->prop_seg = prop_seg;
++                                      bit_time->phase_seg1 = phase_seg1;
++                                      bit_time->phase_seg2 = phase_seg2;
++                                      bit_time->sjw = sjw;
++                                      bit_time->sam =
++                                              (bit_time->phase_seg1 > 3);
++                              }
++                      }
++              }
++next_brp:     ;
++      }
++
++      if (best_error < 0)
++              return -EDOM;
++      return 0;
++}
++EXPORT_SYMBOL(can_calc_bit_time);
++
++static int can_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
++{
++      struct can_priv *can = netdev_priv(dev);
++      struct can_bittime *bt = (struct can_bittime *)&ifr->ifr_ifru;
++      ulong *baudrate = (ulong *)&ifr->ifr_ifru;
++      int ret = -EOPNOTSUPP;
++
++      dev_dbg(ND2D(dev), "(%s) 0x%08x %p\n", __func__, cmd, &ifr->ifr_ifru);
++
++      switch (cmd) {
++      case SIOCSCANBAUDRATE:
++              if (can->do_set_bit_time) {
++                      struct can_bittime bit_time;
++                      ret = can_calc_bit_time(can, *baudrate, &bit_time.std);
++                      if (ret != 0)
++                              break;
++                      bit_time.type = CAN_BITTIME_STD;
++                      ret = can->do_set_bit_time(dev, &bit_time);
++                      if (!ret) {
++                              can->baudrate = *baudrate;
++                              can->bit_time = bit_time;
++                      }
++              }
++              break;
++      case SIOCGCANBAUDRATE:
++              *baudrate = can->baudrate;
++              ret = 0;
++              break;
++      case SIOCSCANCUSTOMBITTIME:
++              if (can->do_set_bit_time) {
++                      ret = can->do_set_bit_time(dev, bt);
++                      if (!ret) {
++                              can->bit_time = *bt;
++                              if (bt->type == CAN_BITTIME_STD && bt->std.brp) {
++                                      can->baudrate = can->can_sys_clock /
++                                              (bt->std.brp * (1 + bt->std.prop_seg +
++                                                              bt->std.phase_seg1 +
++                                                              bt->std.phase_seg2));
++                              } else
++                                      can->baudrate = CAN_BAUDRATE_UNKNOWN;
++                      }
++              }
++              break;
++      case SIOCGCANCUSTOMBITTIME:
++              *bt = can->bit_time;
++              ret = 0;
++              break;
++      case SIOCSCANMODE:
++              if (can->do_set_mode) {
++                      can_mode_t mode =
++                              *((can_mode_t *)(&ifr->ifr_ifru));
++                      if (mode == CAN_MODE_START &&
++                          can->baudrate == CAN_BAUDRATE_UNCONFIGURED) {
++                              dev_info(ND2D(dev), "Impossible to start \
++                                              on UNKNOWN speed\n");
++                              ret = EINVAL;
++                      } else
++                              return can->do_set_mode(dev, mode);
++              }
++              break;
++      case SIOCGCANMODE:
++              *((can_mode_t *)(&ifr->ifr_ifru)) = can->mode;
++              ret = 0;
++              break;
++      case SIOCSCANCTRLMODE:
++              if (can->do_set_ctrlmode) {
++                      can_ctrlmode_t ctrlmode =
++                              *((can_ctrlmode_t *)(&ifr->ifr_ifru));
++                      return can->do_set_ctrlmode(dev, ctrlmode);
++              }
++              break;
++      case SIOCGCANCTRLMODE:
++              *((can_ctrlmode_t *)(&ifr->ifr_ifru)) = can->ctrlmode;
++              ret = 0;
++              break;
++      case SIOCSCANFILTER:
++              break;
++      case SIOCGCANFILTER:
++              break;
++      case SIOCGCANSTATE:
++              if (can->do_get_state)
++                      return can->do_get_state(dev,
++                                      (can_state_t *)(&ifr->ifr_ifru));
++              break;
++      case SIOCGCANSTATS:
++              *((struct can_device_stats *)(&ifr->ifr_ifru)) = can->can_stats;
++              ret = 0;
++              break;
++      }
++
++      return ret;
++}
++
++static void can_setup(struct net_device *dev)
++{
++      dev->type            = ARPHRD_CAN;
++      dev->mtu             = sizeof(struct can_frame);
++      dev->do_ioctl        = can_ioctl;
++      dev->hard_header_len = 0;
++      dev->addr_len        = 0;
++      dev->tx_queue_len    = 10;
++
++      /* New-style flags. */
++      dev->flags           = IFF_NOARP;
++      dev->features        = NETIF_F_NO_CSUM;
++}
++
++/*
++ * Function  alloc_candev
++ *    Allocates and sets up an CAN device
++ */
++struct net_device *alloc_candev(int sizeof_priv)
++{
++      struct net_device *dev;
++      struct can_priv *priv;
++
++      dev = alloc_netdev(sizeof_priv, "can%d", can_setup);
++      if (!dev)
++              return NULL;
++
++      priv = netdev_priv(dev);
++
++      priv->baudrate = CAN_BAUDRATE_UNCONFIGURED;
++      priv->max_brp  = DEFAULT_MAX_BRP;
++      priv->max_sjw  = DEFAULT_MAX_SJW;
++      spin_lock_init(&priv->irq_lock);
++
++      return dev;
++}
++EXPORT_SYMBOL(alloc_candev);
++
++void free_candev(struct net_device *dev)
++{
++      free_netdev(dev);
++}
++EXPORT_SYMBOL(free_candev);
diff --git a/target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch b/target/linux/coldfire/patches/078-m547x_8x_pci_initial.patch
new file mode 100644 (file)
index 0000000..b311773
--- /dev/null
@@ -0,0 +1,2623 @@
+From 7f92b68c12c1891435c75f7f83a6390b4c73eaa6 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 10 Jul 2008 19:17:11 -0600
+Subject: [PATCH] Add PCI to m547x/m548x.
+
+LTIBName: m547x-8x-pci-initial
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+---
+ arch/m68k/Kconfig                 |    4 +-
+ arch/m68k/coldfire/Makefile       |    7 +-
+ arch/m68k/coldfire/ints.c         |    8 +-
+ arch/m68k/coldfire/mcf548x-pci.c  |  934 +++++++++++++++++++++++++++++++++++++
+ arch/m68k/kernel/Makefile         |    3 +
+ arch/m68k/kernel/bios32_mcf548x.c |  631 +++++++++++++++++++++++++
+ arch/m68k/kernel/dma.c            |   32 +-
+ arch/m68k/mm/kmap.c               |   11 +-
+ drivers/pci/access.c              |   16 +-
+ drivers/usb/host/Makefile         |    2 +-
+ include/asm-m68k/5445x_pci.h      |   94 ++++
+ include/asm-m68k/548x_pci.h       |   99 ++++
+ include/asm-m68k/io.h             |   65 +++-
+ include/asm-m68k/m5485pci.h       |  330 +++++++++++++
+ include/asm-m68k/pci.h            |   96 +----
+ include/asm-m68k/raw_io.h         |   26 +
+ include/asm-m68k/virtconvert.h    |    5 +
+ include/linux/pci.h               |    2 +
+ 18 files changed, 2250 insertions(+), 115 deletions(-)
+ create mode 100644 arch/m68k/coldfire/mcf548x-pci.c
+ create mode 100644 arch/m68k/kernel/bios32_mcf548x.c
+ create mode 100644 include/asm-m68k/5445x_pci.h
+ create mode 100644 include/asm-m68k/548x_pci.h
+ create mode 100644 include/asm-m68k/m5485pci.h
+
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -175,8 +175,8 @@ config HADES
+         to use this kernel on a Hades, say Y here; otherwise say N.
+ config PCI
+-      bool
+-      depends on HADES || M54455
++      bool "PCI bus support"
++      depends on HADES || M54455 || M547X_8X
+       default n
+       help
+         Find out whether you have a PCI motherboard. PCI is the name of a
+--- a/arch/m68k/coldfire/Makefile
++++ b/arch/m68k/coldfire/Makefile
+@@ -3,12 +3,17 @@
+ #
+ obj-y:= entry.o config.o cache.o signal.o muldi3.o traps.o ints.o
+-
++ifdef CONFIG_M5445X
+ ifneq ($(strip $(CONFIG_USB) $(CONFIG_USB_GADGET_MCF5445X)),)
+       obj-y   += usb.o usb/
+ endif
++endif
++ifdef CONFIG_M547X_8X
++obj-$(CONFIG_PCI)       += mcf548x-pci.o
++else
+ obj-$(CONFIG_PCI)     += pci.o mcf5445x-pci.o iomap.o
++endif
+ obj-$(CONFIG_M5445X)  += mcf5445x-devices.o
+ obj-$(CONFIG_M547X_8X)        += m547x_8x-devices.o
+ obj-$(CONFIG_M547X_8X)        += mcf548x-devices.o
+--- a/arch/m68k/coldfire/ints.c
++++ b/arch/m68k/coldfire/ints.c
+@@ -192,6 +192,8 @@ int setup_irq(unsigned int irq, struct i
+               /* Can't share interrupts unless both agree to */
+               if (!((*prev)->flags & node->flags & IRQF_SHARED)) {
+                       spin_unlock_irqrestore(&contr->lock, flags);
++                      printk(KERN_INFO "%s: -BUSY-Incorrect IRQ %d \n",
++                              __FUNCTION__, irq);
+                       return -EBUSY;
+               }
+               while (*prev)
+@@ -219,9 +221,11 @@ int request_irq(unsigned int irq,
+       struct irq_node *node = get_irq_node();
+       int res;
+-      if (!node)
++      if (!node) {
++              printk(KERN_INFO "%s:get_irq_node error %x\n",
++                      __FUNCTION__,(unsigned int) node);
+               return -ENOMEM;
+-
++      }
+       node->handler = handler;
+       node->flags   = flags;
+       node->dev_id  = dev_id;
+--- /dev/null
++++ b/arch/m68k/coldfire/mcf548x-pci.c
+@@ -0,0 +1,934 @@
++/*
++ *    ColdFire 547x/548x PCI Host Controller functions
++ */
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/init.h>
++#include <linux/mm.h>
++#include <linux/string.h>
++#include <linux/pci.h>
++#include <linux/ioport.h>
++#include <linux/slab.h>
++#include <linux/version.h>
++#include <linux/interrupt.h>
++
++#include <linux/dma-mapping.h>
++#include <asm/coldfire.h>
++#include <asm/io.h>
++#include <asm/m5485sim.h>
++#include <asm/m5485pci.h>
++#include <asm/irq.h>
++#include <asm/pci.h>
++#include <asm/virtconvert.h>
++
++
++#undef DEBUG
++//#define DEBUG
++
++#ifdef DEBUG
++//#define DBG(x...) printk(KERN_DEBUG x)
++#define DBG(x...) printk(x)
++#else
++#define DBG(x...)
++#endif
++
++#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,75))
++# define irqreturn_t void
++# define IRQ_HANDLED
++# define IRQ_NONE
++#endif
++
++/*
++ *  Bridge configration dafaults
++ */
++#define PCI_RETRIES   0
++#define PCI_CACHE_LINE        8
++#define PCI_MINGNT    1
++#define PCI_MAXLAT    42
++
++
++/*
++ *  Initiator windows setting
++ */
++#define HOST_MEM_BASE         0xD0000000      /* ColdFire Memory window base  */
++#define PCI_MEM_BASE          0xD0000000      /* PCI Memory window base       */
++#define PCI_MEM_SIZE          0x08000000      /* Memory window size (128M)    */
++#define HOST_IO_BASE          0xD8000000      /* ColdFire I/O window base     */
++#define PCI_IO_BASE_ADDR      0x00000000      /* PCI I/O window base          */
++#define PCI_IO_SIZE           0x00010000      /* I/O window size (64K)        */
++#define HOST_CFG_BASE         0xD8000000      /* ColdFire config window base  */
++#define HOST_DMA_BASE          CONFIG_SDRAM_BASE      /* ColdFire PCI-DMA window base */
++#define PCI_HDR_BASE          (MCF_MBAR+0xB00)/* ColdFire config registers    */
++
++#define PCI_MEM_MASK          (PCI_MEM_SIZE-1)
++#define PCI_IO_MASK           (PCI_IO_SIZE-1)
++
++/* Macro to set initiator window */
++#define WxBAR(host_address, pci_address, size)        \
++      (((host_address)  & 0xff000000)      |  \
++      ((((size)-1) & 0xff000000) >> 8)     |  \
++      ((pci_address) & 0xff000000) >> 16)
++
++/*
++ *  BIOS internal data
++ */
++static u8 revision;           /* controller revision */
++
++/*
++ *    Board specific setting
++ */
++const unsigned int irq_lines[] = { 5, 7 };
++
++#define N_SLOTS       (sizeof(board_info) / sizeof(board_info[0]))
++#define N_IRQS                (sizeof(irq_lines)  / sizeof(irq_lines[0]))
++#define BRIDGE_SLOT   0
++
++const struct slotinfo {
++      unsigned char idsel;    /* device number     */
++      unsigned char irq;      /* external IRQ      */
++      unsigned char req;      /* REQ line number   */
++      unsigned char gnt;      /* GNT line number   */
++} board_info[] = {
++      {0,  0, 0, 0},          /* Bridge      */
++      {17, 5, 1, 1},          /* Slot #1     */
++      {18, 5, 2, 2},          /* Slot #2     */       
++      {20, 7, 3, 3},          /* Slot #3     */
++      {21, 7, 4, 4},          /* Slot #4     */
++};
++
++/************************************************************************/
++
++/*
++ * static int mk_conf_addr()
++ *
++ * Return type0 or type1 configuration address
++ * by the means of device address and PCI dword location
++ * 0 - for not existing slots
++ */
++static int mk_conf_addr(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where)
++{
++      int slot, func, address, idsel, dev_fn;
++
++      if (bus->number) {
++              address = MCF_PCICAR_E | (bus->number << 16) |
++                  (devfn << 8) | (where & 0xfc);
++      } else {
++              slot = PCI_SLOT(devfn);
++              if (slot > N_SLOTS || slot == BRIDGE_SLOT)
++                      return 0;
++              else {
++                      func = PCI_FUNC(devfn);
++                      idsel = board_info[slot].idsel;
++
++                      dev_fn = PCI_DEVFN(idsel, func);
++                      address = MCF_PCICAR_E | (bus->number << 16) |
++                          (dev_fn << 8) | (where & 0xfc);
++              }
++      }
++
++      return (address);
++}
++
++/*
++ * static int read_config_byte()
++ *
++ * Read a byte from configuration space of specified device
++ */
++static int read_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 *value)
++{
++      int slot;
++      int address;
++      int result;
++
++      *value = 0xff;
++      result = PCIBIOS_SUCCESSFUL;
++
++      slot = PCI_SLOT(devfn);
++      if (slot == BRIDGE_SLOT) {
++              if (where <= 0x40)
++                      *value = *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3));
++              else
++                      *value = 0;
++      } else {
++              address = mk_conf_addr(bus, devfn, where);
++              if (!address)
++                      result = PCIBIOS_DEVICE_NOT_FOUND;
++              else {
++                      MCF_PCICAR = address;
++                      *value = *(volatile u8 *) (HOST_CFG_BASE + (where & 3));
++              }
++      }
++      __asm__ __volatile__("nop");
++      __asm__ __volatile__("nop");
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: read_config_byte bus=%d, devfn=%d, addr=0x%02X, val=0x%02X, ret=%02X\n",
++          bus->number, devfn, where, *value, result);
++
++      return (result);
++}
++
++/*
++ * static int read_config_word()
++ *
++ * Read a word from configuration space of specified device
++ */
++static int read_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 *value)
++{
++      int slot;
++      int address;
++      int result;
++
++      *value = 0xffff;
++      result = PCIBIOS_SUCCESSFUL;
++
++      if (where & 0x1)
++              result = PCIBIOS_BAD_REGISTER_NUMBER;
++      else {
++              slot = PCI_SLOT(devfn);
++              if (slot == BRIDGE_SLOT) {
++                      if (where <= 0x3f)
++                              *value =
++                                  *(volatile u16 *) (PCI_HDR_BASE +
++                                                     (where ^ 2));
++                      else
++                              *value = 0;
++              } else {
++                      address = mk_conf_addr(bus, devfn, where);
++                      if (!address)
++                              result = PCIBIOS_DEVICE_NOT_FOUND;
++                      else {
++                              MCF_PCICAR = address;
++                              *value = le16_to_cpu(*(volatile u16 *)
++                                                   (HOST_CFG_BASE +
++                                                    (where & 2)));
++                      }
++              }
++      }
++        __asm__ __volatile__("nop");
++        __asm__ __volatile__("nop");
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: read_config_word bus=%d, devfn=%d, addr=0x%02X, val=0x%04X ret=%02X\n",
++          bus->number, devfn, where, *value, result);
++
++      return (result);
++}
++
++/*
++ * static int read_config_dword()
++ *
++ * Read a long word from configuration space of specified device
++ */
++static int read_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 *value)
++{
++      int slot;
++      int address;
++      int result;
++
++      *value = 0xffffffff;
++      result = PCIBIOS_SUCCESSFUL;
++
++      if (where & 0x3)
++              result = PCIBIOS_BAD_REGISTER_NUMBER;
++      else {
++              slot = PCI_SLOT(devfn);
++              if (slot == BRIDGE_SLOT) {
++                      if (where <= 0x3d)
++                              *value =
++                                  *(volatile u32 *) (PCI_HDR_BASE + where);
++                      else
++                              *value = 0;
++                      __asm__ __volatile__("nop");
++                      __asm__ __volatile__("nop");
++              } else {
++                      address = mk_conf_addr(bus, devfn, where);
++                      if (!address)
++                              result = PCIBIOS_DEVICE_NOT_FOUND;
++                      else {
++                              MCF_PCICAR = address;
++                              *value = le32_to_cpu(*(volatile u32 *)
++                                                   (HOST_CFG_BASE));
++                              __asm__ __volatile__("nop");
++                              __asm__ __volatile__("nop");
++                              if (bus->number != 0 && revision < 1) {
++                                      volatile u32 temp;
++
++                                      MCF_PCICAR |= 0xff0000;
++                                      temp = *(volatile u32 *) (HOST_CFG_BASE);
++                              }
++                      }
++              }
++      }
++
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: read_config_dword bus=%d, devfn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
++           bus->number, devfn, where, *value, result);
++
++      return (result);
++}
++
++/*
++ * static int write_config_byte()
++ *
++ * Write a byte to configuration space of specified device
++ */
++static int write_config_byte(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u8 value)
++{
++      int slot;
++      int address;
++      int result;
++
++      result = PCIBIOS_SUCCESSFUL;
++
++      slot = PCI_SLOT(devfn);
++      if (slot == BRIDGE_SLOT) {
++              if (where <= 0x40)
++                      *(volatile u8 *) (PCI_HDR_BASE + (where ^ 3)) = value;
++      } else {
++              address = mk_conf_addr(bus, devfn, where);
++              if (!address)
++                      result = PCIBIOS_DEVICE_NOT_FOUND;
++              else {
++                      MCF_PCICAR = address;
++                      *(volatile u8 *) (HOST_CFG_BASE + (where & 3)) = value;
++              }
++      }
++        __asm__ __volatile__("nop");
++        __asm__ __volatile__("nop");
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: write_config_byte bus=%d, devfn=%d, addr=0x%02X, value=0x%02X ret=%02X\n",
++           bus->number, devfn, where, value, result);
++
++      return (result);
++}
++
++/*
++ * static int write_config_word()
++ *
++ * Write a word to configuration space of specified device
++ */
++static int write_config_word(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u16 value)
++{
++      int slot;
++      int address;
++      int result;
++
++      result = PCIBIOS_SUCCESSFUL;
++
++      if (where & 0x1)
++              result = PCIBIOS_BAD_REGISTER_NUMBER;
++      else {
++              slot = PCI_SLOT(devfn);
++              if (slot == BRIDGE_SLOT) {
++                      if (where <= 0x3f)
++                              *(volatile u16 *) (PCI_HDR_BASE + (where ^ 2)) =
++                                  value;
++              } else {
++                      address = mk_conf_addr(bus, devfn, where);
++                      if (!address)
++                              result = PCIBIOS_DEVICE_NOT_FOUND;
++                      else {
++                              MCF_PCICAR = address;
++                              *(volatile u16 *) (HOST_CFG_BASE + (where & 2)) =
++                                  cpu_to_le16(value);
++                      }
++              }
++      }
++      __asm__ __volatile__("nop");
++        __asm__ __volatile__("nop");
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: write_config_word bus=%d, devfn=%d, addr=0x%02X, value=0x%04X ret=%02X\n",
++           bus->number, devfn, where, value, result);
++
++      return (result);
++}
++
++/*
++ * static int write_config_dword()
++ *
++ * Write a long word to configuration space of specified device
++ */
++static int write_config_dword(/*struct pci_dev *dev*/struct pci_bus *bus, unsigned int devfn, int where, u32 value)
++{
++      int slot;
++      int address;
++      int result;
++
++      result = PCIBIOS_SUCCESSFUL;
++
++      if (where & 0x3)
++              result = PCIBIOS_BAD_REGISTER_NUMBER;
++      else {
++              slot = PCI_SLOT(devfn);
++              if (slot == BRIDGE_SLOT) {
++                      if (where <= 0x3d)
++                              *(volatile u32 *) (PCI_HDR_BASE + where) =
++                                  value;
++              } else {
++                      address = mk_conf_addr(bus, devfn, where);
++                      if (!address)
++                              result = PCIBIOS_DEVICE_NOT_FOUND;
++                      else {
++                              MCF_PCICAR = address;
++                              *(volatile u32 *) (HOST_CFG_BASE) =
++                                  cpu_to_le32(value);
++                      }
++              }
++      }
++      __asm__ __volatile__("nop");
++        __asm__ __volatile__("nop");
++      MCF_PCICAR &= ~MCF_PCICAR_E;
++
++      DBG("PCI: write_config_dword dev=%d, fn=%d, addr=0x%02X, value=0x%08X ret=%02X\n",
++          PCI_SLOT(devfn), PCI_FUNC(devfn), where,  value, result);
++
++      return (result);
++}
++
++static int config_read(struct pci_bus *bus, unsigned int devfn,
++                     int where, int size, u32 * val)
++{
++      switch (size) {
++      case 1:
++              return read_config_byte(bus, devfn, where, (u8 *) val);
++      case 2:
++              return read_config_word(bus, devfn, where, (u16 *) val);
++      default:
++              return read_config_dword(bus, devfn, where, val);
++      }
++}
++
++static int config_write(struct pci_bus *bus, unsigned int devfn,
++                      int where, int size, u32 val)
++{
++      switch (size) {
++      case 1:
++              return write_config_byte(bus, devfn, where, (u8) val);
++      case 2:
++              return write_config_word(bus, devfn, where, (u16) val);
++      default:
++              return write_config_dword(bus, devfn, where, val);
++      }
++}
++
++/*
++ *  configuration routines entry points
++ */
++static struct pci_ops bus_ops = {
++      read:           config_read,
++      write:          config_write
++};
++
++/************************************************************************/
++
++/*
++ * u8 pci_inb()
++ *
++ * Read a byte at specified address from I/O space
++ */
++unsigned char pci_inb(long addr)
++{
++      char value;
++
++      value = *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      DBG("PCI: inb addr=0x%08X, value=0x%02X\n", addr, value);
++
++      return (unsigned char) value;
++}
++
++
++/*
++ * u16 pci_inw()
++ *
++ * Read a word at specified address from I/O space
++ */
++unsigned short pci_inw(long addr)
++{
++      short value;
++      volatile unsigned short *ptr;
++
++      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      value = le16_to_cpu(*ptr);
++
++      DBG("PCI: inw addr=0x%08X, value=0x%04X\n",  addr, value);
++      return (unsigned short) value;
++}
++
++/*
++ * u16 pci_raw_inw()
++ *
++ * Read a raw word at specified address from I/O space
++ */
++unsigned short pci_raw_inw(long addr)
++{
++      short value;
++      volatile unsigned short *ptr;
++
++      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      value = *ptr;
++
++      DBG("PCI: raw_inw addr=0x%08X, value=0x%04X\n",  addr, value);
++      return (unsigned short) value;
++}
++
++/*
++ * u32 pci_inl()
++ *
++ * Read a dword at specified address from I/O space
++ */
++unsigned long pci_inl(long addr)
++{
++      long value;
++      volatile unsigned long *ptr;
++
++      ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      value = le32_to_cpu(*ptr);
++
++      DBG("PCI: inl addr=0x%08X, value=0x%08X\n",  addr, value);
++      return (unsigned long) value;
++}
++
++/*
++ * u32 pci_raw_inl()
++ *
++ * Read a raw dword at specified address from I/O space
++ */
++unsigned long pci_raw_inl(long addr)
++{
++      long value;
++      volatile unsigned long *ptr;
++
++      ptr = (volatile unsigned long *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      value = *ptr;
++
++      DBG("PCI: raw_inl addr=0x%08X, value=0x%08X\n",  addr, value);
++      return (unsigned long) value;
++}
++
++/*
++ * void pci_outb()
++ *
++ * Write a byte value at specified address to I/O space
++ */
++void pci_outb( unsigned char value,  long addr)
++{
++
++      *(volatile unsigned char *) (HOST_IO_BASE | (addr & PCI_IO_MASK)) = value;
++      DBG("PCI: outb addr=0x%08X, value=0x%02X\n",  addr, value);
++}
++
++
++/*
++ * void pci_outw()
++ *
++ * Write a word value at specified address to I/O space
++ */
++void pci_outw(volatile unsigned short value, volatile  long addr)
++{
++      volatile unsigned short *ptr;
++
++      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      *ptr = cpu_to_le16(value);
++      DBG("PCI: outw addr=0x%08X, value=0x%04X\n",  addr, value);
++}
++
++/*
++ * void pci_raw_outw()
++ *
++ * Write a raw word value at specified address to I/O space
++ */
++void pci_raw_outw(volatile unsigned short value, volatile  long addr)
++{
++      volatile unsigned short *ptr;
++
++      ptr = (volatile unsigned short *) (HOST_IO_BASE | (addr & PCI_IO_MASK));
++      *ptr = value;
++      DBG("PCI: raw_outw addr=0x%08X, value=0x%04X\n",  addr, value);
++}
++
++/*
++ * void pci_outl()
++ *
++ * Write a long word value at specified address to I/O space
++ */
++void pci_outl(volatile unsigned long value, volatile long addr)
++{
++      volatile unsigned long *ptr;
++
++      ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
++      *ptr = cpu_to_le32(value);
++      DBG("PCI: outl addr=0x%08X, value=0x%08X\n", addr, value);
++}
++
++/*
++ * void pci_raw_outl()
++ *
++ * Write a raw long word value at specified address to I/O space
++ */
++void pci_raw_outl(volatile unsigned long value, volatile long addr)
++{
++      volatile unsigned long *ptr;
++
++      ptr = (volatile unsigned long *)(HOST_IO_BASE | (addr & PCI_IO_MASK));
++      *ptr = value;
++      DBG("PCI: raw_outl addr=0x%08X, value=0x%08X\n", addr, value);
++}
++
++/*
++ * void pci_insb()
++ *
++ * Read several byte values from specified I/O port
++ */
++void pci_insb(volatile unsigned char *addr, unsigned char *buf, int len)
++{
++      for (; len--; buf++)
++              *buf = pci_inb((unsigned long)addr);
++      DBG("PCI: pci_insb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++
++/*
++ * void pci_insw()
++ *
++ * Read several word values from specified I/O port
++ */
++void pci_insw(volatile unsigned short *addr, unsigned short *buf, int len)
++{
++      for (; len--; buf++)
++              *buf = pci_inw((unsigned long)addr);
++      DBG("PCI: pci_insw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++/*
++ * void pci_insl()
++ *
++ * Read several dword values from specified I/O port
++ */
++void pci_insl(volatile unsigned long *addr, unsigned long *buf, int len)
++{
++      for (; len--; buf++)
++              *buf = pci_inl((unsigned long)addr);
++      DBG("PCI: pci_insl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++/*
++ * void pci_outsb()
++ *
++ * Write several byte values to specified I/O port
++ */
++void pci_outsb(volatile unsigned char *addr, const unsigned char *buf, int len)
++{
++      for (; len--; buf++)
++              pci_outb((unsigned long)addr, *buf);
++      DBG("PCI: pci_outsb addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++/*
++ * void pci_outsw()
++ *
++ * Write several word values to specified I/O port
++ */
++void pci_outsw(volatile unsigned short *addr, const unsigned short *buf, int len)
++{
++      for (; len--; buf++)
++              pci_outw((unsigned long)addr, *buf);
++      DBG("PCI: pci_outsw addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++/*
++ * void pci_outsl()
++ *
++ * Write several dword values to specified I/O port
++ */
++void pci_outsl(volatile unsigned long *addr, const unsigned long *buf, int len)
++{
++      for (; len--; buf++)
++              pci_outl((unsigned long)addr, *buf);
++      DBG("PCI: pci_outsl addr=0x%08X, buf=%p, len=%d\n", addr, buf, len);
++}
++
++/*
++ * void pci_xlb_handler()
++ *
++ * PCI XLB interrupt handler
++ */
++irqreturn_t xlb_interrupt(int irq, void *dev)
++{
++      volatile int xlb_error = MCF_PCIISR;
++
++      /* Acknowlege interrupt */
++      MCF_PCIISR = xlb_error;
++
++      /* Dump interrupt reason */
++      if (xlb_error & MCF_PCIISR_RE)
++              DBG("PCI: Retry Error Received\n");
++              
++      if (xlb_error & MCF_PCIISR_IA)
++              DBG("PCI: Initiator Abort Received\n");
++              
++      if (xlb_error & MCF_PCIISR_TA)
++              DBG("PCI: Target Abort Received\n");
++
++      return IRQ_HANDLED;
++}
++
++
++/*
++ * void pci_arbiter_handler()
++ *
++ * PCI arbiter interrupt handler
++ */
++irqreturn_t arb_interrupt(int irq, void *dev)
++{
++      volatile unsigned long arb_error = MCF_PCIARB_PASR;
++
++      /* Acknowlege interrupt */
++      printk("%s\n",__FUNCTION__);
++      MCF_PCIARB_PASR = arb_error;
++
++      if (arb_error & MCF_PCIARB_PASR_ITLMBK) {
++              DBG("PCI: coldfire master time-out\n");                         
++                              
++              /* Set infinite  number of retries */                   
++              MCF_PCIICR &= ~0xFF;                            
++      }
++              
++      if (arb_error & MCF_PCIARB_PASR_EXTMBK(0x1F)) {
++              arb_error >>= 17;
++              DBG("PCI: external master time-out (mask = 0x%X)\n", arb_error);
++              
++              /* raise arbitration priority level */          
++              MCF_PCIARB_PACR = MCF_PCIARB_PACR_EXTMPRI(arb_error);
++      }
++
++      return IRQ_HANDLED;
++}
++
++
++/*
++ * void pci_eint_handler()
++ *
++ * Eport interrupt handler
++ */
++irqreturn_t eint_handler(int irq, void *dev)
++{
++      /* Just acknowlege interrupt and exit */
++      MCF_EPFR = 0x1 << (irq - 64);
++      return IRQ_HANDLED;
++}
++
++
++/*
++ * void __init coldfire_fixup(int pci_modify)
++ *
++ * Assign IRQ numbers as used by Linux to the interrupt pins
++ * of the PCI cards.
++ */
++static void __init coldfire_fixup(int pci_modify)
++{
++      struct pci_dev *dev;
++      unsigned char slot, pin;
++
++      DBG("%s\n",__FUNCTION__);
++#ifdef NL_ORIGINAL
++      pci_for_each_dev(dev) {
++#else
++      dev = NULL;
++      while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
++#endif
++              if (dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) {
++                      slot = PCI_SLOT(dev->devfn);
++                      dev->irq = 64 + board_info[slot].irq;
++
++                      /* Check if device needs interrupt */
++#ifdef NL_ORIGINAL
++                      pcibios_read_config_byte(
++                                  dev->bus->number, dev->devfn,
++                                  PCI_INTERRUPT_PIN, &pin);
++
++                      if ( pin ) {
++                              pcibios_write_config_byte(
++                                      dev->bus->number, dev->devfn,
++                                      PCI_INTERRUPT_LINE, dev->irq);
++                      }
++#else
++                      pci_read_config_byte(dev,
++                                  PCI_INTERRUPT_PIN, &pin);
++
++                      if ( pin ) {
++                              pci_write_config_byte(dev,
++                                      PCI_INTERRUPT_LINE, dev->irq);
++                      }
++#endif
++              }
++      }
++}
++
++static void __init configure_device(struct pci_dev *dev)
++{
++      /* TODO: This should depend from disable_pci_burst setting */
++      DBG("%s\n",__FUNCTION__);
++#ifdef NL_ORIGINAL
++      pcibios_write_config_byte(bus, devfn, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
++#else
++      pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, PCI_CACHE_LINE);
++#endif
++}
++
++struct pci_bus_info *__init init_coldfire_pci(void)
++{
++      static struct pci_bus_info bus;
++      int i;
++      int pci_mem_va;
++      static char irq_name[N_IRQS][15];
++
++      /* Get controller revision */
++      revision = MCF_PCICCRIR;
++      printk("ColdFire PCI Host Bridge (Rev. %d) detected:"
++              "MEMBase %x,MEMLen %x,IOBase %x,IOLen %x\n",
++              revision, HOST_MEM_BASE, PCI_MEM_SIZE - 1, 0, PCI_IO_SIZE - 1);
++
++      /* Setup bus info structure. */
++      memset(&bus, 0, sizeof (struct pci_bus_info));
++
++      /* Request intiator memory resource */
++      bus.mem_space.start = PCI_MEM_BASE;//HOST_MEM_BASE;
++      bus.mem_space.end = bus.mem_space.start + PCI_MEM_SIZE - 1;
++      bus.mem_space.name = "PCI Bus #0";
++      if (request_resource(&iomem_resource, &bus.mem_space) != 0)
++      {
++              printk("Failed to request bridge iomem resource\n");
++              return NULL;
++      }
++
++      /* Request intiator memory resource */
++      bus.io_space.start = 0;
++      bus.io_space.end = bus.io_space.start + PCI_IO_SIZE - 1;
++      bus.io_space.name =  "PCI Bus #0";
++      if (request_resource(&ioport_resource, &bus.io_space) != 0)
++      {
++              printk("Failed to request bridge ioport resource\n");
++              return NULL;
++      }
++
++      /* Set up the arbiter */
++      MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/
++                      | MCF_PCIARB_PACR_INTMPRI 
++                      | MCF_PCIARB_PACR_INTMINTEN 
++                      | MCF_PCIARB_PACR_EXTMPRI(0x1F) 
++                      | MCF_PCIARB_PACR_EXTMINTEN(0x1F);
++
++      /* GNT and REQ */
++      MCF_PAR_PCIBG = 0x3FF;
++      MCF_PAR_PCIBR = 0x3FF;
++
++      /* Enable bus mastering, memory access and MWI */
++      MCF_PCISCR = MCF_PCISCR_B | MCF_PCISCR_M | MCF_PCISCR_MW;
++
++      /* Setup burst parameters */
++      MCF_PCICR1 = MCF_PCICR1_LATTIMER(32) |
++                   MCF_PCICR1_CACHELINESIZE(PCI_CACHE_LINE);
++
++      MCF_PCICR2 = 0;
++      /*MCF_PCICR2_MINGNT(PCI_MINGNT) |
++              MCF_PCICR2_MAXLAT(PCI_MAXLAT);
++      */
++      /* Turn on error signaling */
++      MCF_PCIICR = MCF_PCIICR_TAE | MCF_PCIICR_IAE | PCI_RETRIES;
++      MCF_PCIGSCR |= MCF_PCIGSCR_SEE;
++      /*
++       * Configure Initiator Windows
++       * Window 0: 128M PCI Memory @ HOST_MEM_BASE, 1:1 mapping
++       * Window 1: 64K  I/O Memory @ HOST_IO_BASE,  1:0 mapping
++       */
++      MCF_PCIIW0BTAR = WxBAR(HOST_MEM_BASE, PCI_MEM_BASE, PCI_MEM_SIZE);
++      MCF_PCIIW1BTAR = WxBAR(HOST_IO_BASE,  PCI_IO_BASE_ADDR,  PCI_IO_SIZE);
++
++      MCF_PCIIWCR = MCF_PCIIWCR_WINCTRL1_IO |
++                    MCF_PCIIWCR_WINCTRL0_MEMRDLINE;
++
++      /* Target PCI DMA Windows */
++      MCF_PCIBAR1   = PCI_DMA_BASE;
++      MCF_PCITBATR1 = HOST_DMA_BASE | MCF_PCITBATR1_EN;
++        MCF_PCIBAR0   = MCF_RAMBAR0;;
++        MCF_PCITBATR0 = MCF_RAMBAR0 | MCF_PCITBATR0_EN;
++        DBG("PCI TCR %x,MCF_PCIBAR1 %x,MCF_PCITBATR1 %x."
++              "MCF_PCIBAR0 %x,MCF_PCITBATR9 %x\n", MCF_PCITCR, MCF_PCIBAR1,
++              MCF_PCITBATR1, MCF_PCIBAR0, MCF_PCITBATR0);
++      /* Enable internal PCI controller interrupts */
++      MCF_ICR(ISC_PCI_XLB) = ILP_PCI_XLB;
++      /*request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
++                      SA_INTERRUPT, "PCI XL Bus", (void*)-1);
++      enable_irq (64+ISC_PCI_XLB);
++      */
++        if(request_irq(64+ISC_PCI_XLB, xlb_interrupt, 
++                         IRQF_DISABLED, "PCI XL Bus", (void*)-1)){
++              printk("Cannot allocate ISC_PCI_XLB  IRQ\n");
++                return (struct pci_bus_info *)-EBUSY;
++      }
++
++      MCF_ICR(ISC_PCI_ARB) = ILP_PCI_ARB;
++      /*request_irq(64+ISC_PCI_ARB, arb_interrupt, 
++                      SA_INTERRUPT, "PCI Arbiter", (void*)-1);
++      enable_irq (64+ISC_PCI_ARB);
++      */
++        if(request_irq(64+ISC_PCI_ARB, arb_interrupt,
++                        IRQF_DISABLED, "PCI Arbiter", (void*)-1)){
++                printk("Cannot allocate ISC_PCI_ARB  IRQ\n");
++                return (struct pci_bus_info *)-EBUSY;
++        }
++
++      /* Set slots interrupt setting */
++      for (i = 0; i < N_IRQS; i++) 
++      {       
++              /* Set trailing edge for PCI interrupts */
++              MCF_EPPAR &= ~MCF_EPPAR_EPPA(irq_lines[i], 0x3);
++              if (irq_lines[i] == 5)
++                      MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  MCF_EPPAR_EPPAx_FALLING);
++              else
++                        MCF_EPPAR |= MCF_EPPAR_EPPA(irq_lines[i],  0/*MCF_EPPAR_EPPAx_FALLING*/);
++              /* Turn on irq line in eport */
++              MCF_EPIER |= MCF_EPIER_EPIE(irq_lines[i]);
++
++              /* Enable irq in gpio */
++              if (irq_lines[i] == 5)
++                  MCF_PAR_FECI2CIRQ |= 1;
++                  
++              if (irq_lines[i] == 6)
++                  MCF_PAR_FECI2CIRQ |= 2;   
++
++              /* Register external interrupt handlers */
++              sprintf(irq_name[i], "PCI IRQ%d", irq_lines[i]);
++              /*request_irq(64 + irq_lines[i], eint_handler, 
++                          SA_SHIRQ, irq_name[i], (void*)-1);
++              enable_irq(64 + irq_lines[i]);*/
++              if(request_irq(64 + irq_lines[i], eint_handler, 
++                              IRQF_SHARED, irq_name[i], (void*)-1)){
++                      printk("Cannot allocate irq_lines[%d] IRQ\n", irq_lines[i]);
++                      return (struct pci_bus_info *)-EBUSY;
++              }
++      }
++
++      /* Clear PCI Reset and wait for devices to reset */
++      MCF_PCIGSCR &= ~MCF_PCIGSCR_PR;
++      schedule_timeout((5 * HZ) / 10);
++      /* Remap initiator windows (should be 1:1 to the physical memory) */
++      pci_mem_va = (int) ioremap_nocache(HOST_MEM_BASE, PCI_MEM_SIZE + PCI_IO_SIZE);
++#if 1
++      printk("%s: MEMBase_phy %x, Virt %x, len %x\n",__FUNCTION__,
++              HOST_MEM_BASE,pci_mem_va,PCI_MEM_SIZE + PCI_IO_SIZE);
++#endif
++      BUG_ON(pci_mem_va != HOST_MEM_BASE);
++
++      /* Setup bios32 and pci bus driver callbacks */
++      bus.m68k_pci_ops = &bus_ops;
++      bus.fixup = coldfire_fixup;
++      bus.conf_device = configure_device;
++
++      return &bus;
++}
++
+--- a/arch/m68k/kernel/Makefile
++++ b/arch/m68k/kernel/Makefile
+@@ -12,6 +12,9 @@ ifndef CONFIG_COLDFIRE
+   obj-$(CONFIG_PCI) += bios32.o
+ else   # CONFIG_COLDFIRE
+   extra-y := ../coldfire/head.o vmlinux.lds
++ifdef CONFIG_M547X_8X
++  obj-$(CONFIG_PCI) += bios32_mcf548x.o
++endif
+ endif
+ endif
+--- /dev/null
++++ b/arch/m68k/kernel/bios32_mcf548x.c
+@@ -0,0 +1,631 @@
++/*
++ * bios32.c - PCI BIOS functions for m68k systems.
++ *
++ * Written by Wout Klaren.
++ *
++ * Based on the DEC Alpha bios32.c by Dave Rusling and David Mosberger.
++ */
++#include <linux/init.h>
++#include <linux/kernel.h>
++
++#if 0
++# define DBG_DEVS(args)               printk args
++#else
++# define DBG_DEVS(args)
++#endif
++
++#ifdef CONFIG_PCI
++
++/*
++ * PCI support for Linux/m68k. Currently only the Hades is supported.
++ *
++ * The support for PCI bridges in the DEC Alpha version has
++ * been removed in this version.
++ */
++
++#include <linux/pci.h>
++#include <linux/slab.h>
++#include <linux/mm.h>
++
++#include <asm/io.h>
++#include <asm/pci.h>
++#include <asm/uaccess.h>
++
++#define KB            1024
++#define MB            (1024*KB)
++#define GB            (1024*MB)
++
++#define MAJOR_REV     0
++#define MINOR_REV     5
++
++/*
++ * Align VAL to ALIGN, which must be a power of two.
++ */
++
++#define MAX(val1, val2)               (((val1) > (val2)) ? val1 : val2)
++
++/*
++ * Offsets relative to the I/O and memory base addresses from where resources
++ * are allocated.
++ */
++
++#ifdef CONFIG_COLDFIRE
++#define IO_ALLOC_OFFSET               0x00000100
++#define MEM_ALLOC_OFFSET      0x00000000
++#else /* CONFIG_COLDFIRE */
++#define IO_ALLOC_OFFSET               0x00004000
++#define MEM_ALLOC_OFFSET      0x04000000
++#endif /* CONFIG_COLDFIRE */
++
++/*
++ * Declarations of hardware specific initialisation functions.
++ */
++
++extern struct pci_bus_info *init_hades_pci(void);
++
++/*
++ * Bus info structure of the PCI bus. A pointer to this structure is
++ * put in the sysdata member of the pci_bus structure.
++ */
++
++static struct pci_bus_info *bus_info;
++
++static int pci_modify = 1;            /* If set, layout the PCI bus ourself. */
++static int skip_vga;                  /* If set do not modify base addresses
++                                         of vga cards.*/
++static int disable_pci_burst;         /* If set do not allow PCI bursts. */
++
++static unsigned int io_base;
++static unsigned int mem_base;
++
++/*
++ * static void disable_dev(struct pci_dev *dev)
++ *
++ * Disable PCI device DEV so that it does not respond to I/O or memory
++ * accesses.
++ *
++ * Parameters:
++ *
++ * dev        - device to disable.
++ */
++
++static void __init disable_dev(struct pci_dev *dev)
++{
++      unsigned short cmd;
++
++      if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
++           (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
++           (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga)
++              return;
++
++      pci_read_config_word(dev, PCI_COMMAND, &cmd);
++
++      cmd &= (~PCI_COMMAND_IO & ~PCI_COMMAND_MEMORY & ~PCI_COMMAND_MASTER);
++      pci_write_config_word(dev, PCI_COMMAND, cmd);
++}
++
++/* Stolen from pcibios_enable_resources/i386 */
++int pcibios_enable_device(struct pci_dev *dev, int mask)
++{
++      u16 cmd, old_cmd;
++      int idx;
++      struct resource *r;
++
++      pci_read_config_word(dev, PCI_COMMAND, &cmd);
++      old_cmd = cmd;
++      for(idx=0; idx<6; idx++) {
++              /* Only set up the requested stuff */
++              if (!(mask & (1<<idx)))
++                      continue;
++
++              r = &dev->resource[idx];
++              if (!r->start && r->end) {
++                      printk("PCI: Device %s not available because"
++                              " of resource collisions\n", dev->dev.bus_id);
++                      return -EINVAL;
++              }
++              if (r->flags & IORESOURCE_IO)
++                      cmd |= PCI_COMMAND_IO;
++              if (r->flags & IORESOURCE_MEM)
++                      cmd |= PCI_COMMAND_MEMORY;
++      }
++      if (dev->resource[PCI_ROM_RESOURCE].start)
++              cmd |= PCI_COMMAND_MEMORY;
++      if (cmd != old_cmd) {
++              printk("PCI: Enabling device %s (%04x -> %04x)\n", dev->dev.bus_id, old_cmd, cmd);
++              pci_write_config_word(dev, PCI_COMMAND, cmd);
++      }
++      return 0;
++}
++
++/*
++ * static void layout_dev(struct pci_dev *dev)
++ *
++ * Layout memory and I/O for a device.
++ *
++ * Parameters:
++ *
++ * device     - device to layout memory and I/O for.
++ */
++
++static void __init layout_dev(struct pci_dev *dev)
++{
++      unsigned short cmd;
++      unsigned int base, mask, size, reg;
++      unsigned int alignto;
++      int i;
++
++      /*
++       * Skip video cards if requested.
++       */
++      if (((dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA) ||
++           (dev->class >> 8 == PCI_CLASS_DISPLAY_VGA) ||
++           (dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)) && skip_vga){
++              printk("%s: VGA\n",__FUNCTION__);
++              return;
++      }
++      pci_read_config_word(dev, PCI_COMMAND, &cmd);
++
++      for (reg = PCI_BASE_ADDRESS_0, i = 0; reg <= PCI_BASE_ADDRESS_5; reg += 4, i++)
++      {
++              /*
++               * Figure out how much space and of what type this
++               * device wants.
++               */
++
++              pci_write_config_dword(dev, reg, 0xffffffff);
++              pci_read_config_dword(dev, reg, &base);
++              if (!base)
++              {
++                      /* this base-address register is unused */
++                      dev->resource[i].start = 0;
++                      dev->resource[i].end = 0;
++                      dev->resource[i].flags = 0;
++                      continue;
++              }
++
++              /*
++               * We've read the base address register back after
++               * writing all ones and so now we must decode it.
++               */
++      
++              if (base & PCI_BASE_ADDRESS_SPACE_IO)
++              {
++                      /*
++                       * I/O space base address register.
++                       */
++
++                      cmd |= PCI_COMMAND_IO;
++
++                      base &= PCI_BASE_ADDRESS_IO_MASK;
++                      mask = (~base << 1) | 0x1;
++                      size = (mask & base) & 0xffffffff;
++
++                      /*
++                       * Align to multiple of size of minimum base.
++                       */
++
++#ifdef CONFIG_COLDFIRE
++                      alignto = MAX(PAGE_SIZE, size) ;
++#else /* CONFIG_COLDFIRE */
++                      alignto = MAX(0x040, size) ;
++#endif /* CONFIG_COLDFIRE */
++                      base = ALIGN(io_base, alignto);
++                      io_base = base + size;
++                      pci_write_config_dword(dev, reg, base | PCI_BASE_ADDRESS_SPACE_IO);
++
++                      dev->resource[i].start = base;
++                      dev->resource[i].end = dev->resource[i].start + size - 1;
++                      dev->resource[i].flags = IORESOURCE_IO | PCI_BASE_ADDRESS_SPACE_IO;
++
++                      DBG_DEVS(("layout_dev: IO address: %x\n", base));
++              }
++              else
++              {
++                      unsigned int type;
++
++                      /*
++                       * Memory space base address register.
++                       */
++
++                      cmd |= PCI_COMMAND_MEMORY;
++                      type = base & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
++                      base &= PCI_BASE_ADDRESS_MEM_MASK;
++                      mask = (~base << 1) | 0x1;
++                      size = (mask & base) & 0xffffffff;
++                      switch (type)
++                      {
++                      case PCI_BASE_ADDRESS_MEM_TYPE_32:
++                      case PCI_BASE_ADDRESS_MEM_TYPE_64:
++                              break;
++
++                      case PCI_BASE_ADDRESS_MEM_TYPE_1M:
++                              printk("bios32 WARNING: slot %d, function %d "
++                                     "requests memory below 1MB---don't "
++                                     "know how to do that.\n",
++                                     PCI_SLOT(dev->devfn),
++                                     PCI_FUNC(dev->devfn));
++                              continue;
++                      }
++                      DBG_DEVS(("%s MEM: base %x,type %x,mask %x,size %x\n",
++                              __FUNCTION__, base, type, mask, size));
++                      /*
++                       * Align to multiple of size of minimum base.
++                       */
++
++                      alignto = max_t(unsigned int, 0x1000, size);
++                      base = ALIGN(mem_base, alignto);
++                      mem_base = base + size;
++                      pci_write_config_dword(dev, reg, base);
++
++                      dev->resource[i].start = base;
++                      dev->resource[i].end = dev->resource[i].start + size - 1;
++                      dev->resource[i].flags = IORESOURCE_MEM;
++                      DBG_DEVS(("%s MEM :base %x,size %x\n",
++                              __FUNCTION__, base, size));
++                      if (type == PCI_BASE_ADDRESS_MEM_TYPE_64)
++                      {
++                              /*
++                               * 64-bit address, set the highest 32 bits
++                               * to zero.
++                               */
++
++                              reg += 4;
++                              pci_write_config_dword(dev, reg, 0);
++
++                              i++;
++                              dev->resource[i].start = 0;
++                              dev->resource[i].end = 0;
++                              dev->resource[i].flags = 0;
++                              printk("%s:type == 64\n",__FUNCTION__);
++                      }
++              }
++      }
++
++      /*
++       * Enable device:
++       */
++
++      if (dev->class >> 8 == PCI_CLASS_NOT_DEFINED ||
++          dev->class >> 8 == PCI_CLASS_NOT_DEFINED_VGA ||
++          dev->class >> 8 == PCI_CLASS_DISPLAY_VGA ||
++          dev->class >> 8 == PCI_CLASS_DISPLAY_XGA)
++      {
++              /*
++               * All of these (may) have I/O scattered all around
++               * and may not use i/o-base address registers at all.
++               * So we just have to always enable I/O to these
++               * devices.
++               */
++              cmd |= PCI_COMMAND_IO;
++      }
++
++      pci_write_config_word(dev, PCI_COMMAND, cmd | PCI_COMMAND_MASTER);
++
++      pci_write_config_byte(dev, PCI_LATENCY_TIMER, (disable_pci_burst) ? 0 : 32);
++
++      if (bus_info != NULL)
++              bus_info->conf_device(dev);     /* Machine dependent configuration. */
++
++      printk(KERN_INFO "layout_dev: bus %d  slot 0x%x  VID 0x%x  DID 0x%x  class 0x%x\n",
++              dev->bus->number, PCI_SLOT(dev->devfn),
++              dev->vendor, dev->device, dev->class);
++}
++
++/*
++ * static void layout_bus(struct pci_bus *bus)
++ *
++ * Layout memory and I/O for all devices on the given bus.
++ *
++ * Parameters:
++ *
++ * bus        - bus.
++ */
++
++static void __init layout_bus(struct pci_bus *bus)
++{
++      unsigned int bio, bmem;
++      struct pci_dev *dev;
++
++      DBG_DEVS(("layout_bus: starting bus %d\n", bus->number));
++
++      if (list_empty(&bus->devices) && list_empty(&bus->children))
++              return;
++
++      /*
++       * Align the current bases on appropriate boundaries (4K for
++       * IO and 1MB for memory).
++       */
++
++      bio = io_base = ALIGN(io_base, 4*KB);
++      bmem = mem_base = ALIGN(mem_base, 1*MB);
++
++      /*
++       * PCI devices might have been setup by a PCI BIOS emulation
++       * running under TOS. In these cases there is a
++       * window during which two devices may have an overlapping
++       * address range. To avoid this causing trouble, we first
++       * turn off the I/O and memory address decoders for all PCI
++       * devices.  They'll be re-enabled only once all address
++       * decoders are programmed consistently.
++       */
++
++      DBG_DEVS(("layout_bus: disable_dev for bus %d\n", bus->number));
++
++#ifdef NL_ORIGINAL
++      for (dev = bus->devices; dev; dev = dev->sibling)
++#else
++      dev = NULL;
++      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
++#endif
++      {
++              if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
++                  (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
++                      disable_dev(dev);
++      }
++
++      /*
++       * Allocate space to each device:
++       */
++
++      DBG_DEVS(("layout_bus: starting bus %d devices\n", bus->number));
++
++#ifdef NL_ORIGINAL
++      for (dev = bus->devices; dev; dev = dev->sibling)
++#else
++      dev = NULL;
++      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
++#endif
++      {
++              if ((dev->class >> 16 != PCI_BASE_CLASS_BRIDGE) ||
++                  (dev->class >> 8 == PCI_CLASS_BRIDGE_PCMCIA))
++                      layout_dev(dev);
++      }
++
++      DBG_DEVS(("layout_bus: bus %d finished\n", bus->number));
++}
++
++/*
++ * static void pcibios_fixup(void)
++ *
++ * Layout memory and I/O of all devices on the PCI bus if 'pci_modify' is
++ * true. This might be necessary because not every m68k machine with a PCI
++ * bus has a PCI BIOS. This function should be called right after
++ * pci_scan_bus() in pcibios_init().
++ */
++
++static void __init pcibios_fixup(void)
++{
++      DBG_DEVS(("%s\n", __FUNCTION__));
++      if (pci_modify)
++      {
++              /*
++               * Set base addresses for allocation of I/O and memory space.
++               */
++
++              io_base = bus_info->io_space.start + IO_ALLOC_OFFSET;
++              mem_base = bus_info->mem_space.start + MEM_ALLOC_OFFSET;
++
++              /*
++               * Scan the tree, allocating PCI memory and I/O space.
++               */
++
++#ifdef NL_ORIGINAL
++              layout_bus(pci_bus_b(pci_root.next));
++#else
++              layout_bus(pci_bus_b(pci_root_buses.next));
++#endif
++      }
++
++      /*
++       * Fix interrupt assignments, etc.
++       */
++
++      bus_info->fixup(pci_modify);
++}
++
++/*
++ * static void pcibios_claim_resources(struct pci_bus *bus)
++ *
++ * Claim all resources that are assigned to devices on the given bus.
++ *
++ * Parameters:
++ *
++ * bus        - bus.
++ */
++
++static void __init pcibios_claim_resources(struct pci_bus *bus)
++{
++      struct pci_dev *dev;
++      int i;
++      DBG_DEVS(("%s\n", __FUNCTION__));
++#ifdef NL_ORIGINAL
++      while (bus)
++#else
++      while ((bus = pci_find_next_bus(bus)) != NULL)
++#endif
++      {
++
++#ifdef NL_ORIGINAL
++              for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
++#else
++              dev = NULL;
++              while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
++#endif
++              {
++                      for (i = 0; i < PCI_NUM_RESOURCES; i++)
++                      {
++                              struct resource *r = &dev->resource[i];
++                              struct resource *pr;
++                              struct pci_bus_info *bus_info = 
++                                      (struct pci_bus_info *) dev->sysdata;
++
++                              if ((r->start == 0) || (r->parent != NULL))
++                                      continue;
++
++#ifdef CONFIG_COLDFIRE
++                              if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE)
++                                      continue;
++#endif /* CONFIG_COLDFIRE */
++#if 1
++                              if (r->flags & IORESOURCE_IO)
++                                      pr = &bus_info->io_space;
++                              else
++                                      pr = &bus_info->mem_space;
++#else
++                              if (r->flags & IORESOURCE_IO)
++                                      pr = &ioport_resource;
++                              else
++                                      pr = &iomem_resource;
++#endif
++                              if (request_resource(pr, r) < 0)
++                              {
++#ifdef NL_ORIGINAL
++                                      DBG_DEVS(("PCI: Address space collision on "
++                                              "region %d of device %s\n", i, dev->name));
++#else
++                                      printk("PCI: Address space collision on region %d of device %s\n", i, dev->dev.bus_id);
++#endif
++                              }
++                      }
++              }
++
++#ifdef NL_ORIGINAL
++              if (bus->children)
++                      pcibios_claim_resources(bus->children);
++#else
++              if (!list_empty(&bus->children))
++                      pcibios_claim_resources(pci_bus_b(bus->children.next));
++#endif
++
++#ifdef NL_ORIGINAL
++              bus = bus->next;
++#endif
++      }
++}
++
++/*
++ * int pcibios_assign_resource(struct pci_dev *dev, int i)
++ *
++ * Assign a new address to a PCI resource.
++ *
++ * Parameters:
++ *
++ * dev        - device.
++ * i  - resource.
++ *
++ * Result: 0 if successful.
++ */
++
++int __init pcibios_assign_resource(struct pci_dev *dev, int i)
++{
++      struct resource *r = &dev->resource[i];
++      struct resource *pr = pci_find_parent_resource(dev, r);
++      unsigned long size = r->end + 1;
++      DBG_DEVS(("%s:IO_ALLOC_OFFSET %x\n", __FUNCTION__, IO_ALLOC_OFFSET));
++      if (!pr)
++              return -EINVAL;
++
++      if (r->flags & IORESOURCE_IO)
++      {
++              DBG_DEVS(("%s:IORESOURCE_IO:start %x, size %lx\n",
++                      __FUNCTION__, bus_info->io_space.start, size));
++              if (size > 0x100)
++                      return -EFBIG;
++
++#ifdef NL_ORIGINAL
++              if (allocate_resource(pr, r, size, bus_info->io_space.start +
++                                    IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024))
++#else
++              if (allocate_resource(pr, r, size, bus_info->io_space.start +
++                                 IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
++#endif
++                      return -EBUSY;
++      }
++      else
++      {
++              DBG_DEVS(("%s:IORESOURCE_MEM:start %x, size %lx\n",
++                              __FUNCTION__, bus_info->mem_space.start, size));
++#ifdef NL_ORIGINAL
++              if (allocate_resource(pr, r, size, bus_info->mem_space.start +
++                                    MEM_ALLOC_OFFSET, bus_info->mem_space.end, size))
++#else
++              if (allocate_resource(pr, r, size, bus_info->io_space.start +
++                                 IO_ALLOC_OFFSET,  bus_info->io_space.end, 1024, NULL, NULL))
++#endif
++                      return -EBUSY;
++      }
++
++      if (i < 6)
++              pci_write_config_dword(dev, PCI_BASE_ADDRESS_0 + 4 * i, r->start);
++
++      return 0;
++}
++
++void pcibios_fixup_bus(struct pci_bus *bus)
++{
++      struct pci_dev *dev;
++      void *sysdata;
++
++      sysdata = (bus->parent) ? bus->parent->sysdata : bus->sysdata;
++
++#ifdef NL_ORIGINAL
++      for (dev = bus->devices; (dev != NULL); dev = dev->sibling)
++#else
++      dev = NULL;
++      while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL)
++#endif
++              dev->sysdata = sysdata;
++}
++
++int __init pcibios_init(void)
++{
++      printk("Linux/m68k PCI BIOS32 revision %x.%02x\n", MAJOR_REV, MINOR_REV);
++
++      bus_info = NULL;
++#ifdef CONFIG_COLDFIRE
++      bus_info = init_coldfire_pci();
++#endif /* CONFIG_COLDFIRE */
++#ifdef CONFIG_HADES
++      if (MACH_IS_HADES)
++              bus_info = init_hades_pci();
++#endif
++      if (bus_info != NULL)
++      {
++              printk("PCI: Probing PCI hardware\n");
++              pci_scan_bus(0, bus_info->m68k_pci_ops, bus_info);
++              pcibios_fixup();
++#ifdef NL_ORIGINAL
++              pcibios_claim_resources(pci_root);
++#else
++              pcibios_claim_resources(pci_bus_b(pci_root_buses.next));
++#endif
++      }
++      else
++              printk("PCI: No PCI bus detected\n");
++      return 0;
++}
++
++subsys_initcall(pcibios_init);
++
++char * pcibios_setup(char *str)
++{
++      if (!strcmp(str, "nomodify"))
++      {
++              pci_modify = 0;
++              return NULL;
++      }
++      else if (!strcmp(str, "skipvga"))
++      {
++              skip_vga = 1;
++              return NULL;
++      }
++      else if (!strcmp(str, "noburst"))
++      {
++              disable_pci_burst = 1;
++              return NULL;
++      }
++
++      return str;
++}
++#endif /* CONFIG_PCI */
+--- a/arch/m68k/kernel/dma.c
++++ b/arch/m68k/kernel/dma.c
+@@ -11,13 +11,24 @@
+ #include <linux/kernel.h>
+ #include <linux/scatterlist.h>
+ #include <linux/vmalloc.h>
+-
++#include <linux/pci.h>
+ #include <asm/pgalloc.h>
+ void *dma_alloc_coherent(struct device *dev, size_t size,
+                        dma_addr_t *handle, gfp_t flag)
+ {
+-#ifndef CONFIG_M5445X
++#if   defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
++        /*
++      * On the M5445x platform the memory allocated with GFP_DMA
++      * is guaranteed to be DMA'able.
++      */
++        void *addr;
++
++        size = PAGE_ALIGN(size);
++        addr = kmalloc(size, GFP_DMA);
++        *handle = virt_to_phys(addr);
++        return addr;
++#else
+       struct page *page, **map;
+       pgprot_t pgprot;
+       void *addr;
+@@ -56,17 +67,6 @@ void *dma_alloc_coherent(struct device *
+       kfree(map);
+       return addr;
+-#else
+-      /*
+-       * On the M5445x platform the memory allocated with GFP_DMA
+-       * is guaranteed to be DMA'able.
+-       */
+-      void *addr;
+-
+-      size = PAGE_ALIGN(size);
+-      addr = kmalloc(size, GFP_DMA);
+-      *handle = virt_to_phys(addr);
+-      return addr;
+ #endif
+ }
+ EXPORT_SYMBOL(dma_alloc_coherent);
+@@ -75,10 +75,10 @@ void dma_free_coherent(struct device *de
+                      void *addr, dma_addr_t handle)
+ {
+       pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
+-#ifndef CONFIG_M5445X
+-      vfree(addr);
+-#else
++#if   defined(CONFIG_M547X_8X) | defined(CONFIG_M54455)
+       kfree(addr);
++#else
++      vfree(addr);
+ #endif
+ }
+ EXPORT_SYMBOL(dma_free_coherent);
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -153,6 +153,10 @@ void __iomem *__ioremap(unsigned long ph
+                */
+               return (void __iomem *)physaddr;
+       }
++        if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) {
++                printk("ioremap:PCI 0x%lx,0x%lx(%d) - PCI area hit\n", physaddr, size, cacheflag);
++                return (void *)physaddr;
++        }
+ #endif
+ #ifdef DEBUG
+@@ -284,7 +288,12 @@ void __iounmap(void *addr, unsigned long
+       pgd_t *pgd_dir;
+       pmd_t *pmd_dir;
+       pte_t *pte_dir;
+-
++#ifdef CONFIG_M547X_8X
++        if ((addr >= (void*)0xd0000000) && (addr + size < (void*)0xd800ffff)) {
++                printk("%s: PCI address\n",__FUNCTION__);
++                return;
++        }
++#endif
+       while ((long)size > 0) {
+               pgd_dir = pgd_offset_k(virtaddr);
+               if (pgd_bad(*pgd_dir)) {
+--- a/drivers/pci/access.c
++++ b/drivers/pci/access.c
+@@ -23,6 +23,7 @@ static DEFINE_SPINLOCK(pci_lock);
+ #define PCI_word_BAD (pos & 1)
+ #define PCI_dword_BAD (pos & 3)
++#ifdef NL_ORIGINAL
+ #define PCI_OP_READ(size,type,len) \
+ int pci_bus_read_config_##size \
+       (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
+@@ -37,7 +38,20 @@ int pci_bus_read_config_##size \
+       spin_unlock_irqrestore(&pci_lock, flags);                       \
+       return res;                                                     \
+ }
+-
++#else /* NL_ORIGINAL */
++#define PCI_OP_READ(size,type,len) \
++int pci_bus_read_config_##size \
++        (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
++{                                                                       \
++        int res;                                                        \
++        unsigned long flags;                                            \
++        if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
++        spin_lock_irqsave(&pci_lock, flags);                            \
++        res = bus->ops->read(bus, devfn, pos, len, (u32 *)value);       \
++        spin_unlock_irqrestore(&pci_lock, flags);                       \
++        return res;                                                     \
++}
++#endif /* NL_ORIGINAL */
+ #define PCI_OP_WRITE(size,type,len) \
+ int pci_bus_write_config_##size \
+       (struct pci_bus *bus, unsigned int devfn, int pos, type value)  \
+--- a/drivers/usb/host/Makefile
++++ b/drivers/usb/host/Makefile
+@@ -6,7 +6,7 @@ ifeq ($(CONFIG_USB_DEBUG),y)
+       EXTRA_CFLAGS            += -DDEBUG
+ endif
+-obj-$(CONFIG_PCI)             += pci-quirks.o
++#obj-$(CONFIG_PCI)            += pci-quirks.o
+ obj-$(CONFIG_USB_EHCI_HCD)    += ehci-hcd.o
+ obj-$(CONFIG_USB_ISP116X_HCD) += isp116x-hcd.o
+--- /dev/null
++++ b/include/asm-m68k/5445x_pci.h
+@@ -0,0 +1,94 @@
++/*
++ * asm-m68k/pci.h - m68k specific PCI declarations.
++ *
++ * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
++ *    Kurt Mahan <kmahan@freescale.com>
++ */
++#ifndef _ASM_M68K_5445X_PCI_H
++#define _ASM_M68K_5445x_PCI_H
++
++#ifndef CONFIG_PCI
++/*
++ * The PCI address space does equal the physical memory
++ * address space.  The networking and block device layers use
++ * this boolean for bounce buffer decisions.
++ */
++#define PCI_DMA_BUS_IS_PHYS           (1)
++#else
++#include <asm-generic/pci-dma-compat.h>
++
++/*
++ * The PCI address space does equal the physical memory
++ * address space.  The networking and block device layers use
++ * this boolean for bounce buffer decisions.
++ */
++#define PCI_DMA_BUS_IS_PHYS           (1)
++
++#define PCIBIOS_MIN_IO                        0x00004000
++#define PCIBIOS_MIN_MEM                       0x02000000
++
++#define pcibios_assign_all_busses()   0
++#define pcibios_scan_all_fns(a, b)    0
++
++static inline void
++pcibios_set_master(struct pci_dev *dev)
++{
++      /* no special bus mastering setup handling */
++}
++
++static inline void
++pcibios_penalize_isa_irq(int irq, int active)
++{
++      /* no dynamic PCI IRQ allocation */
++}
++
++#if 0
++static inline void
++pcibios_add_platform_entries(struct pci_dev *dev)
++{
++      /* no special handling */
++}
++#endif
++
++static inline void
++pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
++                       struct resource *res)
++{
++#ifdef CONFIG_M54455
++      if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
++              /* HACK!  FIX! kludge to fix bridge mapping */
++              region->start = res->start & 0x0fffffff;
++              region->end = res->end & 0x0fffffff;
++      } else {
++              region->start = res->start;
++              region->end = res->end;
++      }
++#else
++      region->start = res->start;
++      region->end = res->end;
++#endif
++}
++
++static inline void
++pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
++                      struct pci_bus_region *region)
++{
++      res->start = region->start;
++      res->end = region->end;
++}
++
++static inline struct resource *
++pcibios_select_root(struct pci_dev *pdev, struct resource *res)
++{
++      struct resource *root = NULL;
++
++      if (res->flags & IORESOURCE_IO)
++              root = &ioport_resource;
++      if (res->flags & IORESOURCE_MEM)
++              root = &iomem_resource;
++
++      return root;
++}
++
++#endif /* CONFIG_PCI */
++#endif /* _ASM_M68K_5445X_PCI_H */
+--- /dev/null
++++ b/include/asm-m68k/548x_pci.h
+@@ -0,0 +1,99 @@
++#ifndef _ASM_M68K_548X_PCI_H
++#define _ASM_M68K_548X_PCI_H
++
++/*
++ * asm-m68k/pci_m68k.h - m68k specific PCI declarations.
++ *
++ * Written by Wout Klaren.
++ */
++#include <linux/mm.h>
++#include <asm/scatterlist.h>
++
++#include <asm-generic/pci.h>
++
++struct pci_ops;
++
++/*
++ * Structure with hardware dependent information and functions of the
++ * PCI bus.
++ */
++
++struct pci_bus_info
++{
++      /*
++       * Resources of the PCI bus.
++       */
++
++      struct resource mem_space;
++      struct resource io_space;
++
++      /*
++       * System dependent functions.
++       */
++
++      struct pci_ops *m68k_pci_ops;
++
++      void (*fixup)(int pci_modify);
++      void (*conf_device)(struct pci_dev *dev);
++};
++
++#define pcibios_assign_all_busses()   0
++#define pcibios_scan_all_fns(a, b)    0
++
++static inline void pcibios_set_master(struct pci_dev *dev)
++{
++      /* No special bus mastering setup handling */
++}
++
++static inline void pcibios_penalize_isa_irq(int irq)
++{
++      /* We don't do dynamic PCI IRQ allocation */
++}
++
++#ifndef CONFIG_COLDFIRE
++/* The PCI address space does equal the physical memory
++ * address space.  The networking and block device layers use
++ * this boolean for bounce buffer decisions.
++ */
++#define PCI_DMA_BUS_IS_PHYS   (1)
++
++#define PCIBIOS_MIN_IO                0x00004000
++#define PCIBIOS_MIN_MEM       0x04000000
++
++#else /* !CONFIG_COLDFIRE */
++#include <asm-generic/pci-dma-compat.h>
++#define PCI_DMA_BASE          /*0x40000000*/0 /* PCI-DMA window base          */
++
++extern struct pci_bus_info *__init init_coldfire_pci(void);
++extern void * pci_alloc_son(struct pci_dev *, size_t,
++                            dma_addr_t *, int);
++/*
++ * The PCI address space equal the virtual memory
++ * address space on m547X/m548X.
++ */
++#define PCI_DMA_BUS_IS_PHYS   (1)
++
++#define PCIBIOS_MIN_IO                0x00000100
++#define PCIBIOS_MIN_MEM       0x02000000
++
++struct scatterlist;
++
++
++/* This is always fine. */
++#define pci_dac_dma_supported(pci_dev, mask)  (1)
++
++
++/* These macros should be used after a pci_map_sg call has been done
++ * to get bus addresses of each of the SG entries and their lengths.
++ * You should only work with the number of sg entries pci_map_sg
++ * returns.
++ */
++#define sg_dma_address(sg)    ((sg)->dma_address)
++#define sg_dma_len(sg)                ((sg)->length)
++
++static inline void pcibios_align_resource(void *data, struct resource *res, unsigned long size, unsigned long align)
++{
++}
++
++#endif /* !CONFIG_COLDFIRE*/
++#endif /* _ASM_M68K_548X_PCI_H */
+--- a/include/asm-m68k/io.h
++++ b/include/asm-m68k/io.h
+@@ -204,6 +204,12 @@ static inline u16 __iomem *isa_mtw(unsig
+ #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
+ #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
++#ifndef CONFIG_COLDFIRE
++#define isa_readb(p)       in_8(isa_mtb(p))
++#define isa_readw(p)       (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p)))
++#define isa_writeb(val,p)  out_8(isa_mtb(p),(val))
++#define isa_writew(val,p)  (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val)))
++#else
+ #define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
+ #define isa_readw(p)       \
+       (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
+@@ -212,7 +218,7 @@ static inline u16 __iomem *isa_mtw(unsig
+ #define isa_writew(val,p)  \
+       (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
+                : out_le16(isa_mtw((unsigned long)(p)),(val)))
+-
++#endif
+ static inline void isa_delay(void)
+ {
+   switch(ISA_TYPE)
+@@ -285,6 +291,29 @@ static inline void isa_delay(void)
+ #endif /* CONFIG_ISA */
+ #if defined(CONFIG_PCI)
++#ifdef CONFIG_COLDFIRE
++#define inb_p   inb
++#define inw_p   inw
++#define inl_p   inl
++#define outb_p  outb
++#define outw_p  outw
++#define outl_p  outl
++
++unsigned char  pci_inb(long addr);
++unsigned short pci_inw(long addr);
++unsigned long  pci_inl(long addr);
++void pci_outb(unsigned char  val, long addr);
++void pci_outw(unsigned short val, long addr);
++void pci_outl(unsigned long  val, long addr);
++
++void pci_insb(volatile unsigned char* addr, unsigned char* buf, int len);
++void pci_insw(volatile unsigned short* addr, unsigned short* buf, int len);
++void pci_insl(volatile unsigned long* addr, unsigned long* buf, int len);
++
++void pci_outsb(volatile unsigned char* addr, const unsigned char* buf, int len);
++void pci_outsw(volatile unsigned short* addr, const unsigned short* buf, int len);
++void pci_outsl(volatile unsigned long* addr, const unsigned long* buf, int len);
++#endif
+ #define readl(addr)      in_le32(addr)
+ #define writel(val,addr) out_le32((addr),(val))
+@@ -300,6 +329,7 @@ static inline void isa_delay(void)
+ #define readl_relaxed(addr) readl(addr)
+ #ifndef CONFIG_ISA
++#ifndef CONFIG_COLDFIRE
+ #define inb(port)      in_8(port)
+ #define outb(val,port) out_8((port),(val))
+ #define inw(port)      in_le16(port)
+@@ -319,6 +349,30 @@ static inline void isa_delay(void)
+ #define outsl(port, buf, nr)  \
+               raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
+ #else
++#define inb(port)      pci_inb(port)
++#define outb(val,port) pci_outb((val),(port))
++#define inw(port)      pci_inw(port)
++#define outw(val,port) pci_outw((val),(port))
++#define insb(a,b,c)  pci_insb((volatile unsigned char*)a,(unsigned char*)b,c)
++#define insw(a,b,c)  pci_insw((volatile unsigned short*)a,(const unsigned short*)b,c)
++#define insl(a,b,c)  pci_insl((volatile unsigned long*)a,(const unsigned long*)b,c)
++#define outsb(a,b,c) pci_outsb((volatile unsigned char*)a,(const unsigned char*)b,c)
++#define outsw(a,b,c) pci_outsw((volatile unsigned short*)a,(const unsigned short*)b,c)
++#define outsl(a,b,c) pci_outsl((volatile unsigned long*)a,(const unsigned long*)b,c)
++#define inl(port)        pci_inl(port)
++#define outl(val,port)   pci_outl((val),(port))
++#endif
++
++#ifndef CONFIG_COLDFIRE
++#define __raw_readb readb
++#define __raw_readw readw
++#define __raw_readl readl
++#define __raw_writeb writeb
++#define __raw_writew writew
++#define __raw_writel writel
++#endif
++
++#else
+ /*
+  * kernel with both ISA and PCI compiled in, those have
+  * conflicting defs for in/out. Simply consider port < 1024
+@@ -432,6 +486,15 @@ static inline void memcpy_toio(volatile 
+ #define xlate_dev_kmem_ptr(p) p
+ #ifdef CONFIG_COLDFIRE
++#define __raw_readb(addr) \
++    ({ unsigned char __v = (*(volatile unsigned char *) (addr)); __v; })
++#define __raw_readw(addr) \
++    ({ unsigned short __v = (*(volatile unsigned short *) (addr)); __v; })
++#define __raw_readl(addr) \
++    ({ unsigned long __v = (*(volatile unsigned long *) (addr)); __v; })
++#define __raw_writeb(b,addr) (void)((*(volatile unsigned char *) (addr)) = (b))
++#define __raw_writew(b,addr) (void)((*(volatile unsigned short *) (addr)) = (b))
++#define __raw_writel(b,addr) (void)((*(volatile unsigned int *) (addr)) = (b))
+ #define memset_io(a, b, c) memset((void *)(a), (b), (c))
+ #define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
+--- /dev/null
++++ b/include/asm-m68k/m5485pci.h
+@@ -0,0 +1,330 @@
++/*
++ *    m5485pci.h -- ColdFire 547x/548x PCI controller support.
++ */
++#ifndef __MCF548X_PCI_H__
++#define __MCF548X_PCI_H__
++
++
++/* PCI Type 0 Configuration Registers */
++#define MCF_PCIIDR        MCF_REG32(0x000B00)   /* PCI Device ID/Vendor ID      */
++#define MCF_PCISCR        MCF_REG32(0x000B04)   /* PCI Status/Command           */
++#define MCF_PCICCRIR      MCF_REG32(0x000B08)   /* PCI Class Code / Revision ID */
++#define MCF_PCICR1        MCF_REG32(0x000B0C)   /* PCI Configuration 1 Register */
++#define MCF_PCIBAR0       MCF_REG32(0x000B10)   /* PCI Base Address Register 0  */
++#define MCF_PCIBAR1       MCF_REG32(0x000B14)   /* PCI Base Address Register 1  */
++#define MCF_PCICCPR       MCF_REG32(0x000B28)   /* PCI Cardbus CIS Pointer      */
++#define MCF_PCISID        MCF_REG32(0x000B2C)   /* Subsystem ID/Subsystem Vendor ID*/
++#define MCF_PCIERBAR      MCF_REG32(0x000B30)   /* PCI Expansion ROM            */
++#define MCF_PCICPR        MCF_REG32(0x000B30)   /* PCI Capabilities Pointer     */
++#define MCF_PCICR2        MCF_REG32(0x000B3C)   /* PCI Configuration Register 2 */
++
++/* General Control/Status Registers */
++#define MCF_PCIGSCR       MCF_REG32(0x000B60)   /* Global Status/Control Register   */
++#define MCF_PCITBATR0     MCF_REG32(0x000B64)   /* Target Base Address Translation 0*/
++#define MCF_PCITBATR1     MCF_REG32(0x000B68)   /* Target Base Address Translation 1*/
++#define MCF_PCITCR        MCF_REG32(0x000B6C)   /* Target Control Register          */
++#define MCF_PCIIW0BTAR    MCF_REG32(0x000B70)   /* Initiator Window 0 Base Address  */
++#define MCF_PCIIW1BTAR    MCF_REG32(0x000B74)   /* Initiator Window 1 Base Address  */
++#define MCF_PCIIW2BTAR    MCF_REG32(0x000B78)   /* Initiator Window 2 Base  Address */
++#define MCF_PCIIWCR       MCF_REG32(0x000B80)   /* Initiator Window Configuration   */
++#define MCF_PCIICR        MCF_REG32(0x000B84)   /* Initiator Control Register       */
++#define MCF_PCIISR        MCF_REG32(0x000B88)   /* Initiator Status Register        */
++#define MCF_PCICAR        MCF_REG32(0x000BF8)   /* Configuration Address Register   */
++
++/* CommBus FIFO Transmit Interface Registers */
++#define MCF_PCITPSR       MCF_REG32(0x008400)   /* Tx Packet Size Register            */
++#define MCF_PCITSAR       MCF_REG32(0x008404)   /* Tx Start Address Register        */
++#define MCF_PCITTCR       MCF_REG32(0x008408)   /* Tx Transaction Control Register  */
++#define MCF_PCITER        MCF_REG32(0x00840C)   /* Tx Enables Register                */
++#define MCF_PCITNAR       MCF_REG32(0x008410)   /* Tx Next Address Register         */
++#define MCF_PCITLWR       MCF_REG32(0x008414)   /* Tx Last Word Register              */
++#define MCF_PCITDCR       MCF_REG32(0x008418)   /* Tx Done Counts Register          */
++#define MCF_PCITSR        MCF_REG32(0x00841C)   /* Tx Status Register                 */
++#define MCF_PCITFDR       MCF_REG32(0x008440)   /* Tx FIFO Data Register              */
++#define MCF_PCITFSR       MCF_REG32(0x008444)   /* Tx FIFO Status Register          */
++#define MCF_PCITFCR       MCF_REG32(0x008448)   /* Tx FIFO Control Register         */
++#define MCF_PCITFAR       MCF_REG32(0x00844C)   /* Tx FIFO Alarm Register             */
++#define MCF_PCITFRPR      MCF_REG32(0x008450)   /* Tx FIFO Read Pointer Register    */
++#define MCF_PCITFWPR      MCF_REG32(0x008454)   /* Tx FIFO Write Pointer Register   */
++
++/* CommBus FIFO Receive Interface Registers */
++#define MCF_PCIRPSR       MCF_REG32(0x008480)   /* Tx Packet Size Register            */
++#define MCF_PCIRSAR       MCF_REG32(0x008484)   /* Tx Start Address Register        */
++#define MCF_PCIRTCR       MCF_REG32(0x008488)   /* Tx Transaction Control Register  */
++#define MCF_PCIRER        MCF_REG32(0x00848C)   /* Tx Enables Register                */
++#define MCF_PCIRNAR       MCF_REG32(0x008490)   /* Tx Next Address Register         */
++#define MCF_PCIRDCR       MCF_REG32(0x008498)   /* Tx Done Counts Register          */
++#define MCF_PCIRSR        MCF_REG32(0x00849C)   /* Tx Status Register                 */
++#define MCF_PCIRFDR       MCF_REG32(0x0084C0)   /* Tx FIFO Data Register              */
++#define MCF_PCIRFSR       MCF_REG32(0x0084C4)   /* Tx FIFO Status Register          */
++#define MCF_PCIRFCR       MCF_REG32(0x0084C8)   /* Tx FIFO Control Register         */
++#define MCF_PCIRFAR       MCF_REG32(0x0084CC)   /* Tx FIFO Alarm Register             */
++#define MCF_PCIRFRPR      MCF_REG32(0x0084D0)   /* Tx FIFO Read Pointer Register    */
++#define MCF_PCIRFWPR      MCF_REG32(0x0084D4)   /* Tx FIFO Write Pointer Register   */
++
++/* PCI Arbiter Registers */
++#define MCF_PCIARB_PACR   MCF_REG32(0x000C00)
++#define MCF_PCIARB_PASR   MCF_REG32(0x000C04)
++
++
++/* Bit definitions and macros for MCF_PCIIDR */
++#define MCF_PCIIDR_VENDORID(x)            (((x)&0x0000FFFF)<<0)
++#define MCF_PCIIDR_DEVICEID(x)            (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PCISCR */
++#define MCF_PCISCR_M      (0x00000002)
++#define MCF_PCISCR_B      (0x00000004)
++#define MCF_PCISCR_SP     (0x00000008)
++#define MCF_PCISCR_MW     (0x00000010)
++#define MCF_PCISCR_PER    (0x00000040)
++#define MCF_PCISCR_S      (0x00000100)
++#define MCF_PCISCR_F      (0x00000200)
++#define MCF_PCISCR_C      (0x00100000)
++#define MCF_PCISCR_66M    (0x00200000)
++#define MCF_PCISCR_R      (0x00400000)
++#define MCF_PCISCR_FC     (0x00800000)
++#define MCF_PCISCR_DP     (0x01000000)
++#define MCF_PCISCR_DT(x)  (((x)&0x00000003)<<25)
++#define MCF_PCISCR_TS     (0x08000000)
++#define MCF_PCISCR_TR     (0x10000000)
++#define MCF_PCISCR_MA     (0x20000000)
++#define MCF_PCISCR_SE     (0x40000000)
++#define MCF_PCISCR_PE     (0x80000000)
++
++/* Bit definitions and macros for MCF_PCICCRIR */
++#define MCF_PCICCRIR_REVID(x)             (((x)&0x000000FF)<<0)
++#define MCF_PCICCRIR_CLASSCODE(x)         (((x)&0x00FFFFFF)<<8)
++
++/* Bit definitions and macros for MCF_PCICR1 */
++#define MCF_PCICR1_CACHELINESIZE(x)       (((x)&0x0000000F)<<0)
++#define MCF_PCICR1_LATTIMER(x)            (((x)&0x000000FF)<<8)
++#define MCF_PCICR1_HEADERTYPE(x)          (((x)&0x000000FF)<<16)
++#define MCF_PCICR1_BIST(x)                (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PCIBAR# */
++#define MCF_PCIBAR0_ADDR(x)               (((x)&0x00003FFF)<<18)
++#define MCF_PCIBAR1_ADDR(x)               (((x)&0x00000003)<<30)
++
++/* Bit definitions and macros for MCF_PCICR2 */
++#define MCF_PCICR2_INTLINE(x)             (((x)&0x000000FF)<<0)
++#define MCF_PCICR2_INTPIN(x)              (((x)&0x000000FF)<<8)
++#define MCF_PCICR2_MINGNT(x)              (((x)&0x000000FF)<<16)
++#define MCF_PCICR2_MAXLAT(x)              (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PCIGSCR */
++#define MCF_PCIGSCR_PR                    (0x00000001)
++#define MCF_PCIGSCR_SEE                   (0x00001000)
++#define MCF_PCIGSCR_PEE                   (0x00002000)
++#define MCF_PCIGSCR_SE                    (0x10000000)
++#define MCF_PCIGSCR_PE                    (0x20000000)
++
++/* Bit definitions and macros for MCF_PCITBATR0 */
++#define MCF_PCITBATR0_EN                  (0x00000001)
++#define MCF_PCITBATR0_BAT0(x)             (((x)&0x00003FFF)<<18)
++
++/* Bit definitions and macros for MCF_PCITBATR1 */
++#define MCF_PCITBATR1_EN                  (0x00000001)
++#define MCF_PCITBATR1_BAT1(x)             (((x)&0x00000003)<<30)
++
++/* Bit definitions and macros for MCF_PCITCR */
++#define MCF_PCITCR_P                      (0x00010000)
++#define MCF_PCITCR_LD                     (0x01000000)
++
++/* Bit definitions and macros for MCF_PCIIW0BTAR */
++#define MCF_PCIIW0BTAR_WTA0(x)            (((x)&0x000000FF)<<8)
++#define MCF_PCIIW0BTAR_WAM0(x)            (((x)&0x000000FF)<<16)
++#define MCF_PCIIW0BTAR_WBA0(x)            (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PCIIW1BTAR */
++#define MCF_PCIIW1BTAR_WTA1(x)            (((x)&0x000000FF)<<8)
++#define MCF_PCIIW1BTAR_WAM1(x)            (((x)&0x000000FF)<<16)
++#define MCF_PCIIW1BTAR_WBA1(x)            (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PCIIW2BTAR */
++#define MCF_PCIIW2BTAR_WTA2(x)            (((x)&0x000000FF)<<8)
++#define MCF_PCIIW2BTAR_WAM2(x)            (((x)&0x000000FF)<<16)
++#define MCF_PCIIW2BTAR_WBA2(x)            (((x)&0x000000FF)<<24)
++
++/* Bit definitions and macros for MCF_PCIIWCR */
++#define MCF_PCIIWCR_WINCTRL2(x)           (((x)&0x0000000F)<<8)
++#define MCF_PCIIWCR_WINCTRL1(x)           (((x)&0x0000000F)<<16)
++#define MCF_PCIIWCR_WINCTRL0(x)           (((x)&0x0000000F)<<24)
++#define MCF_PCIIWCR_WINCTRL0_MEMREAD      (0x01000000)
++#define MCF_PCIIWCR_WINCTRL0_MEMRDLINE    (0x03000000)
++#define MCF_PCIIWCR_WINCTRL0_MEMRDMUL     (0x05000000)
++#define MCF_PCIIWCR_WINCTRL0_IO           (0x09000000)
++#define MCF_PCIIWCR_WINCTRL0_E            (0x01000000)
++#define MCF_PCIIWCR_WINCTRL1_MEMREAD      (0x00010000)
++#define MCF_PCIIWCR_WINCTRL1_MEMRDLINE    (0x00030000)
++#define MCF_PCIIWCR_WINCTRL1_MEMRDMUL     (0x00050000)
++#define MCF_PCIIWCR_WINCTRL1_IO           (0x00090000)
++#define MCF_PCIIWCR_WINCTRL1_E            (0x00010000)
++#define MCF_PCIIWCR_WINCTRL2_MEMREAD      (0x00000100)
++#define MCF_PCIIWCR_WINCTRL2_MEMRDLINE    (0x00000300)
++#define MCF_PCIIWCR_WINCTRL2_MEMRDMUL     (0x00000500)
++#define MCF_PCIIWCR_WINCTRL2_IO           (0x00000900)
++#define MCF_PCIIWCR_WINCTRL2_E            (0x00000100)
++
++
++/* Bit definitions and macros for MCF_PCIICR */
++#define MCF_PCIICR_MAXRETRY(x)            (((x)&0x000000FF)<<0)
++#define MCF_PCIICR_TAE                    (0x01000000)
++#define MCF_PCIICR_IAE                    (0x02000000)
++#define MCF_PCIICR_REE                    (0x04000000)
++
++/* Bit definitions and macros for MCF_PCIISR */
++#define MCF_PCIISR_TA                     (0x01000000)
++#define MCF_PCIISR_IA                     (0x02000000)
++#define MCF_PCIISR_RE                     (0x04000000)
++
++/* Bit definitions and macros for MCF_PCICAR */
++#define MCF_PCICAR_DWORD(x)               (((x)&0x0000003F)<<2)
++#define MCF_PCICAR_FUNCNUM(x)             (((x)&0x00000007)<<8)
++#define MCF_PCICAR_DEVNUM(x)              (((x)&0x0000001F)<<11)
++#define MCF_PCICAR_BUSNUM(x)              (((x)&0x000000FF)<<16)
++#define MCF_PCICAR_E                      (0x80000000)
++
++/* Bit definitions and macros for MCF_PCITPSR */
++#define MCF_PCITPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PCITTCR */
++#define MCF_PCITTCR_DI                    (0x00000001)
++#define MCF_PCITTCR_W                     (0x00000010)
++#define MCF_PCITTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
++#define MCF_PCITTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
++#define MCF_PCITTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
++
++/* Bit definitions and macros for MCF_PCITER */
++#define MCF_PCITER_NE                     (0x00010000)
++#define MCF_PCITER_IAE                    (0x00020000)
++#define MCF_PCITER_TAE                    (0x00040000)
++#define MCF_PCITER_RE                     (0x00080000)
++#define MCF_PCITER_SE                     (0x00100000)
++#define MCF_PCITER_FEE                    (0x00200000)
++#define MCF_PCITER_ME                     (0x01000000)
++#define MCF_PCITER_BE                     (0x08000000)
++#define MCF_PCITER_CM                     (0x10000000)
++#define MCF_PCITER_RF                     (0x40000000)
++#define MCF_PCITER_RC                     (0x80000000)
++
++/* Bit definitions and macros for MCF_PCITDCR */
++#define MCF_PCITDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
++#define MCF_PCITDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PCITSR */
++#define MCF_PCITSR_IA                     (0x00010000)
++#define MCF_PCITSR_TA                     (0x00020000)
++#define MCF_PCITSR_RE                     (0x00040000)
++#define MCF_PCITSR_SE                     (0x00080000)
++#define MCF_PCITSR_FE                     (0x00100000)
++#define MCF_PCITSR_BE1                    (0x00200000)
++#define MCF_PCITSR_BE2                    (0x00400000)
++#define MCF_PCITSR_BE3                    (0x00800000)
++#define MCF_PCITSR_NT                     (0x01000000)
++
++/* Bit definitions and macros for MCF_PCITFSR */
++#define MCF_PCITFSR_EMT                   (0x00010000)
++#define MCF_PCITFSR_ALARM                 (0x00020000)
++#define MCF_PCITFSR_FU                    (0x00040000)
++#define MCF_PCITFSR_FR                    (0x00080000)
++#define MCF_PCITFSR_OF                    (0x00100000)
++#define MCF_PCITFSR_UF                    (0x00200000)
++#define MCF_PCITFSR_RXW                   (0x00400000)
++
++/* Bit definitions and macros for MCF_PCITFCR */
++#define MCF_PCITFCR_OF_MSK                (0x00080000)
++#define MCF_PCITFCR_UF_MSK                (0x00100000)
++#define MCF_PCITFCR_RXW_MSK               (0x00200000)
++#define MCF_PCITFCR_FAE_MSK               (0x00400000)
++#define MCF_PCITFCR_IP_MSK                (0x00800000)
++#define MCF_PCITFCR_GR(x)                 (((x)&0x00000007)<<24)
++
++/* Bit definitions and macros for MCF_PCITFAR */
++#define MCF_PCITFAR_ALARM(x)              (((x)&0x0000007F)<<0)
++
++/* Bit definitions and macros for MCF_PCITFRPR */
++#define MCF_PCITFRPR_READ(x)              (((x)&0x00000FFF)<<0)
++
++/* Bit definitions and macros for MCF_PCITFWPR */
++#define MCF_PCITFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
++
++/* Bit definitions and macros for MCF_PCIRPSR */
++#define MCF_PCIRPSR_PKTSIZE(x)            (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PCIRTCR */
++#define MCF_PCIRTCR_DI                    (0x00000001)
++#define MCF_PCIRTCR_W                     (0x00000010)
++#define MCF_PCIRTCR_MAXBEATS(x)           (((x)&0x00000007)<<8)
++#define MCF_PCIRTCR_FB                    (0x00001000)
++#define MCF_PCIRTCR_MAXRETRY(x)           (((x)&0x000000FF)<<16)
++#define MCF_PCIRTCR_PCICMD(x)             (((x)&0x0000000F)<<24)
++
++/* Bit definitions and macros for MCF_PCIRER */
++#define MCF_PCIRER_NE                     (0x00010000)
++#define MCF_PCIRER_IAE                    (0x00020000)
++#define MCF_PCIRER_TAE                    (0x00040000)
++#define MCF_PCIRER_RE                     (0x00080000)
++#define MCF_PCIRER_SE                     (0x00100000)
++#define MCF_PCIRER_FEE                    (0x00200000)
++#define MCF_PCIRER_ME                     (0x01000000)
++#define MCF_PCIRER_BE                     (0x08000000)
++#define MCF_PCIRER_CM                     (0x10000000)
++#define MCF_PCIRER_FE                     (0x20000000)
++#define MCF_PCIRER_RF                     (0x40000000)
++#define MCF_PCIRER_RC                     (0x80000000)
++
++/* Bit definitions and macros for MCF_PCIRDCR */
++#define MCF_PCIRDCR_PKTSDONE(x)           (((x)&0x0000FFFF)<<0)
++#define MCF_PCIRDCR_BYTESDONE(x)          (((x)&0x0000FFFF)<<16)
++
++/* Bit definitions and macros for MCF_PCIRSR */
++#define MCF_PCIRSR_IA                     (0x00010000)
++#define MCF_PCIRSR_TA                     (0x00020000)
++#define MCF_PCIRSR_RE                     (0x00040000)
++#define MCF_PCIRSR_SE                     (0x00080000)
++#define MCF_PCIRSR_FE                     (0x00100000)
++#define MCF_PCIRSR_BE1                    (0x00200000)
++#define MCF_PCIRSR_BE2                    (0x00400000)
++#define MCF_PCIRSR_BE3                    (0x00800000)
++#define MCF_PCIRSR_NT                     (0x01000000)
++
++/* Bit definitions and macros for MCF_PCIRFSR */
++#define MCF_PCIRFSR_EMT                   (0x00010000)
++#define MCF_PCIRFSR_ALARM                 (0x00020000)
++#define MCF_PCIRFSR_FU                    (0x00040000)
++#define MCF_PCIRFSR_FR                    (0x00080000)
++#define MCF_PCIRFSR_OF                    (0x00100000)
++#define MCF_PCIRFSR_UF                    (0x00200000)
++#define MCF_PCIRFSR_RXW                   (0x00400000)
++
++/* Bit definitions and macros for MCF_PCIRFCR */
++#define MCF_PCIRFCR_OF_MSK                (0x00080000)
++#define MCF_PCIRFCR_UF_MSK                (0x00100000)
++#define MCF_PCIRFCR_RXW_MSK               (0x00200000)
++#define MCF_PCIRFCR_FAE_MSK               (0x00400000)
++#define MCF_PCIRFCR_IP_MSK                (0x00800000)
++#define MCF_PCIRFCR_GR(x)                 (((x)&0x00000007)<<24)
++
++/* Bit definitions and macros for MCF_PCIRFAR */
++#define MCF_PCIRFAR_ALARM(x)              (((x)&0x0000007F)<<0)
++
++/* Bit definitions and macros for MCF_PCIRFRPR */
++#define MCF_PCIRFRPR_READ(x)              (((x)&0x00000FFF)<<0)
++
++/* Bit definitions and macros for MCF_PCIRFWPR */
++#define MCF_PCIRFWPR_WRITE(x)             (((x)&0x00000FFF)<<0)
++
++
++/* Bit definitions and macros for MCF_PCIARB_PACR */
++#define MCF_PCIARB_PACR_INTMPRI         (0x00000001)
++#define MCF_PCIARB_PACR_EXTMPRI(x)      (((x)&0x0000001F)<<1)
++#define MCF_PCIARB_PACR_INTMINTEN       (0x00010000)
++#define MCF_PCIARB_PACR_EXTMINTEN(x)    (((x)&0x0000001F)<<17)
++#define MCF_PCIARB_PACR_PKMD            (0x40000000)
++#define MCF_PCIARB_PACR_DS              (0x80000000)
++
++/* Bit definitions and macros for MCF_PCIARB_PASR */
++#define MCF_PCIARB_PASR_ITLMBK          (0x00010000)
++#define MCF_PCIARB_PASR_EXTMBK(x)       (((x)&0x0000001F)<<17)
++
++#endif /* __MCF548X_PCI_H__ */
+--- a/include/asm-m68k/pci.h
++++ b/include/asm-m68k/pci.h
+@@ -1,94 +1,10 @@
+-/*
+- * asm-m68k/pci.h - m68k specific PCI declarations.
+- *
+- * Coldfire Implementation Copyright (c) 2007 Freescale Semiconductor, Inc.
+- *    Kurt Mahan <kmahan@freescale.com>
+- */
+-#ifndef _ASM_M68K_PCI_H
+-#define _ASM_M68K_PCI_H
++#ifndef M68K_PCI_H
++#define M68K_PCI_H
+-#ifndef CONFIG_PCI
+-/*
+- * The PCI address space does equal the physical memory
+- * address space.  The networking and block device layers use
+- * this boolean for bounce buffer decisions.
+- */
+-#define PCI_DMA_BUS_IS_PHYS           (1)
++#ifdef CONFIG_M5445X
++#include "5445x_pci.h"
+ #else
+-#include <asm-generic/pci-dma-compat.h>
+-
+-/*
+- * The PCI address space does equal the physical memory
+- * address space.  The networking and block device layers use
+- * this boolean for bounce buffer decisions.
+- */
+-#define PCI_DMA_BUS_IS_PHYS           (1)
+-
+-#define PCIBIOS_MIN_IO                        0x00004000
+-#define PCIBIOS_MIN_MEM                       0x02000000
+-
+-#define pcibios_assign_all_busses()   0
+-#define pcibios_scan_all_fns(a, b)    0
+-
+-static inline void
+-pcibios_set_master(struct pci_dev *dev)
+-{
+-      /* no special bus mastering setup handling */
+-}
+-
+-static inline void
+-pcibios_penalize_isa_irq(int irq, int active)
+-{
+-      /* no dynamic PCI IRQ allocation */
+-}
+-
+-#if 0
+-static inline void
+-pcibios_add_platform_entries(struct pci_dev *dev)
+-{
+-      /* no special handling */
+-}
++#include "548x_pci.h"
+ #endif
+-static inline void
+-pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
+-                       struct resource *res)
+-{
+-#ifdef CONFIG_M54455
+-      if ((res->start == 0xa0000000) || (res->start == 0xa8000000)) {
+-              /* HACK!  FIX! kludge to fix bridge mapping */
+-              region->start = res->start & 0x0fffffff;
+-              region->end = res->end & 0x0fffffff;
+-      } else {
+-              region->start = res->start;
+-              region->end = res->end;
+-      }
+-#else
+-      region->start = res->start;
+-      region->end = res->end;
+-#endif
+-}
+-
+-static inline void
+-pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
+-                      struct pci_bus_region *region)
+-{
+-      res->start = region->start;
+-      res->end = region->end;
+-}
+-
+-static inline struct resource *
+-pcibios_select_root(struct pci_dev *pdev, struct resource *res)
+-{
+-      struct resource *root = NULL;
+-
+-      if (res->flags & IORESOURCE_IO)
+-              root = &ioport_resource;
+-      if (res->flags & IORESOURCE_MEM)
+-              root = &iomem_resource;
+-
+-      return root;
+-}
+-
+-#endif /* CONFIG_PCI */
+-#endif /* _ASM_M68K_PCI_H */
++#endif /* M68K_PCI_H */
+--- a/include/asm-m68k/raw_io.h
++++ b/include/asm-m68k/raw_io.h
+@@ -46,6 +46,29 @@ extern void __iounmap(void *addr, unsign
+ #define out_le16(addr,w) (void)((*(__force volatile __le16 *) (addr)) = cpu_to_le16(w))
+ #define out_le32(addr,l) (void)((*(__force volatile __le32 *) (addr)) = cpu_to_le32(l))
++#if (defined CONFIG_COLDFIRE) && (defined CONFIG_PCI)
++unsigned char  pci_inb(long addr);
++unsigned short pci_inw(long addr);
++unsigned long  pci_inl(long addr);
++void pci_outb(unsigned char  val, long addr);
++void pci_outw(unsigned short val, long addr);
++void pci_outl(unsigned long  val, long addr);
++unsigned short pci_raw_inw(long addr);
++unsigned long  pci_raw_inl(long addr);
++void pci_raw_outw(unsigned short val, long addr);
++void pci_raw_outl(unsigned long  val, long addr);
++#define raw_inb(port) pci_inb((long)((volatile unsigned char *)(port)))
++#define raw_inw(port) pci_raw_inw((long)((volatile unsigned short *)(port)))
++#define raw_inl(port) pci_raw_inl((long)((volatile unsigned long *)(port)))
++
++#define raw_outb(val,port) pci_outb((val),(long)((volatile unsigned char *)(port)))
++#define raw_outw(val,port) pci_raw_outw((val),(long)((volatile unsigned short *)(port)))
++#define raw_outl(val,port) pci_raw_outl((val),(long)((volatile unsigned long *)(port)))
++
++#define swap_inw(port) pci_inw((long)((volatile unsigned short *)(port)))
++#define swap_outw(val,port) pci_outw((val),(long)((volatile unsigned short *)(port)))
++
++#else
+ #define raw_inb in_8
+ #define raw_inw in_be16
+ #define raw_inl in_be32
+@@ -60,6 +83,9 @@ extern void __iounmap(void *addr, unsign
+ #define __raw_writew(val,addr) out_be16((addr),(val))
+ #define __raw_writel(val,addr) out_be32((addr),(val))
++#define swap_inw(port) in_le16((port))
++#define swap_outw(val,port) out_le16((port),(val))
++#endif
+ static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
+ {
+       unsigned int i;
+--- a/include/asm-m68k/virtconvert.h
++++ b/include/asm-m68k/virtconvert.h
+@@ -46,9 +46,14 @@ static inline void *phys_to_virt(unsigne
+ #define virt_to_bus(a) (virt_to_phys(a) + (MACH_IS_HADES ? 0x80000000 : 0))
+ #define bus_to_virt(a) (phys_to_virt((a) - (MACH_IS_HADES ? 0x80000000 : 0)))
+ #else
++#ifdef CONFIG_COLDFIRE
++#define virt_to_bus(a) (a - PAGE_OFFSET + PCI_DMA_BASE)
++#define bus_to_virt(a) (a - PCI_DMA_BASE + PAGE_OFFSET)
++#else /* CONFIG_COLDFIRE */
+ #define virt_to_bus virt_to_phys
+ #define bus_to_virt phys_to_virt
+ #endif
++#endif
+ #endif
+ #endif
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -458,8 +458,10 @@ int __must_check pcibios_enable_device(s
+ char *pcibios_setup(char *str);
+ /* Used only when drivers/pci/setup.c is used */
++#ifndef CONFIG_COLDFIRE
+ void pcibios_align_resource(void *, struct resource *, resource_size_t,
+                               resource_size_t);
++#endif
+ void pcibios_update_irq(struct pci_dev *, int irq);
+ /* Generic PCI functions used internally */
diff --git a/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch b/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch
new file mode 100644 (file)
index 0000000..7eb27ee
--- /dev/null
@@ -0,0 +1,1266 @@
+From a4c49cdc530046ded7a9fbfe9e13eab10d3973c7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 10 Jul 2008 19:19:29 -0600
+Subject: [PATCH] Add PCI Video SM712.
+
+LTIBName: m547x-8x-pci-video-sm712
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+---
+ drivers/video/Kconfig           |   10 +
+ drivers/video/Makefile          |    1 +
+ drivers/video/cfbimgblt.c       |    8 +-
+ drivers/video/console/bitblit.c |   12 +
+ drivers/video/console/fbcon.c   |    7 +-
+ drivers/video/smifb.c           |  949 +++++++++++++++++++++++++++++++++++++++
+ drivers/video/smifb.h           |  149 ++++++
+ include/linux/fb.h              |   13 +-
+ 8 files changed, 1142 insertions(+), 7 deletions(-)
+ create mode 100644 drivers/video/smifb.c
+ create mode 100644 drivers/video/smifb.h
+
+--- a/drivers/video/Kconfig
++++ b/drivers/video/Kconfig
+@@ -201,6 +201,16 @@ config FB_TILEBLITTING
+ comment "Frame buffer hardware drivers"
+       depends on FB
++config FB_SMI
++      tristate "SiliconMotion Lynx support"
++      depends on FB && PCI
++      select FB_CFB_FILLRECT
++      select FB_CFB_COPYAREA
++      select FB_CFB_IMAGEBLIT
++      ---help---
++        This enables support for the Silicon Motion Lynx family of graphic
++        chips. It has been tested on ColdFire.
++
+ config FB_CIRRUS
+       tristate "Cirrus Logic support"
+       depends on FB && (ZORRO || PCI)
+--- a/drivers/video/Makefile
++++ b/drivers/video/Makefile
+@@ -28,6 +28,7 @@ obj-$(CONFIG_FB_DDC)           += fb_ddc
+ obj-$(CONFIG_FB_DEFERRED_IO)   += fb_defio.o
+ # Hardware specific drivers go first
++obj-$(CONFIG_FB_SMI)              += smifb.o
+ obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p.o
+ obj-$(CONFIG_FB_ARC)              += arcfb.o
+ obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o
+--- a/drivers/video/cfbimgblt.c
++++ b/drivers/video/cfbimgblt.c
+@@ -44,12 +44,12 @@
+ #endif
+ static const u32 cfb_tab8[] = {
+-#if defined(__BIG_ENDIAN)
++#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
+     0x00000000,0x000000ff,0x0000ff00,0x0000ffff,
+     0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff,
+     0xff000000,0xff0000ff,0xff00ff00,0xff00ffff,
+     0xffff0000,0xffff00ff,0xffffff00,0xffffffff
+-#elif defined(__LITTLE_ENDIAN)
++#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
+     0x00000000,0xff000000,0x00ff0000,0xffff0000,
+     0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00,
+     0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff,
+@@ -60,9 +60,9 @@ static const u32 cfb_tab8[] = {
+ };
+ static const u32 cfb_tab16[] = {
+-#if defined(__BIG_ENDIAN)
++#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
+     0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff
+-#elif defined(__LITTLE_ENDIAN)
++#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
+     0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff
+ #else
+ #error FIXME: No endianness??
+--- a/drivers/video/console/bitblit.c
++++ b/drivers/video/console/bitblit.c
+@@ -78,7 +78,11 @@ static inline void bit_putcs_aligned(str
+                                    u32 d_pitch, u32 s_pitch, u32 cellsize,
+                                    struct fb_image *image, u8 *buf, u8 *dst)
+ {
++#ifndef CONFIG_COLDFIRE
+       u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#else
++        u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#endif
+       u32 idx = vc->vc_font.width >> 3;
+       u8 *src;
+@@ -111,7 +115,11 @@ static inline void bit_putcs_unaligned(s
+                                      struct fb_image *image, u8 *buf,
+                                      u8 *dst)
+ {
++#ifndef CONFIG_COLDFIRE
+       u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#else
++        u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#endif
+       u32 shift_low = 0, mod = vc->vc_font.width % 8;
+       u32 shift_high = 8;
+       u32 idx = vc->vc_font.width >> 3;
+@@ -238,7 +246,11 @@ static void bit_cursor(struct vc_data *v
+ {
+       struct fb_cursor cursor;
+       struct fbcon_ops *ops = info->fbcon_par;
++#ifndef CONFIG_COLDFIRE
+       unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#else
++        unsigned long charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
++#endif
+       int w = (vc->vc_font.width + 7) >> 3, c;
+       int y = real_y(ops->p, vc->vc_y);
+       int attribute, use_sw = (vc->vc_cursor_type & 0x10);
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -2679,8 +2679,11 @@ static int fbcon_set_palette(struct vc_d
+ {
+       struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
+       int i, j, k, depth;
+-      u8 val;
+-
++#ifndef CONFIG_COLDFIRE
++        u8 val;
++#else
++        u32 val;
++#endif
+       if (fbcon_is_inactive(vc, info))
+               return -EINVAL;
+--- /dev/null
++++ b/drivers/video/smifb.c
+@@ -0,0 +1,949 @@
++/***************************************************************************
++        smifb.c  -  Silicon Motion, Inc. LynxEM+ frame buffer device
++                             -------------------
++    begin                : Thu Aug 9 2001
++    copyright            : (C) 2001 by Szu-Tao Huang
++    email                : johuang@siliconmotion.com
++ ***************************************************************************/
++
++/***************************************************************************
++ *                                                                         *
++ *   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/module.h>
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/string.h>
++#include <linux/mm.h>
++#include <linux/tty.h>
++#include <linux/slab.h>
++#include <linux/delay.h>
++#include <linux/fb.h>
++#include <linux/pci.h>
++#include <linux/init.h>
++
++#include <asm/io.h>
++#include <asm/irq.h>
++#include <asm/pgtable.h>
++#include <asm/system.h>
++#include <asm/uaccess.h>
++
++#include "console/fbcon.h"
++
++/*
++#include <video/fbcon.h>
++#include <video/fbcon-cfb8.h>
++#include <video/fbcon-cfb16.h>
++#include <video/fbcon-cfb24.h>
++*/
++
++#include <linux/fb.h>
++
++static char *SMIRegs;         // point to virtual Memory Map IO starting address
++static char *SMILFB;          // point to virtual video memory starting address
++static struct par_info hw;    // used to record hardware information
++
++#include "smifb.h"
++
++struct ModeInit VGAMode[numVGAModes] =
++{
++      {
++              /*  mode#0: 640 x 480  8Bpp  60Hz */
++              640, 480, 8, 60,
++              /*  Init_MISC */
++              0xE3,
++              {   /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x00, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
++                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
++                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
++                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
++                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
++                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
++                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
++                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
++                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
++                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
++                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
++                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
++              },
++      },
++      {
++              /*  mode#1: 640 x 480  16Bpp  60Hz */
++              640, 480, 16, 60,
++              /*  Init_MISC */
++              0xE3,
++              {   /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x00, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
++                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
++                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
++                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
++                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
++                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
++                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
++                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
++                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
++                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
++                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
++                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
++              },
++      },
++      {
++              /*  mode#2: 640 x 480  24Bpp  60Hz */
++              640, 480, 24, 60,
++              /*  Init_MISC */
++              0xE3,
++              {   /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x00, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
++                      0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
++                      0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
++                      0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
++                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
++                      0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
++                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
++                      0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
++                      0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
++                      0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
++                      0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
++                      0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
++              },
++      },
++      {/*  mode#3: 800 x 600  8Bpp  60Hz */
++              800,600,8,60,
++              0x2B,   /*  Init_MISC */
++              {       /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x03, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
++                      0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
++                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
++                      0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
++                      0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
++                      0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0xFF, 0x87, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
++                      0x90, 0x01, 0x2C, 0x01, 0xFF, 0x00, 0x24, 0x24,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
++                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
++                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
++                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
++                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
++                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
++              },
++      },
++      {/*  mode#4: 800 x 600  16Bpp  60Hz */
++              800, 600, 16, 60,
++              /*  Init_MISC */
++              0x2B,
++              {   /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x03, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
++                      0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
++                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
++                      0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
++                      0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
++                      0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
++                      0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
++                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
++                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
++                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
++                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
++                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
++              },
++      },
++              {/*  mode#5: 800 x 600  24Bpp  60Hz */
++              800,600,24,60,
++              0x2B,
++              {   /*  Init_SR0_SR4 */
++                      0x03, 0x01, 0x0F, 0x03, 0x0E,
++              },
++              {   /*  Init_SR10_SR24 */
++                      0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
++                      0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0xC4, 0x30, 0x02, 0x01, 0x01,
++              },
++              {   /*  Init_SR30_SR75 */
++                      0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,
++                      0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,
++                      0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
++                      0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,
++                      0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
++                      0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,
++                      0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
++                      0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
++                      0x02, 0x45, 0x30, 0x30, 0x40, 0x20,
++              },
++              {   /*  Init_SR80_SR93 */
++                      0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,
++                      0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,
++                      0x00, 0x00, 0x00, 0x00,
++              },
++              {   /*  Init_SRA0_SRAF */
++                      0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
++                      0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
++              },
++              {   /*  Init_GR00_GR08 */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
++                      0xFF,
++              },
++              {   /*  Init_AR00_AR14 */
++                      0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
++                      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
++                      0x41, 0x00, 0x0F, 0x00, 0x00,
++              },
++              {   /*  Init_CR00_CR18 */
++                      0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
++                      0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++                      0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
++                      0xFF,
++              },
++              {   /*  Init_CR30_CR4D */
++                      0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
++                      0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
++                      0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
++                      0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
++              },
++              {   /*  Init_CR90_CRA7 */
++                      0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
++                      0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
++                      0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
++              },
++      },
++};
++
++static void smi_set_timing(struct smifb_info *sfb,struct par_info *hw)
++{
++      int i=0,j=0;
++        u32 m_nScreenStride;
++
++
++    for (j=0;j < numVGAModes;j++) {
++              if (VGAMode[j].mmSizeX == hw->width &&
++                      VGAMode[j].mmSizeY == hw->height &&
++                      VGAMode[j].bpp == sfb->fb.var.bits_per_pixel &&
++                      VGAMode[j].hz == hw->hz)
++              {
++                      
++                      smi_mmiowb(0x0,0x3c6);
++
++                      smi_seqw(0,0x1);
++
++                      smi_mmiowb(VGAMode[j].Init_MISC,0x3c2);
++
++                      for (i=0;i<SIZE_SR00_SR04;i++)  // init SEQ register SR00 - SR04
++                      {
++                              smi_seqw(i,VGAMode[j].Init_SR00_SR04[i]);
++                      }
++
++                      for (i=0;i<SIZE_SR10_SR24;i++)  // init SEQ register SR10 - SR24
++                      {
++                              smi_seqw(i+0x10,VGAMode[j].Init_SR10_SR24[i]);
++                      }
++
++                      for (i=0;i<SIZE_SR30_SR75;i++)  // init SEQ register SR30 - SR75
++                      {
++                              if (((i+0x30) != 0x62) && ((i+0x30) != 0x6a) && ((i+0x30) != 0x6b))
++                                      smi_seqw(i+0x30,VGAMode[j].Init_SR30_SR75[i]);
++                      }
++                      for (i=0;i<SIZE_SR80_SR93;i++)  // init SEQ register SR80 - SR93
++                      {
++                              smi_seqw(i+0x80,VGAMode[j].Init_SR80_SR93[i]);
++                      }
++                      for (i=0;i<SIZE_SRA0_SRAF;i++)  // init SEQ register SRA0 - SRAF
++                      {
++                              smi_seqw(i+0xa0,VGAMode[j].Init_SRA0_SRAF[i]);
++                      }
++
++                      for (i=0;i<SIZE_GR00_GR08;i++)  // init Graphic register GR00 - GR08
++                      {
++                              smi_grphw(i,VGAMode[j].Init_GR00_GR08[i]);
++                      }
++
++                      for (i=0;i<SIZE_AR00_AR14;i++)  // init Attribute register AR00 - AR14
++                      {
++
++                              smi_attrw(i,VGAMode[j].Init_AR00_AR14[i]);
++                      }
++
++                      for (i=0;i<SIZE_CR00_CR18;i++)  // init CRTC register CR00 - CR18
++                      {
++                              smi_crtcw(i,VGAMode[j].Init_CR00_CR18[i]);
++                      }
++
++                      for (i=0;i<SIZE_CR30_CR4D;i++)  // init CRTC register CR30 - CR4D
++                      {
++                              smi_crtcw(i+0x30,VGAMode[j].Init_CR30_CR4D[i]);
++                      }
++
++                      for (i=0;i<SIZE_CR90_CRA7;i++)  // init CRTC register CR90 - CRA7
++                      {
++                              smi_crtcw(i+0x90,VGAMode[j].Init_CR90_CRA7[i]);
++                      }
++              }
++      }
++      smi_mmiowb(0x67,0x3c2);
++      // set VPR registers
++      writel(0x0,hw->m_pVPR+0x0C);
++      writel(0x0,hw->m_pVPR+0x40);
++      // set data width
++      m_nScreenStride = (hw->width * sfb->fb.var.bits_per_pixel) / 64;
++      switch (sfb->fb.var.bits_per_pixel)
++      {
++              case 8:
++                      writel(0x0,hw->m_pVPR+0x0);
++                      break;
++              case 16:
++                      writel(0x00020000,hw->m_pVPR+0x0);
++                      break;
++              case 24:
++                      writel(0x00040000,hw->m_pVPR+0x0);
++                      break;
++      }
++      writel((u32)(((m_nScreenStride + 2) << 16) | m_nScreenStride),hw->m_pVPR+0x10);
++}
++
++/*
++ * Set the color palette
++ */
++static int
++smifb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
++                 u_int trans, struct fb_info *info)
++{
++      
++      struct smifb_info *sfb = (struct smifbinfo *)info;
++      u32 *pal;
++
++      switch (sfb->fb.fix.visual) {
++      case FB_VISUAL_TRUECOLOR:               /* RGB 5:6:5 True Colour */
++              pal = sfb->fb.pseudo_palette;   // System has 16 default color
++              if (regno >= 16)
++                      return 1;
++
++              pal[regno] = (red & 0xf800) |
++                  ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
++              break;
++      }
++
++      return 0;
++}
++
++/*
++ *  smifb_decode_var():
++ *    Get the video params out of 'var'. If a value doesn't fit, round it up,
++ *    if it's too big, return -EINVAL.
++ *
++ *    Suggestion: Round up in the following order: bits_per_pixel, xres,
++ *    yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale,
++ *    bitfields, horizontal timing, vertical timing.
++ */
++static int smifb_decode_var(struct fb_var_screeninfo *var, struct smifb_info *sfb, struct par_info *hw)
++{
++    hw->width = var->xres;
++    hw->height = var->yres;
++    hw->hz = 60;
++
++      return 0;
++}
++
++static int smifb_set_par (struct fb_info *info)
++{
++      struct smifb_info *sfb = (struct smifb_info *)info;
++      int err, chgvar = 0;
++      struct fb_var_screeninfo *var = &info->var;
++      struct fb_cmap *cmap;
++
++
++      /*
++       * Decode var contents into a par structure, adjusting any
++       * out of range values.
++       */
++      err = smifb_decode_var(var, sfb, &hw);
++      if (err) {
++              return err;
++      }
++
++      if (hw.width != var->xres)
++              chgvar = 1;
++      if (hw.height != var->yres)
++              chgvar = 1;
++
++      var->activate           &= ~FB_ACTIVATE_ALL;
++
++      smi_set_timing(sfb, &hw);
++
++      sfb->palette_size = var->bits_per_pixel == 8 ? 256 : 16;
++      cmap = fb_default_cmap(sfb->palette_size);
++      fb_set_cmap(cmap, &sfb->fb);
++
++      return 0;
++}
++
++static int smifb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
++{
++      var->bits_per_pixel += 7;
++      var->bits_per_pixel &= ~7;
++
++      var->xres_virtual =
++          var->xres_virtual < var->xres ? var->xres : var->xres_virtual;
++      var->yres_virtual =
++          var->yres_virtual < var->yres ? var->yres : var->yres_virtual;
++
++      switch (var->bits_per_pixel) {
++      case 8:
++      case 16:                /* RGB 565 */
++    case 24:
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      switch (var->bits_per_pixel) {
++      case 16:
++              var->red.offset = 11;
++              var->red.length = 5;
++              var->green.offset       = 5;
++              var->green.length       = 6;
++              var->blue.offset        = 0;
++              var->blue.length        = 5;
++
++              info->fix.visual                = FB_VISUAL_TRUECOLOR;
++              info->fix.line_length= var->xres * 2;
++
++              break;
++      default:
++              return -EINVAL; /* We don't support anything other than 16bpp for now. --NL */
++              break;
++      }
++      return 0;
++
++//    smifb_set_color_bitfields(var);
++
++    return 0;
++}
++
++/*
++ * Formal definition of the VESA spec:
++ *  On
++ *    This refers to the state of the display when it is in full operation
++ *  Stand-By
++ *    This defines an optional operating state of minimal power reduction with
++ *    the shortest recovery time
++ *  Suspend
++ *    This refers to a level of power management in which substantial power
++ *    reduction is achieved by the display.  The display can have a longer
++ *    recovery time from this state than from the Stand-by state
++ *  Off
++ *    This indicates that the display is consuming the lowest level of power
++ *    and is non-operational. Recovery from this state may optionally require
++ *    the user to manually power on the monitor
++ *
++ *  Now, the fbdev driver adds an additional state, (blank), where they
++ *  turn off the video (maybe by colormap tricks), but don't mess with the
++ *  video itself: think of it semantically between on and Stand-By.
++ *
++ *  So here's what we should do in our fbdev blank routine:
++ *
++ *    VESA_NO_BLANKING (mode 0)       Video on,  front/back light on
++ *    VESA_VSYNC_SUSPEND (mode 1)     Video on,  front/back light off
++ *    VESA_HSYNC_SUSPEND (mode 2)     Video on,  front/back light off
++ *    VESA_POWERDOWN (mode 3)         Video off, front/back light off
++ *
++ *  This will match the matrox implementation.
++ */
++/*
++ * smifb_blank():
++ *    Blank the display by setting all palette values to zero.  Note, the
++ *    12 and 16 bpp modes don't really use the palette, so this will not
++ *      blank the display in all modes.
++ */
++static int smifb_blank(int blank, struct fb_info *info)
++{
++//    struct smifb_info *sfb = (struct smifb_info *)info;
++#if 0
++      switch (blank) {
++      case VESA_POWERDOWN:
++      case VESA_VSYNC_SUSPEND:
++      case VESA_HSYNC_SUSPEND:
++      case VESA_NO_BLANKING:
++      }
++#endif
++      return 1;
++}
++
++static struct fb_ops smifb_ops = {
++      .owner          = THIS_MODULE,
++      .fb_check_var   = smifb_check_var,
++      .fb_set_par     = smifb_set_par,
++      .fb_setcolreg   = smifb_setcolreg,
++      .fb_blank       = smifb_blank,
++      
++      /* Accelerated functions, using softversions, per se */
++      .fb_fillrect    = cfb_fillrect,
++      .fb_copyarea    = cfb_copyarea,
++      .fb_imageblit   = cfb_imageblit,
++      .fb_cursor      = soft_cursor,
++};
++
++/*
++ * Alloc struct smifb_info and assign the default value
++ */
++static struct smifb_info * __devinit
++smi_alloc_fb_info(struct pci_dev *dev, char *name)
++{
++    struct smifb_info *sfb;
++
++    sfb = kmalloc(sizeof(struct smifb_info) + sizeof(u32) * 16, GFP_KERNEL);
++
++    if (!sfb)
++        return NULL;
++
++    memset(sfb, 0, sizeof(struct smifb_info));
++
++    sfb->currcon        = -1;
++    sfb->dev            = dev;
++
++    strcpy(sfb->fb.fix.id, name);
++
++    sfb->fb.fix.type          = FB_TYPE_PACKED_PIXELS;
++    sfb->fb.fix.type_aux      = 0;
++    sfb->fb.fix.xpanstep      = 0;
++    sfb->fb.fix.ypanstep      = 0;
++    sfb->fb.fix.ywrapstep     = 0;
++    sfb->fb.fix.accel         = FB_ACCEL_NONE;
++
++    sfb->fb.var.nonstd                = 0;
++    sfb->fb.var.activate      = FB_ACTIVATE_NOW;
++    sfb->fb.var.height                = -1;
++    sfb->fb.var.width         = -1;
++    sfb->fb.var.accel_flags   = 0;
++    sfb->fb.var.vmode         = FB_VMODE_NONINTERLACED;
++
++    sfb->fb.fbops             = &smifb_ops;
++    sfb->fb.flags             = FBINFO_FLAG_DEFAULT;
++    sfb->fb.node              = -1;
++    sfb->fb.pseudo_palette    = (void *)(&sfb->palette_size + 1);
++
++    return sfb;
++}
++
++/*
++ * Unmap in the memory mapped IO registers
++ *
++ */
++
++static void __devinit
++smi_unmap_mmio(struct smifb_info *sfb)
++{
++    if (sfb && SMILFB)
++    {
++        iounmap(SMILFB);
++        SMIRegs = NULL;
++    }
++}
++
++/*
++ * Map in the screen memory
++ *
++ */
++static int __devinit
++smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len)
++{
++
++    sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
++    sfb->fb.fix.smem_len  = smem_len;
++    printk("%s:smem %x,len %x\n",sfb->fb.fix.smem_start,sfb->fb.fix.smem_len);
++    sfb->fb.screen_base = SMILFB;
++
++    if (!sfb->fb.screen_base)
++    {
++        printk("%s: unable to map screen memory\n",sfb->fb.fix.id);
++        return -ENOMEM;
++    }
++
++    return 0;
++}
++
++
++/*
++ * Unmap in the screen memory
++ *
++ */
++static void __devinit
++smi_unmap_smem(struct smifb_info *sfb)
++{
++    if (sfb && sfb->fb.screen_base)
++    {
++        iounmap(sfb->fb.screen_base);
++        sfb->fb.screen_base = NULL;
++    }
++}
++
++/*
++ * We need to wake up the LynxEM+, and make sure its in linear memory mode.
++ */
++static inline void __devinit
++smi_init_hw(void)
++{
++      /* The delays prevent the ColdFire PCI host from locking up. :/ --NL */
++      udelay(1000);
++    outb(0x18, 0x3c4);
++      udelay(1000);
++    outb(0x11, 0x3c5);
++      udelay(1000);
++      printk("%s: 0x3c4 =%x 0x3c5 %x\n",__FUNCTION__,inw(0x3c4),inw(0x3c5));
++}
++
++static void __devinit
++smi_free_fb_info(struct smifb_info *sfb)
++{
++      if (sfb) {
++              fb_alloc_cmap(&sfb->fb.cmap, 0, 0);
++              kfree(sfb);
++      }
++}
++
++
++u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720};
++
++int __init smifb_init(struct pci_dev *pdev, const struct pci_device_id *ent)
++{
++    struct smifb_info *sfb;
++    u_long smem_size;
++    char name[16];
++    int err;
++      char *m_pLAW;
++      ulong m_pLAWPhysical;
++
++    printk("%s start\n",__FUNCTION__);
++    sprintf(name, "smifb");
++
++    hw.chipID = pdev->device;
++    
++    err = -ENOMEM;
++    sfb = smi_alloc_fb_info(pdev, name);
++    if (!sfb) {
++        goto failed;
++    }
++
++    smi_init_hw();
++
++      // Map address and memory detection
++      m_pLAWPhysical = pci_resource_start(pdev,0);
++      printk("%s:m_pLAWPhysical %x,hw.chipID %x\n",__FUNCTION__,m_pLAWPhysical,hw.chipID);
++      switch (hw.chipID) {
++              case 0x710:
++              case 0x712:
++                      sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000;
++                      sfb->fb.fix.mmio_len   = 0x00100000;
++
++              hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000);
++              printk("%s:SMILFB%x\n",__FUNCTION__,SMILFB);
++              hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000;
++                      hw.m_pDPR = hw.m_pLFB + 0x00408000;
++                      hw.m_pVPR = hw.m_pLFB + 0x0040c000;
++
++              if (!SMIRegs)
++              {
++                      printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id);
++                      return -ENOMEM;
++              }
++
++                      smi_seqw(0x62,0x7A);
++              smi_seqw(0x6a,0x0c);
++              smi_seqw(0x6b,0x02);
++              smem_size = 0x00400000;
++
++              //LynxEM+ memory dection
++              *(u32 *)(SMILFB + 4) = 0xAA551133;
++              if (*(u32 *)(SMILFB + 4) != 0xAA551133)
++              {
++                      smem_size = 0x00200000;
++                      // Program the MCLK to 130 MHz
++                      smi_seqw(0x6a,0x12);
++                      smi_seqw(0x6b,0x02);
++                      smi_seqw(0x62,0x3e);
++              }
++                      break;
++              case 0x720:
++                      sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000;
++                      sfb->fb.fix.mmio_len   = 0x00040000;
++
++                      m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000);
++                      hw.m_pLFB = SMILFB = m_pLAW + 0x00200000;
++                      hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000;
++                      hw.m_pDPR = m_pLAW;
++                      hw.m_pVPR = m_pLAW + 0x800;
++
++                      smi_seqw(0x62,0xff);
++                      smi_seqw(0x6a,0x0d);
++                      smi_seqw(0x6b,0x02);
++                      smem_size = 0x00400000;
++
++                      break;
++      }
++
++      sfb->fb.var.xres = 640;
++      sfb->fb.var.yres = 480;
++      sfb->fb.var.bits_per_pixel = 16;
++
++      sfb->fb.var.xres_virtual = sfb->fb.var.xres;
++
++      sfb->fb.var.yres_virtual = sfb->fb.var.yres;
++      
++      sfb->fb.flags = FBINFO_FLAG_DEFAULT;
++
++      printk("%s:smem_size %x\n",__FUNCTION__,smem_size);
++    err = smi_map_smem(sfb, pdev, smem_size);
++      printk("%s:smi_map_smem error %x\n",__FUNCTION__,err);
++    if (err) {
++              goto failed;
++    }
++
++
++
++      fb_set_var(&sfb->fb, &sfb->fb.var);
++      smifb_check_var(&sfb->fb.var, &sfb->fb);
++      smifb_set_par(sfb);
++      printk("%s:register_framebuffer \n",__FUNCTION__);
++      err = register_framebuffer(&sfb->fb);
++      if (err < 0) {
++              goto failed;
++    }
++
++      printk("Silicon Motion, Inc. LynxEM+ Init complete.\n");
++
++      return 0;
++
++failed:
++      smi_unmap_smem(sfb);
++      smi_unmap_mmio(sfb);
++      smi_free_fb_info(sfb);
++      printk("Silicon Motion, Inc. LynxEM+ Init FAILED.n");
++
++      return err;
++}
++
++struct pci_device_id smifb_pci_tbl[] = {
++        { 0x126f, 0x710, PCI_ANY_ID, PCI_ANY_ID },
++        { 0x126f, 0x712, PCI_ANY_ID, PCI_ANY_ID },
++        { 0x126f, 0x720, PCI_ANY_ID, PCI_ANY_ID },
++        { 0 }
++};
++
++MODULE_DEVICE_TABLE(pci, smifb_pci_tbl);
++
++struct pci_driver smifb_driver = {
++        .name =         "smifb",
++        .id_table =     smifb_pci_tbl,
++        .probe =        smifb_init,
++};
++
++int __init smi_init(void)
++{
++      /*return pci_module_init(&smifb_driver);*/
++      return pci_register_driver(&smifb_driver);
++}
++
++module_init(smi_init);
++MODULE_LICENSE("GPL");
++
++
++
+--- /dev/null
++++ b/drivers/video/smifb.h
+@@ -0,0 +1,149 @@
++/***************************************************************************
++                      smifb.h  -  SiliconMotion LynxEM+ frame buffer device
++                             -------------------
++    begin                : Thu Aug 9 2001
++    copyright            : (C) 2001 by Szu-Tao Huang
++    email                : johuang@siliconmotion.com
++ ***************************************************************************/
++
++/***************************************************************************
++ *                                                                         *
++ *   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.                                   *
++ *                                                                         *
++ ***************************************************************************/
++
++#define smi_mmiowb(dat,reg)   writeb(dat, SMIRegs + reg)
++#define smi_mmioww(dat,reg)   writew(dat, SMIRegs + reg)
++#define smi_mmiowl(dat,reg)   writel(dat, SMIRegs + reg)
++
++#define smi_mmiorb(reg)               readb(SMIRegs + reg)
++#define smi_mmiorw(reg)               readw(SMIRegs + reg)
++#define smi_mmiorl(reg)               readl(SMIRegs + reg)
++
++#define SIZE_SR00_SR04      (0x04 - 0x00 + 1)
++#define SIZE_SR10_SR24      (0x24 - 0x10 + 1)
++#define SIZE_SR30_SR75      (0x75 - 0x30 + 1)
++#define SIZE_SR80_SR93      (0x93 - 0x80 + 1)
++#define SIZE_SRA0_SRAF      (0xAF - 0xA0 + 1)
++#define SIZE_GR00_GR08      (0x08 - 0x00 + 1)
++#define SIZE_AR00_AR14      (0x14 - 0x00 + 1)
++#define SIZE_CR00_CR18      (0x18 - 0x00 + 1)
++#define SIZE_CR30_CR4D      (0x4D - 0x30 + 1)
++#define SIZE_CR90_CRA7      (0xA7 - 0x90 + 1)
++#define SIZE_VPR                        (0x6C + 1)
++#define SIZE_DPR                      (0x44 + 1)
++
++#define numVGAModes                   6
++#define numChipIDs                    3
++
++#define NR_PALETTE    256
++#define NR_RGB          2
++
++/*
++ * Minimum X and Y resolutions
++ */
++#define MIN_XRES      640
++#define MIN_YRES      480
++
++static inline void smi_crtcw(int reg, int val)
++{
++        smi_mmiowb(reg, 0x3d4);
++        smi_mmiowb(val, 0x3d5);
++}
++
++static inline unsigned int smi_crtcr(int reg)
++{
++        smi_mmiowb(reg, 0x3d4);
++        return smi_mmiorb(0x3d5);
++}
++
++static inline void smi_grphw(int reg, int val)
++{
++        smi_mmiowb(reg, 0x3ce);
++        smi_mmiowb(val, 0x3cf);
++}
++
++static inline unsigned int smi_grphr(int reg)
++{
++        smi_mmiowb(reg, 0x3ce);
++        return smi_mmiorb(0x3cf);
++}
++
++static inline void smi_attrw(int reg, int val)
++{
++        smi_mmiorb(0x3da);
++        smi_mmiowb(reg, 0x3c0);
++        smi_mmiorb(0x3c1);
++        smi_mmiowb(val, 0x3c0);
++}
++
++static inline void smi_seqw(int reg, int val)
++{
++        smi_mmiowb(reg, 0x3c4);
++        smi_mmiowb(val, 0x3c5);
++}
++
++static inline unsigned int smi_seqr(int reg)
++{
++        smi_mmiowb(reg, 0x3c4);
++        return smi_mmiorb(0x3c5);
++}
++/*
++* Private structure
++*/
++struct smifb_info {
++        /*
++        * The following is a pointer to be passed into the
++        * functions below.  The modules outside the main
++        * smifb.c driver have no knowledge as to what
++        * is within this structure.
++        */
++        struct fb_info          fb;
++        struct display_switch   *dispsw;
++        struct pci_dev                *dev;
++        signed int              currcon;
++
++        struct {
++                u8 red, green, blue;
++        } palette[NR_RGB];
++
++        u_int                   palette_size;
++};
++
++struct par_info {
++      /*
++       * Hardware
++       */
++      u16             chipID;
++      char    *m_pLFB;
++      char    *m_pMMIO;
++      char    *m_pDPR;
++      char    *m_pVPR;
++
++      u_int   width;
++      u_int   height;
++      u_int   hz;
++};
++
++// The next structure holds all information relevant for a specific video mode.
++struct ModeInit
++{
++      int                       mmSizeX;
++      int                       mmSizeY;
++      int                       bpp;
++      int                       hz;
++      unsigned char Init_MISC;
++      unsigned char Init_SR00_SR04[SIZE_SR00_SR04];
++      unsigned char Init_SR10_SR24[SIZE_SR10_SR24];
++      unsigned char Init_SR30_SR75[SIZE_SR30_SR75];
++      unsigned char Init_SR80_SR93[SIZE_SR80_SR93];
++      unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF];
++      unsigned char Init_GR00_GR08[SIZE_GR00_GR08];
++      unsigned char Init_AR00_AR14[SIZE_AR00_AR14];
++      unsigned char Init_CR00_CR18[SIZE_CR00_CR18];
++      unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D];
++      unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7];
++};
+--- a/include/linux/fb.h
++++ b/include/linux/fb.h
+@@ -873,6 +873,17 @@ struct fb_info {
+ #define fb_writeq sbus_writeq
+ #define fb_memset sbus_memset_io
++#elif defined(CONFIG_COLDFIRE)
++#define fb_readb readb
++#define fb_readw readw
++#define fb_readl readl
++#define fb_readq readq
++#define fb_writeb writeb
++#define fb_writew writew
++#define fb_writel writel
++#define fb_writeq writeq
++#define fb_memset memset_io
++
+ #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__)
+ #define fb_readb __raw_readb
+@@ -899,7 +910,7 @@ struct fb_info {
+ #endif
+-#if defined (__BIG_ENDIAN)
++#if defined (__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
+ #define FB_LEFT_POS(bpp)          (32 - bpp)
+ #define FB_SHIFT_HIGH(val, bits)  ((val) >> (bits))
+ #define FB_SHIFT_LOW(val, bits)   ((val) << (bits))
diff --git a/target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch b/target/linux/coldfire/patches/080-mcfv4e_dspi_update.patch
new file mode 100644 (file)
index 0000000..a157616
--- /dev/null
@@ -0,0 +1,1378 @@
+From 771f4741de2cd8a103d96cd1e8281926448ff56d Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 15 Jul 2008 11:44:08 -0600
+Subject: [PATCH] Fix DSPI driver.
+
+Update to latest Matt Coldfire driver.  Fix timing issues with
+M547x/M548x END-OF-QUEUE notification.
+
+LTIBName: mcfv4e-dspi-update
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/m547x_8x-devices.c |   35 +-
+ drivers/spi/Kconfig                   |    6 +
+ drivers/spi/Makefile                  |    2 +-
+ drivers/spi/dspi_mcf.c                | 1217 +++++++++++++++++++++++++++++++++
+ include/asm-m68k/mcfdspi.h            |   48 ++
+ 5 files changed, 1296 insertions(+), 12 deletions(-)
+ create mode 100644 drivers/spi/dspi_mcf.c
+ create mode 100644 include/asm-m68k/mcfdspi.h
+
+--- a/arch/m68k/coldfire/m547x_8x-devices.c
++++ b/arch/m68k/coldfire/m547x_8x-devices.c
+@@ -26,26 +26,40 @@
+  */
+ /* number of supported SPI selects */
+-#define SPI_NUM_CHIPSELECTS   4
++#define SPI_NUM_CHIPSELECTS   8
+ void coldfire_spi_cs_control(u8 cs, u8 command)
+ {
+       /* nothing special required */
+ }
++#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
++static struct coldfire_spi_chip spidev_chip_info = {
++      .bits_per_word = 8,
++};
++#endif
++
+ static struct spi_board_info spi_board_info[] = {
+-      /* no board info */
++#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
++      {
++              .modalias = "spidev",
++              .max_speed_hz = 16000000,       /* max clk (SCK) speed in HZ */
++              .bus_num = 1,
++              .chip_select = 0,               /* CS0 */
++              .controller_data = &spidev_chip_info,
++      }
++#endif
+ };
+ static int spi_irq_list[] = {
+-      /* IRQ, ICR Offset, ICR Val, Mask */
+-      64 + ISC_DSPI_OVRFW, 0, 0, 0,
+-      64 + ISC_DSPI_RFOF,  0, 0, 0,
+-      64 + ISC_DSPI_RFDF,  0, 0, 0,
+-      64 + ISC_DSPI_TFUF,  0, 0, 0,
+-      64 + ISC_DSPI_TCF,   0, 0, 0,
+-      64 + ISC_DSPI_TFFF,  0, 0, 0,
+-      64 + ISC_DSPI_EOQF,  0, 0, 0,
++      /* IRQ,              ICR Offset,        ICR Val,Mask */
++      64 + ISC_DSPI_OVRFW, ISC_DSPI_OVRFW,    0x18,   0,
++      64 + ISC_DSPI_RFOF,  ISC_DSPI_RFOF,     0x18,   0,
++      64 + ISC_DSPI_RFDF,  ISC_DSPI_RFDF,     0x18,   0,
++      64 + ISC_DSPI_TFUF,  ISC_DSPI_TFUF,     0x18,   0,
++      64 + ISC_DSPI_TCF,   ISC_DSPI_TCF,      0x18,   0,
++      64 + ISC_DSPI_TFFF,  ISC_DSPI_TFFF,     0x18,   0,
++      64 + ISC_DSPI_EOQF,  ISC_DSPI_EOQF,     0x18,   0,
+       0,0,0,0,
+ };
+@@ -120,7 +134,6 @@ static int __init m547x_8x_spi_init(void
+       /* register device */
+       retval = platform_device_register(&coldfire_spi);
+       if (retval < 0) {
+-              printk(KERN_ERR "SPI-m547x_8x: platform_device_register failed with code=%d\n", retval);
+               goto out;
+       }
+--- a/drivers/spi/Kconfig
++++ b/drivers/spi/Kconfig
+@@ -130,6 +130,12 @@ config SPI_COLDFIRE
+         Tested with the 5282 processor, but should also work with other
+         Coldfire variants.
++config SPI_DSPI
++      tristate "Coldfire DSPI"
++      depends on SPI_MASTER && COLDFIRE
++      help
++        SPI driver for Coldfire DSPI driver only.
++
+ config SPI_COLDFIRE_DSPI_EDMA   
+       boolean "Coldfire DSPI master driver uses eDMA"
+       depends on SPI_MASTER && COLDFIRE && SPI_COLDFIRE && EXPERIMENTAL && COLDFIRE_EDMA
+--- a/drivers/spi/Makefile
++++ b/drivers/spi/Makefile
+@@ -19,7 +19,7 @@ obj-$(CONFIG_SPI_BITBANG)            += spi_bitban
+ obj-$(CONFIG_SPI_AU1550)              += au1550_spi.o
+ obj-$(CONFIG_SPI_BUTTERFLY)           += spi_butterfly.o
+ # obj-$(CONFIG_SPI_COLDFIRE)          += spi_coldfire.o spi-m5445x.o
+-obj-$(CONFIG_SPI_COLDFIRE)            += spi_coldfire.o
++obj-$(CONFIG_SPI_DSPI)                        += dspi_mcf.o
+ obj-$(CONFIG_SPI_GPIO)                        += spi_gpio.o
+ obj-$(CONFIG_SPI_IMX)                 += spi_imx.o
+ obj-$(CONFIG_SPI_LM70_LLP)            += spi_lm70llp.o
+--- /dev/null
++++ b/drivers/spi/dspi_mcf.c
+@@ -0,0 +1,1217 @@
++/*
++ * dspi_mcf.c - DSPI controller for ColdFire processors
++ *
++ *
++ *      Matt Waddel Matt.Waddel@freescale.com
++ *      Copyright Freescale Semiconductor, Inc. 2008
++ *
++ *    M547x/M548x changes by Kurt Mahan kmahan@freescale.com
++ *      Copyright Freescale Semiconductor, Inc. 2008
++ *
++ *      Based on spi_coldfire.c done by:
++ *              Andrey Butok
++ *              Yaroslav Vinogradov
++ *              Copyright Freescale Semiconductor, Inc. 2006-2007
++ *              Mike Lavender (mike@steroidmicros)
++ *              (C) Copyright 2005, Intec Automation,
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ ***************************************************************************
++ * Changes:
++ *   v0.002   M547x/M548x support.
++ *   v0.001   Initial version. Coldfire DSPI master driver.
++ ****************************************************************************/
++
++/*
++ * Includes
++ */
++
++#include <linux/autoconf.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/device.h>
++#include <linux/interrupt.h>
++#include <linux/platform_device.h>
++#include <linux/spi/spi.h>
++#include <linux/workqueue.h>
++#include <linux/delay.h>
++#include <asm/mcfsim.h>
++#include <asm/mcfqspi.h>
++#include <asm/coldfire.h>
++#include <linux/io.h>
++#include <asm/mcfdspi.h>
++#include <linux/dma-mapping.h>
++
++#undef DSPI_COLDFIRE_DEBUG
++
++#ifdef DSPI_COLDFIRE_DEBUG
++#define DBG(fmt, args...) \
++      printk(KERN_INFO "[%s]  " fmt , __FUNCTION__, ## args)
++#else
++#define DBG(fmt, args...)     do {} while (0)
++#endif
++
++#if defined(CONFIG_M54455)
++#include <asm/mcf5445x_dspi.h>
++#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
++      #include <asm/mcf5445x_edma.h>
++#endif
++#endif
++
++#if defined(CONFIG_M547X_8X)
++#include <asm/virtconvert.h>
++#include <asm/m5485dspi.h>
++#endif
++
++#if defined(CONFIG_SPI_COLDFIRE_DSPI_EDMA)
++#include <asm/mcf_edma.h>
++#define SPI_DSPI_EDMA
++#define EDMA_BUFSIZE_KMALLOC  (DSPI_FIFO_SIZE*4)
++#define DSPI_DMA_RX_TCD               MCF_EDMA_CHAN_DSPI_RX
++#define DSPI_DMA_TX_TCD       MCF_EDMA_CHAN_DSPI_TX
++#endif
++
++#define DSPI_BITS     MCF_DSPI_DCTAR_FMSZ(0xF)
++#define DSPI_BITS_16  MCF_DSPI_DCTAR_FMSZ(0xF)
++#define DSPI_BITS_8   MCF_DSPI_DCTAR_FMSZ(0x7)
++#define DSPI_FIFO_SIZE        16
++
++#define DRIVER_NAME "Coldfire DSPI"
++
++/****************************************************************************/
++
++/*
++ * Local constants and macros
++ */
++
++#define START_STATE ((void *)0)
++#define RUNNING_STATE ((void *)1)
++#define DONE_STATE ((void *)2)
++#define ERROR_STATE ((void *)-1)
++
++#define QUEUE_RUNNING 0
++#define QUEUE_STOPPED 1
++
++/****************************************************************************/
++
++/*
++ * Local Data Structures
++ */
++
++struct DSPI_MCR {
++      unsigned master:1;
++      unsigned cont_scke:1;
++      unsigned dconf:2;
++      unsigned frz:1;
++      unsigned mtfe:1;
++      unsigned pcsse:1;
++      unsigned rooe:1;
++      unsigned pcsis:8;
++      unsigned reserved15:1;
++      unsigned mdis:1;
++      unsigned dis_tx:1;
++      unsigned dis_rxf:1;
++      unsigned clr_tx:1;
++      unsigned clr_rxf:1;
++      unsigned smpl_pt:2;
++      unsigned reserved71:7;
++      unsigned halt:1;
++};
++
++struct DSPI_CTAR {
++      unsigned dbr:1;
++      unsigned fmsz:4;
++      unsigned cpol:1;
++      unsigned cpha:1;
++      unsigned lsbfe:1;
++      unsigned pcssck:2;
++      unsigned pasc:2;
++      unsigned pdt:2;
++      unsigned pbr:2;
++      unsigned cssck:4;
++      unsigned asc:4;
++      unsigned dt:4;
++      unsigned br:4;
++};
++
++struct chip_data {
++      /* dspi data */
++      union {
++              u32 mcr_val;
++              struct DSPI_MCR mcr;
++      };
++      union {
++              u32 ctar_val;
++              struct DSPI_CTAR ctar;
++      };
++      u16 void_write_data;
++};
++
++
++struct driver_data {
++      /* Driver model hookup */
++      struct platform_device *pdev;
++
++      /* SPI framework hookup */
++      struct spi_master *master;
++
++      /* Driver message queue */
++      struct workqueue_struct *workqueue;
++      struct work_struct pump_messages;
++      spinlock_t lock; /* lock */
++      struct list_head queue;
++      int busy;
++      int run;
++
++      /* Message Transfer pump */
++      struct tasklet_struct pump_transfers;
++
++      /* Current message transfer state info */
++      struct spi_message *cur_msg;
++      struct spi_transfer *cur_transfer;
++      struct chip_data *cur_chip;
++      size_t len;
++      void *tx;
++      void *tx_end;
++      void *rx;
++      void *rx_end;
++      char flags;
++#define TRAN_STATE_RX_VOID       0x01
++#define TRAN_STATE_TX_VOID       0x02
++#define TRAN_STATE_WORD_ODD_NUM          0x04
++      u8 cs;
++      u16 void_write_data;
++      unsigned cs_change:1;
++
++      u32 trans_cnt;
++      u32 wce_cnt;
++      u32 abrt_cnt;
++      u32 *mcr;               /* DSPI MCR register */
++      u32 *ctar;              /* DSPI CTAR register */
++      u32 *dspi_dtfr;         /* DSPI DTFR register */
++      u32 *dspi_drfr;         /* DSPI DRFR register */
++      u32 *dspi_rser;         /* DSPI RSER register */
++      u32 *dspi_sr;           /* DSPI status register */
++
++#if defined(SPI_DSPI_EDMA)
++      void *edma_tx_buf;
++      void *edma_rx_buf;
++#endif
++
++#if defined(CONFIG_M532x) || defined(CONFIG_M537x)
++      u16 *par;          /* Pin assignment register */
++#else
++      u8  *par;          /* Pin assignment register */
++#endif
++      u8  *int_icr;      /* Interrupt level and priority register */
++      u32 *int_mr;       /* Interrupt mask register */
++      void (*cs_control)(u8 cs, u8 command);
++};
++
++#define DSPI_CS(cs) ((1<<(cs))<<16)
++
++/****************************************************************************/
++
++/*
++ * SPI local functions
++ */
++
++static void *next_transfer(struct driver_data *drv_data)
++{
++      struct spi_message *msg = drv_data->cur_msg;
++      struct spi_transfer *trans = drv_data->cur_transfer;
++
++      DBG("\n");
++      /* Move to next transfer */
++      if (trans->transfer_list.next != &msg->transfers) {
++              drv_data->cur_transfer = list_entry(trans->transfer_list.next,
++                                                  struct spi_transfer,
++                                                  transfer_list);
++
++              if (drv_data->cur_transfer->transfer_list.next
++                      == &msg->transfers) /* last transfer */
++                      drv_data->cur_transfer->cs_change = 1;
++
++              return RUNNING_STATE;
++      } else
++              return DONE_STATE;
++}
++
++
++static inline int is_word_transfer(struct driver_data *drv_data)
++{
++      return ((*(drv_data->ctar+drv_data->cs) & DSPI_BITS_16) ==
++                                                DSPI_BITS_8) ? 0 : 1;
++}
++
++static inline void set_8bit_transfer_mode(struct driver_data *drv_data)
++{
++      DBG("\n");
++      *(drv_data->ctar+drv_data->cs) =
++              (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_8;
++}
++
++static inline void set_16bit_transfer_mode(struct driver_data *drv_data)
++{
++      DBG("\n");
++      *(drv_data->ctar+drv_data->cs) =
++              (*(drv_data->ctar + drv_data->cs) & ~DSPI_BITS) | DSPI_BITS_16;
++}
++
++static unsigned char hz_to_spi_baud(int pbr, int dbr, int speed_hz)
++{
++      int pbr_tbl[4] = {2, 3, 5, 7}; /* Valid baud rate pre-scaler values */
++      int brs[16] = { 2,      4,      6,      8,
++                      16,     32,     64,     128,
++                      256,    512,    1024,   2048,
++                      4096,   8192,   16384,  32768 };
++      int temp, index = 0;
++
++      if ((pbr < 0) || (pbr > 3) ||
++          (dbr < 0) || (dbr > 1))
++              return 15; /* table indexes out of range, go slow */
++
++      temp = ((((MCF_CLK / 2) / pbr_tbl[pbr]) * (1 + dbr)) / speed_hz);
++
++      while (temp >= brs[index])
++              if (index++ >= 15)
++                      break;
++
++      DBG("baud rate scaler = 0x%x - %d\n", index, brs[index]);
++      return(index);
++}
++
++static int write(struct driver_data *drv_data)
++{
++      int tx_count = 0;
++      int tx_word = is_word_transfer(drv_data);
++      u16 d16;
++      u8  d8;
++      u32 dspi_pushr = 0;
++      int first = 1;
++#if defined(SPI_DSPI_EDMA)
++      u32 *edma_wr = (u32 *)(drv_data->edma_tx_buf);
++#endif
++
++      /* If we are in word mode, but only have a single byte to transfer
++       * then switch to byte mode temporarily.  Will switch back at the
++       * end of the transfer. */
++      if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1)) {
++              drv_data->flags |= TRAN_STATE_WORD_ODD_NUM;
++              set_8bit_transfer_mode(drv_data);
++              tx_word = 0;
++      }
++
++      while ((drv_data->tx < drv_data->tx_end) && (tx_count < DSPI_FIFO_SIZE)) {
++// DBG("while\n");
++              if (tx_word) {
++                      if ((drv_data->tx_end - drv_data->tx) == 1)
++                              break;
++
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
++                              d16 = *(u16 *)drv_data->tx;
++                      else
++                              d16 = drv_data->void_write_data;
++
++                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d16) |
++                                   DSPI_CS(drv_data->cs) |
++                                   MCF_DSPI_DTFR_CTAS(drv_data->cs) |
++                                   MCF_DSPI_DTFR_CONT;
++
++                      drv_data->tx += 2;
++              } else {
++                      if (!(drv_data->flags & TRAN_STATE_TX_VOID))
++                              d8 = *(u8 *)drv_data->tx;
++                      else
++                              d8 = *(u8 *)&drv_data->void_write_data;
++
++                      dspi_pushr = MCF_DSPI_DTFR_TXDATA(d8) |
++                                   DSPI_CS(drv_data->cs) |
++                                   MCF_DSPI_DTFR_CTAS(drv_data->cs) |
++                                   MCF_DSPI_DTFR_CONT;
++
++                      drv_data->tx++;
++              }
++
++              if (drv_data->tx == drv_data->tx_end
++                      || tx_count == DSPI_FIFO_SIZE-1) {
++                      /* last transfer in the queue */
++                      dspi_pushr |= MCF_DSPI_DTFR_EOQ;
++                      if ((drv_data->cs_change)
++                       && (drv_data->tx == drv_data->tx_end))
++                              dspi_pushr &= ~MCF_DSPI_DTFR_CONT;
++#ifdef CONFIG_M547X_8X
++                      /* EOQ gets missed if we don't delay */
++                      udelay(100);
++#endif
++              } else if (tx_word && ((drv_data->tx_end - drv_data->tx) == 1))
++                      dspi_pushr |= MCF_DSPI_DTFR_EOQ;
++
++              if (first) {
++                      first = 0;
++                      dspi_pushr |= MCF_DSPI_DTFR_CTCNT; /* clear counter */
++              }
++#if defined(SPI_DSPI_EDMA)
++              *edma_wr = dspi_pushr;
++              edma_wr++;
++#else
++              *drv_data->dspi_dtfr = dspi_pushr;
++#endif
++              tx_count++;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++      if (tx_count > 0) {
++
++              mcf_edma_set_tcd_params(DSPI_DMA_TX_TCD,
++                      virt_to_phys(drv_data->edma_tx_buf),
++                      (u32)drv_data->dspi_dtfr,
++                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT
++                      | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                      4,              /* soff */
++                      4 * tx_count,   /* nbytes */
++                      0,              /* slast */
++                      1,              /* citer */
++                      1,              /* biter */
++                      0,              /* doff */
++                      0,              /* dlastsga */
++                      0,              /* major_int */
++                      1);             /* disable_req */
++
++              mcf_edma_set_tcd_params(DSPI_DMA_RX_TCD,
++                      (u32)drv_data->dspi_drfr,
++                      virt_to_phys(drv_data->edma_rx_buf),
++                      MCF_EDMA_TCD_ATTR_SSIZE_32BIT
++                      | MCF_EDMA_TCD_ATTR_DSIZE_32BIT,
++                      0,              /* soff */
++                      4 * tx_count,   /* nbytes */
++                      0,              /* slast */
++                      1,              /* citer */
++                      1,              /* biter */
++                      4,              /* doff */
++                      0,              /* dlastsga */
++                      0,              /* major_int */
++                      1);             /* disable_req */
++
++              mcf_edma_start_transfer(DSPI_DMA_TX_TCD);
++      }
++#endif
++      return (tx_count * (tx_word + 1));
++}
++
++static int read(struct driver_data *drv_data)
++{
++      int rx_count = 0;
++      int rx_word = is_word_transfer(drv_data);
++      u16 d;
++#if defined(SPI_DSPI_EDMA)
++      u32 *rx_edma = (u32 *) drv_data->edma_rx_buf;
++
++      /* receive SPI data */
++      mcf_edma_start_transfer(DSPI_DMA_RX_TCD);
++#endif
++      while ((drv_data->rx < drv_data->rx_end)
++              && (rx_count < DSPI_FIFO_SIZE)) {
++
++              if (rx_word) {
++                      if ((drv_data->rx_end - drv_data->rx) == 1)
++                              break;
++#if defined(SPI_DSPI_EDMA)
++                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
++                      rx_edma++;
++#else
++                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
++#endif
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u16 *)drv_data->rx = d;
++                      drv_data->rx += 2;
++
++              } else {
++#if defined(SPI_DSPI_EDMA)
++                      d = MCF_DSPI_DRFR_RXDATA(*rx_edma);
++                      rx_edma++;
++#else
++                      d = MCF_DSPI_DRFR_RXDATA(*drv_data->dspi_drfr);
++#endif
++                      if (!(drv_data->flags & TRAN_STATE_RX_VOID))
++                              *(u8 *)drv_data->rx = d;
++                      drv_data->rx++;
++              }
++              rx_count++;
++              DBG("rxd=0x%x\n", d);
++      }
++      return rx_count;
++}
++
++
++static inline void dspi_setup_chip(struct driver_data *drv_data)
++{
++      struct chip_data *chip = drv_data->cur_chip;
++
++      DBG("\n");
++      *drv_data->mcr = chip->mcr_val;
++      *(drv_data->ctar+drv_data->cs) = chip->ctar_val;
++      *drv_data->dspi_rser =  MCF_DSPI_DRSER_EOQFE;
++}
++
++#if defined(SPI_DSPI_EDMA)
++static int edma_tx_handler(int channel, void *dev)
++{
++      DBG("\n");
++      if (channel == DSPI_DMA_TX_TCD)
++              mcf_edma_stop_transfer(DSPI_DMA_TX_TCD);
++      return IRQ_HANDLED;
++}
++
++static int edma_rx_handler(int channel, void *dev)
++{
++      DBG("\n");
++      if (channel == DSPI_DMA_RX_TCD)
++              mcf_edma_stop_transfer(DSPI_DMA_RX_TCD);
++      return IRQ_HANDLED;
++}
++#endif
++
++static irqreturn_t dspi_interrupt(int irq, void *dev_id)
++{
++      struct driver_data *drv_data = (struct driver_data *)dev_id;
++      struct spi_message *msg = drv_data->cur_msg;
++
++      /* Clear all flags immediately */
++      *drv_data->dspi_sr = MCF_DSPI_DSR_EOQF;
++
++      if (!drv_data->cur_msg || !drv_data->cur_msg->state) {
++#if !defined(SPI_DSPI_EDMA)
++              u32 irq_status = *drv_data->dspi_sr;
++              /* if eDMA is used it happens some time (at least once)*/
++              printk(KERN_ERR "Bad message or transfer state handler. \
++                               IRQ status = %x\n", irq_status);
++#endif
++              return IRQ_NONE;
++      }
++
++      DBG("\n");
++      /*
++       * Read the data into the buffer and reload and start
++       * queue with new data if not finished.  If finished
++       * then setup the next transfer
++       */
++      read(drv_data);
++
++      if (drv_data->rx == drv_data->rx_end) {
++              /*
++               * Finished now - fall through and schedule next
++               * transfer tasklet
++               */
++              if (drv_data->flags & TRAN_STATE_WORD_ODD_NUM)
++                      set_16bit_transfer_mode(drv_data);
++
++              msg->state = next_transfer(drv_data);
++      } else {
++              /* not finished yet - keep going */
++              msg->actual_length += write(drv_data);
++              return IRQ_HANDLED;
++      }
++
++      tasklet_schedule(&drv_data->pump_transfers);
++
++      return IRQ_HANDLED;
++}
++
++/* caller already set message->status; dma and pio irqs are blocked */
++static void giveback(struct driver_data *drv_data)
++{
++      struct spi_transfer *last_transfer;
++      unsigned long flags;
++      struct spi_message *msg;
++      DBG("\n");
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++      msg = drv_data->cur_msg;
++      drv_data->cur_msg = NULL;
++      drv_data->cur_transfer = NULL;
++      drv_data->cur_chip = NULL;
++      queue_work(drv_data->workqueue, &drv_data->pump_messages);
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      last_transfer = list_entry(msg->transfers.prev,
++                                 struct spi_transfer, transfer_list);
++
++      if (!last_transfer->cs_change)
++              drv_data->cs_control(drv_data->cs, QSPI_CS_DROP);
++
++      msg->state = NULL;
++      if (msg->complete)
++              msg->complete(msg->context);
++}
++
++
++static void pump_transfers(unsigned long data)
++{
++      struct driver_data *drv_data = (struct driver_data *)data;
++      struct spi_message *message = NULL;
++      struct spi_transfer *transfer = NULL;
++      struct spi_transfer *previous = NULL;
++      struct chip_data *chip = NULL;
++      unsigned long flags;
++      DBG("\n");
++      /* Get current state information */
++      message = drv_data->cur_msg;
++      transfer = drv_data->cur_transfer;
++      chip = drv_data->cur_chip;
++
++      /* Handle for abort */
++      if (message->state == ERROR_STATE) {
++              message->status = -EIO;
++              giveback(drv_data);
++              return;
++      }
++
++      /* Handle end of message */
++      if (message->state == DONE_STATE) {
++              message->status = 0;
++              giveback(drv_data);
++              return;
++      }
++
++      if (message->state == START_STATE) {
++              dspi_setup_chip(drv_data);
++
++              if (drv_data->cs_control)
++                      drv_data->cs_control(message->spi->chip_select,
++                              QSPI_CS_ASSERT);
++      }
++
++      /* Delay if requested at end of transfer*/
++      if (message->state == RUNNING_STATE) {
++              previous = list_entry(transfer->transfer_list.prev,
++                                      struct spi_transfer,
++                                      transfer_list);
++
++              if (drv_data->cs_control && transfer->cs_change)
++                      drv_data->cs_control(message->spi->chip_select,
++                              QSPI_CS_DROP);
++
++              if (previous->delay_usecs)
++                      udelay(previous->delay_usecs);
++
++              if (drv_data->cs_control && transfer->cs_change)
++                      drv_data->cs_control(message->spi->chip_select,
++                              QSPI_CS_ASSERT);
++      }
++
++      drv_data->flags = 0;
++      drv_data->tx = (void *)transfer->tx_buf;
++      drv_data->tx_end = drv_data->tx + transfer->len;
++      drv_data->rx = transfer->rx_buf;
++      drv_data->rx_end = drv_data->rx + transfer->len;
++
++      if (!drv_data->rx)
++              drv_data->flags |= TRAN_STATE_RX_VOID;
++      if (!drv_data->tx)
++              drv_data->flags |= TRAN_STATE_TX_VOID;
++      drv_data->cs = message->spi->chip_select;
++      drv_data->cs_change = transfer->cs_change;
++      drv_data->void_write_data = chip->void_write_data;
++      if (transfer->speed_hz) {
++              *(drv_data->ctar + drv_data->cs) = \
++                      ((chip->ctar_val & ~0xF) | \
++                        hz_to_spi_baud(chip->ctar.pbr, \
++                                       chip->ctar.dbr, \
++                                       transfer->speed_hz));
++      }
++
++      message->state = RUNNING_STATE;
++      /* Go baby, go */
++      local_irq_save(flags);
++      message->actual_length += write(drv_data);
++      local_irq_restore(flags);
++}
++
++
++static void pump_messages(struct work_struct *work)
++{
++      struct driver_data *drv_data;
++      unsigned long flags;
++      DBG("\n");
++
++      drv_data = container_of(work, struct driver_data, pump_messages);
++
++      /* Lock queue and check for queue work */
++      spin_lock_irqsave(&drv_data->lock, flags);
++      if (list_empty(&drv_data->queue)
++              || drv_data->run == QUEUE_STOPPED) {
++              drv_data->busy = 0;
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return;
++      }
++
++      /* Make sure we are not already running a message */
++      if (drv_data->cur_msg) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return;
++      }
++
++      /* Extract head of queue */
++      drv_data->cur_msg = list_entry(drv_data->queue.next,
++                                      struct spi_message, queue);
++      list_del_init(&drv_data->cur_msg->queue);
++
++      /* Initial message state*/
++      drv_data->cur_msg->state = START_STATE;
++      drv_data->cur_transfer = list_entry(drv_data->cur_msg->transfers.next,
++                                              struct spi_transfer,
++                                              transfer_list);
++
++      if (drv_data->cur_transfer->transfer_list.next
++              == &drv_data->cur_msg->transfers)
++              drv_data->cur_transfer->cs_change = 1; /* last */
++
++
++      /* Setup the SPI Registers using the per chip configuration */
++      drv_data->cur_chip = spi_get_ctldata(drv_data->cur_msg->spi);
++
++      /* Mark as busy and launch transfers */
++      tasklet_schedule(&drv_data->pump_transfers);
++
++      drv_data->busy = 1;
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++}
++
++/****************************************************************************/
++
++/*
++ * SPI master implementation
++ */
++
++static int transfer(struct spi_device *spi, struct spi_message *msg)
++{
++      struct driver_data *drv_data = spi_master_get_devdata(spi->master);
++      unsigned long flags;
++
++      DBG("\n");
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      if (drv_data->run == QUEUE_STOPPED) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return -ESHUTDOWN;
++      }
++
++      msg->actual_length = 0;
++      msg->status = -EINPROGRESS;
++      msg->state = START_STATE;
++
++      list_add_tail(&msg->queue, &drv_data->queue);
++
++      if (drv_data->run == QUEUE_RUNNING && !drv_data->busy)
++              queue_work(drv_data->workqueue, &drv_data->pump_messages);
++
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      return 0;
++}
++
++
++static int setup(struct spi_device *spi)
++{
++
++      struct chip_data *chip;
++      struct coldfire_dspi_chip *chip_info
++              = (struct coldfire_dspi_chip *)spi->controller_data;
++      DBG("\n");
++
++      /* Only alloc on first setup */
++      chip = spi_get_ctldata(spi);
++      if (chip == NULL) {
++              chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL);
++              if (!chip)
++                      return -ENOMEM;
++              spi->mode = chip_info->mode;
++              spi->bits_per_word = chip_info->bits_per_word;
++      }
++
++      chip->mcr.master = 1;
++      chip->mcr.cont_scke = 0;
++      chip->mcr.dconf = 0;
++      chip->mcr.frz = 0;
++      chip->mcr.mtfe = 0;
++      chip->mcr.pcsse = 0;
++      chip->mcr.rooe = 0;
++      chip->mcr.pcsis = 0xFF;
++      chip->mcr.reserved15 = 0;
++      chip->mcr.mdis = 0;
++      chip->mcr.dis_tx = 0;
++      chip->mcr.dis_rxf = 0;
++      chip->mcr.clr_tx = 1;
++      chip->mcr.clr_rxf = 1;
++      chip->mcr.smpl_pt = 0;
++      chip->mcr.reserved71 = 0;
++      chip->mcr.halt = 0;
++
++      if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
++              chip->ctar.fmsz = spi->bits_per_word-1;
++      } else {
++              printk(KERN_ERR "Invalid wordsize\n");
++              kfree(chip);
++              return -ENODEV;
++      }
++
++      chip->void_write_data = chip_info->void_write_data;
++
++      if (spi->max_speed_hz != 0)
++              chip_info->br = hz_to_spi_baud(chip_info->pbr, chip_info->dbr, \
++                                             spi->max_speed_hz);
++
++      chip->ctar.cpha = (spi->mode & SPI_CPHA) ? 1 : 0;
++      chip->ctar.cpol = (spi->mode & SPI_CPOL) ? 1 : 0;
++      chip->ctar.lsbfe = (spi->mode & SPI_LSB_FIRST) ? 1 : 0;
++      chip->ctar.dbr = chip_info->dbr;
++      chip->ctar.pbr = chip_info->pbr;
++      chip->ctar.br = chip_info->br;
++      chip->ctar.pcssck = chip_info->pcssck;
++      chip->ctar.pasc = chip_info->pasc;
++      chip->ctar.pdt = chip_info->pdt;
++      chip->ctar.cssck = chip_info->cssck;
++      chip->ctar.asc = chip_info->asc;
++      chip->ctar.dt = chip_info->dt;
++
++      spi_set_ctldata(spi, chip);
++
++      return 0;
++}
++
++static int init_queue(struct driver_data *drv_data)
++{
++      INIT_LIST_HEAD(&drv_data->queue);
++      spin_lock_init(&drv_data->lock);
++
++      drv_data->run = QUEUE_STOPPED;
++      drv_data->busy = 0;
++
++      tasklet_init(&drv_data->pump_transfers,
++                      pump_transfers, (unsigned long)drv_data);
++
++      INIT_WORK(&drv_data->pump_messages, pump_messages);
++
++      drv_data->workqueue = create_singlethread_workqueue(
++                                      drv_data->master->dev.parent->bus_id);
++      if (drv_data->workqueue == NULL)
++              return -EBUSY;
++
++      return 0;
++}
++
++static int start_queue(struct driver_data *drv_data)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      if (drv_data->run == QUEUE_RUNNING || drv_data->busy) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              return -EBUSY;
++      }
++
++      drv_data->run = QUEUE_RUNNING;
++      drv_data->cur_msg = NULL;
++      drv_data->cur_transfer = NULL;
++      drv_data->cur_chip = NULL;
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      queue_work(drv_data->workqueue, &drv_data->pump_messages);
++
++      return 0;
++}
++
++static int stop_queue(struct driver_data *drv_data)
++{
++      unsigned long flags;
++      unsigned limit = 500;
++      int status = 0;
++
++      spin_lock_irqsave(&drv_data->lock, flags);
++
++      /* This is a bit lame, but is optimized for the common execution path.
++       * A wait_queue on the drv_data->busy could be used, but then the common
++       * execution path (pump_messages) would be required to call wake_up or
++       * friends on every SPI message. Do this instead */
++      drv_data->run = QUEUE_STOPPED;
++      while (!list_empty(&drv_data->queue) && drv_data->busy && limit--) {
++              spin_unlock_irqrestore(&drv_data->lock, flags);
++              msleep(10);
++              spin_lock_irqsave(&drv_data->lock, flags);
++      }
++
++      if (!list_empty(&drv_data->queue) || drv_data->busy)
++              status = -EBUSY;
++
++      spin_unlock_irqrestore(&drv_data->lock, flags);
++
++      return status;
++}
++
++static int destroy_queue(struct driver_data *drv_data)
++{
++      int status;
++
++      status = stop_queue(drv_data);
++      if (status != 0)
++              return status;
++
++      destroy_workqueue(drv_data->workqueue);
++
++      return 0;
++}
++
++
++static void cleanup(struct spi_device *spi)
++{
++      struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi);
++
++      dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n",
++              spi->master->bus_num, spi->chip_select);
++
++      kfree(chip);
++}
++
++
++/****************************************************************************/
++
++/*
++ * Generic Device driver routines and interface implementation
++ */
++
++static int coldfire_spi_probe(struct platform_device *pdev)
++{
++      struct device *dev = &pdev->dev;
++      struct coldfire_spi_master *platform_info;
++      struct spi_master *master;
++      struct driver_data *drv_data = 0;
++      struct resource *memory_resource;
++      int irq;
++      int status = 0;
++      int i;
++#if defined(SPI_DSPI_EDMA)
++      dma_addr_t dma_handle;
++#endif
++
++      platform_info = (struct coldfire_spi_master *)dev->platform_data;
++
++      master = spi_alloc_master(dev, sizeof(struct driver_data));
++      if (!master)
++              return -ENOMEM;
++
++      drv_data = spi_master_get_devdata(master);
++      drv_data->master = master;
++
++      INIT_LIST_HEAD(&drv_data->queue);
++      spin_lock_init(&drv_data->lock);
++
++      master->bus_num = platform_info->bus_num;
++      master->num_chipselect = platform_info->num_chipselect;
++      master->cleanup = cleanup;
++      master->setup = setup;
++      master->transfer = transfer;
++
++      drv_data->cs_control = platform_info->cs_control;
++      if (drv_data->cs_control)
++              for (i = 0; i < master->num_chipselect; i++)
++                      drv_data->cs_control(i, QSPI_CS_INIT | QSPI_CS_DROP);
++
++      /* Setup register addresses */
++      memory_resource = platform_get_resource_byname(pdev,
++                              IORESOURCE_MEM, "spi-module");
++      if (!memory_resource) {
++              dev_dbg(dev, "can not find platform module memory\n");
++              goto out_error_master_alloc;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++      drv_data->edma_tx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
++                                                 &dma_handle, GFP_DMA);
++      if (!drv_data->edma_tx_buf) {
++              dev_dbg(dev, "cannot allocate eDMA TX memory\n");
++              goto out_error_master_alloc;
++      }
++      drv_data->edma_rx_buf = dma_alloc_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
++                                                 &dma_handle, GFP_DMA);
++      if (!drv_data->edma_rx_buf) {
++              dma_free_coherent(NULL, EDMA_BUFSIZE_KMALLOC, \
++                                drv_data->edma_tx_buf, dma_handle);
++              kfree(drv_data->edma_tx_buf);
++              dev_dbg(dev, "cannot allocate eDMA RX memory\n");
++              goto out_error_master_alloc;
++      }
++#endif
++
++      drv_data->mcr = (void *)&MCF_DSPI_DMCR;
++      drv_data->ctar = (void *)&MCF_DSPI_DCTAR0;
++      drv_data->dspi_sr = (void *)&MCF_DSPI_DSR;
++      drv_data->dspi_rser = (void *)&MCF_DSPI_DRSER;
++      drv_data->dspi_dtfr = (void *)&MCF_DSPI_DTFR;
++      drv_data->dspi_drfr = (void *)&MCF_DSPI_DRFR;
++
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++                                                     "spi-par");
++      if (!memory_resource) {
++              dev_dbg(dev, "No spi-par memory\n");
++              goto out_error_master_alloc;
++      }
++      drv_data->par = (void *)memory_resource->start;
++
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++                                                     "spi-int-level");
++      if (!memory_resource) {
++              dev_dbg(dev, "No spi-int-level memory\n");
++              goto out_error_master_alloc;
++      }
++      drv_data->int_icr = (void *)memory_resource->start;
++
++      memory_resource = platform_get_resource_byname(pdev, IORESOURCE_MEM,
++                                                     "spi-int-mask");
++      if (!memory_resource) {
++              dev_dbg(dev, "No spi-int-mask memory\n");
++              goto out_error_master_alloc;
++      }
++      drv_data->int_mr = (void *)memory_resource->start;
++
++      if (platform_info->irq_list) {
++              /* multiple IRQs */
++              int *irqlist = platform_info->irq_list;
++              while ((irq = *irqlist++)) {
++                      int off = *irqlist++;
++                      int lvl = *irqlist++;
++                      int msk = *irqlist++;
++                      status = request_irq(irq, dspi_interrupt, IRQF_DISABLED,
++                                           dev->bus_id, drv_data);
++                      if (status < 0) {
++                              dev_err(&pdev->dev, 
++                                      "Unable to attach ColdFire DSPI interrupt\n");
++                              goto out_error_master_alloc;
++                      }
++
++                      if (lvl)
++                              *(drv_data->int_icr + off) = lvl;
++
++                      if (msk)
++                              *drv_data->int_mr &= ~msk;
++              }
++      }
++      else {
++              irq = platform_info->irq_vector;
++
++              status = request_irq(platform_info->irq_vector, dspi_interrupt,
++                                   IRQF_DISABLED, dev->bus_id, drv_data);
++              if (status < 0) {
++                      dev_err(&pdev->dev, "Unable to attach ColdFire DSPI interrupt\n");
++                      goto out_error_master_alloc;
++              }
++
++              *drv_data->int_icr = platform_info->irq_lp;
++              *drv_data->int_mr &= ~platform_info->irq_mask;
++      }
++
++      /* Now that we have all the addresses etc.  Let's set it up */
++      if (platform_info->par_val)
++              *drv_data->par = platform_info->par_val;
++
++      /* Initial and start queue */
++      status = init_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "Problem initializing DSPI queue\n");
++              goto out_error_irq_alloc;
++      }
++      status = start_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "Problem starting DSPI queue\n");
++              goto out_error_irq_alloc;
++      }
++
++      /* Register with the SPI framework */
++      platform_set_drvdata(pdev, drv_data);
++      status = spi_register_master(master);
++      if (status != 0) {
++              dev_err(&pdev->dev, "Problem registering DSPI master\n");
++              status = -EINVAL;
++              goto out_error_queue_alloc;
++      }
++
++#if defined(SPI_DSPI_EDMA)
++      if (mcf_edma_request_channel(DSPI_DMA_TX_TCD,
++                                   edma_tx_handler,
++                                   NULL,
++                                   0x0,
++                                   pdev,
++                                   NULL, /* spinlock */
++                                   DRIVER_NAME) < 0){
++              dev_err(&pdev->dev, "eDMA transmit channel request\n");
++              status = -EINVAL;
++              goto out_error_queue_alloc;
++      }
++
++      if (mcf_edma_request_channel(DSPI_DMA_RX_TCD,
++                                   edma_rx_handler,
++                                   NULL,
++                                   0x0,
++                                   pdev,
++                                   NULL, /* spinlock */
++                                   DRIVER_NAME) < 0){
++              dev_err(&pdev->dev, "eDAM receive channel request\n");
++              status = -EINVAL;
++              mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
++              goto out_error_queue_alloc;
++      }
++#endif
++
++      printk(KERN_INFO "DSPI: Coldfire master initialized\n");
++      return status;
++
++out_error_queue_alloc:
++      destroy_queue(drv_data);
++
++out_error_irq_alloc:
++      free_irq(platform_info->irq_vector, drv_data);
++
++out_error_master_alloc:
++      spi_master_put(master);
++      return status;
++
++}
++
++static int coldfire_spi_remove(struct platform_device *pdev)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int irq;
++      int status = 0;
++
++      if (!drv_data)
++              return 0;
++
++#if defined(SPI_DSPI_EDMA)
++      mcf_edma_free_channel(DSPI_DMA_TX_TCD, pdev);
++      mcf_edma_free_channel(DSPI_DMA_RX_TCD, pdev);
++#endif
++
++      /* Remove the queue */
++      status = destroy_queue(drv_data);
++      if (status != 0)
++              return status;
++
++      /* Release IRQ */
++      irq = platform_get_irq(pdev, 0);
++      if (irq >= 0)
++              free_irq(irq, drv_data);
++
++      /* Disconnect from the SPI framework */
++      spi_unregister_master(drv_data->master);
++
++      /* Prevent double remove */
++      platform_set_drvdata(pdev, NULL);
++
++      return 0;
++}
++
++static void coldfire_spi_shutdown(struct platform_device *pdev)
++{
++      int status = coldfire_spi_remove(pdev);
++
++      if (status != 0)
++              dev_err(&pdev->dev, "shutdown failed with %d\n", status);
++}
++
++
++#ifdef CONFIG_PM
++static int suspend_devices(struct device *dev, void *pm_message)
++{
++      pm_message_t *state = pm_message;
++
++      if (dev->power.power_state.event != state->event) {
++              dev_warn(dev, "pm state does not match request\n");
++              return -1;
++      }
++
++      return 0;
++}
++
++static int coldfire_spi_suspend(struct platform_device *pdev,
++                              pm_message_t state)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int status = 0;
++
++      /* Check all childern for current power state */
++      if (device_for_each_child(&pdev->dev,
++              &state, suspend_devices) != 0) {
++              dev_warn(&pdev->dev, "suspend aborted\n");
++              return -1;
++      }
++
++      status = stop_queue(drv_data);
++      if (status != 0)
++              return status;
++
++      return 0;
++}
++
++static int coldfire_spi_resume(struct platform_device *pdev)
++{
++      struct driver_data *drv_data = platform_get_drvdata(pdev);
++      int status = 0;
++
++      /* Start the queue running */
++      status = start_queue(drv_data);
++      if (status != 0) {
++              dev_err(&pdev->dev, "problem starting queue (%d)\n", status);
++              return status;
++      }
++
++      return 0;
++}
++#else
++#define coldfire_spi_suspend NULL
++#define coldfire_spi_resume NULL
++#endif /* CONFIG_PM */
++
++static struct platform_driver driver = {
++      .driver = {
++              .name = "spi_coldfire",
++              .bus = &platform_bus_type,
++              .owner = THIS_MODULE,
++      },
++      .probe = coldfire_spi_probe,
++      .remove = __devexit_p(coldfire_spi_remove),
++      .shutdown = coldfire_spi_shutdown,
++      .suspend = coldfire_spi_suspend,
++      .resume = coldfire_spi_resume,
++};
++
++static int __init coldfire_spi_init(void)
++{
++      platform_driver_register(&driver);
++
++      return 0;
++}
++module_init(coldfire_spi_init);
++
++static void __exit coldfire_spi_exit(void)
++{
++      platform_driver_unregister(&driver);
++}
++module_exit(coldfire_spi_exit);
++
++MODULE_AUTHOR("Matt Waddel");
++MODULE_DESCRIPTION("ColdFire DSPI Contoller");
++MODULE_LICENSE("GPL");
+--- /dev/null
++++ b/include/asm-m68k/mcfdspi.h
+@@ -0,0 +1,48 @@
++/*
++ * mcfdspi.h-DSPI controller for the ColdFire processors.
++ *
++ * Andrey Butok
++ * Copyright Freescale Semiconductor, Inc. 2008
++ *
++ *    This file is based on mcfqspi.h
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
++ *
++ ***************************************************************************
++ * Changes:
++ *   v0.001   25 March 2008           Andrey Butok
++ *            Initial Release - developed on uClinux with 2.6.23 kernel.
++ *
++ */
++
++#ifndef MCFDSPI_H_
++#define MCFDSPI_H_
++
++struct coldfire_dspi_chip {
++      u8 mode;
++      u8 bits_per_word;
++      u16 void_write_data;
++      /* Only used in master mode */
++      u8 dbr;         /* Double baud rate */
++      u8 pbr;         /* Baud rate prescaler */
++      u8 br;          /* Baud rate scaler */
++      u8 pcssck;      /* PCS to SCK delay prescaler */
++      u8 pasc;        /* After SCK delay prescaler */
++      u8 pdt;         /* Delay after transfer prescaler */
++      u8 cssck;       /* PCS to SCK delay scaler */
++      u8 asc;         /* After SCK delay scaler */
++      u8 dt;          /* Delay after transfer scaler */
++};
++#endif /*MCFDSPI_H_*/
diff --git a/target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch b/target/linux/coldfire/patches/081-mcfv4e_vmalloc_fix.patch
new file mode 100644 (file)
index 0000000..2bb2db6
--- /dev/null
@@ -0,0 +1,60 @@
+From db94c8c3ec831b5fab828487ba05041bc048fccf Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Tue, 15 Jul 2008 17:48:11 -0600
+Subject: [PATCH] Move VMALLOC region to a valid area.
+
+LTIBName: mcfv4e-vmalloc-fix
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/mm/cf-mmu.c      |    7 +------
+ include/asm-m68k/pgtable.h |    6 +++++-
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+--- a/arch/m68k/mm/cf-mmu.c
++++ b/arch/m68k/mm/cf-mmu.c
+@@ -35,7 +35,7 @@
+ #include <asm/coldfire.h>
+ #include <asm/tlbflush.h>
+-#define KMAPAREA(x)   ((x >= KMAP_START) && ( x < KMAP_END))
++#define KMAPAREA(x)   ((x >= VMALLOC_START) && ( x < KMAP_END))
+ #undef DEBUG
+@@ -62,11 +62,6 @@ void free_initmem(void)
+       unsigned long start = (unsigned long)&__init_begin;
+       unsigned long end = (unsigned long)&__init_end;
+-/* 
+- * JKM -- revisit -- the latest round of vmlinux.lds changes has caused
+- * a little grief with how init areas are handled.  With the new toolchain
+- * release I'll fix this.
+- */
+       printk(KERN_INFO "free_initmem: __init_begin = 0x%lx  __init_end = 0x%lx\n", start, end);
+       addr = (unsigned long)&__init_begin;
+--- a/include/asm-m68k/pgtable.h
++++ b/include/asm-m68k/pgtable.h
+@@ -73,7 +73,9 @@
+ #define KMAP_START     0x0DC00000
+ #define KMAP_END       0x0E000000
+ #elif defined(CONFIG_COLDFIRE)
+-#define KMAP_START    0xd0000000
++#define       VMALLOC_START   0xc0000000
++#define VMALLOC_END   0xcfffffff
++#define KMAP_START    (VMALLOC_END + 1)
+ #define KMAP_END      0xe0000000
+ #else
+ #define       KMAP_START      0xd0000000
+@@ -88,9 +90,11 @@
+  * The vmalloc() routines leaves a hole of 4kB between each vmalloced
+  * area for the same reason. ;)
+  */
++#if !defined(CONFIG_COLDFIRE)
+ #define VMALLOC_OFFSET        (8*1024*1024)
+ #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
+ #define VMALLOC_END KMAP_START
++#endif
+ #else
+ extern unsigned long vmalloc_end;
+ #define VMALLOC_START 0x0f800000
diff --git a/target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch b/target/linux/coldfire/patches/086-m547x_8x_dma_dipr.patch
new file mode 100644 (file)
index 0000000..8ce9502
--- /dev/null
@@ -0,0 +1,24 @@
+From 6cf498f4cf1930950d31aff5669bdba97d12364c Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 17 Jul 2008 15:02:23 -0600
+Subject: [PATCH] Properly clear bits in DIPR.
+
+Bugzilla 1351.
+
+LTIBName: m547x-8x-dma-dipr
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/m547x_8x-dma.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+--- a/arch/m68k/coldfire/m547x_8x-dma.c
++++ b/arch/m68k/coldfire/m547x_8x-dma.c
+@@ -455,7 +455,7 @@ irqreturn_t dma_interrupt_handler(int ir
+        * pending interrupts with those that aren't masked.
+        */
+       interrupts = MCF_DMA_DIPR;
+-      MCF_DMA_DIPR |= interrupts;
++      MCF_DMA_DIPR = interrupts;
+       for (i = 0; i < 16; ++i, interrupts >>= 1) {
+               if (interrupts & 0x1)
diff --git a/target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch b/target/linux/coldfire/patches/087-m547x_8x_reboot_wd.patch
new file mode 100644 (file)
index 0000000..3316cbf
--- /dev/null
@@ -0,0 +1,36 @@
+From b3a11478f28a24b719ff6426f52216c37c3331d7 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Thu, 17 Jul 2008 17:02:29 -0600
+Subject: [PATCH] Enable watchdog to reboot the processor.
+
+LTIBName: m547x-8x-reboot-wd
+Signed-off-by: Kurt Mahan <kmahan@freescale.com>
+---
+ arch/m68k/coldfire/config.c |    9 +++++++++
+ 1 files changed, 9 insertions(+), 0 deletions(-)
+
+--- a/arch/m68k/coldfire/config.c
++++ b/arch/m68k/coldfire/config.c
+@@ -50,6 +50,10 @@
+ #include <asm/mcf5445x_xbs.h>
+ #endif
++#ifdef CONFIG_M547X_8X
++#include <asm/m5485gpt.h>
++#endif
++
+ extern int get_irq_list(struct seq_file *p, void *v);
+ extern char _text, _end;
+ extern char _etext, _edata, __init_begin, __init_end;
+@@ -379,6 +383,11 @@ void coldfire_reboot(void)
+           "moveb #0x80, %%d0\n\t"
+           "moveb %%d0, 0xfc0a0000\n\t"
+           : : : "%d0");
++#elif defined(CONFIG_M547X_8X)
++      /* disable interrupts and enable the watchdog */
++      printk(KERN_INFO "Rebooting\n");
++      asm("movew #0x2700, %sr\n");
++      MCF_GPT_GMS0 = MCF_GPT_GMS_WDEN | MCF_GPT_GMS_CE | MCF_GPT_GMS_TMS(4);
+ #endif
+ }
diff --git a/target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch b/target/linux/coldfire/patches/088-m547x_8x_i2c_timeout_fix.patch
new file mode 100644 (file)
index 0000000..dbc3c99
--- /dev/null
@@ -0,0 +1,123 @@
+From b9607c9083b767eac26df1d39a030f3cba5d3ae3 Mon Sep 17 00:00:00 2001
+From: Kurt Mahan <kmahan@freescale.com>
+Date: Fri, 18 Jul 2008 12:40:04 -0600
+Subject: [PATCH] Increase timeouts on I2C bus.
+
+LTIBName: m547x-8x-i2c-timeout-fix
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+---
+ drivers/i2c/busses/i2c-mcf548x.c |   40 +++++++++++++++++++++++++++++--------
+ 1 files changed, 31 insertions(+), 9 deletions(-)
+
+--- a/drivers/i2c/busses/i2c-mcf548x.c
++++ b/drivers/i2c/busses/i2c-mcf548x.c
+@@ -43,8 +43,8 @@ static struct i2c_adapter i2c_mcf_board_
+       .id = I2C_HW_MPC107,
+       .algo_data = &i2c_mcf_board_data,
+       .class = I2C_CLASS_HWMON,
+-      .timeout = 1,
+-      .retries = 1
++      .timeout = 100,
++      .retries = 2
+ };
+ /*
+  *  static void i2c_start()
+@@ -105,7 +105,7 @@ wait_for_bb(
+       for (i = 0; i < adap->timeout; i++) {
+               if (!(MCF_I2SR & MCF_I2SR_IBB))
+                       return 0;
+-              udelay(10);
++              udelay(100);
+       }
+       printk(KERN_ERR "%s: timeout", __FUNCTION__);
+       return -ETIMEDOUT;
+@@ -124,7 +124,7 @@ wait_for_not_bb(
+       for (i = 0; i < adap->timeout; i++) {
+               if (MCF_I2SR & MCF_I2SR_IBB)
+                       return 0;
+-              udelay(10);
++              udelay(100);
+       }
+       printk(KERN_ERR "%s: timeout", __FUNCTION__);
+       return -ETIMEDOUT;
+@@ -146,7 +146,7 @@ wait_xfer_done(
+                       MCF_I2SR &= ~MCF_I2SR_IIF;
+                       return 0;
+               }
+-              udelay(1);
++              udelay(10);
+       }
+       printk(KERN_ERR "%s: timeout", __FUNCTION__);
+       return -ETIMEDOUT;
+@@ -166,7 +166,7 @@ i2c_set_addr(
+ ) {
+       unsigned short flags = msg->flags;
+       unsigned char addr;
+-
++      MCF_I2CR |= MCF_I2CR_MTX;
+       if ((flags & I2C_M_TEN)) {
+               /* 10 bit address not supported yet */
+               return -EIO;
+@@ -269,7 +269,7 @@ mcf_sendbytes(
+               i2c_stop(adap);
+               wait_for_bb(adap);
+       } else {
+-              i2c_repstart(adap);
++      /*      i2c_repstart(adap);*/
+       }
+       return (i);
+@@ -330,7 +330,7 @@ mcf_readbytes(
+               i2c_stop(adap);
+               wait_for_bb(adap);
+       } else {
+-              i2c_repstart(adap);
++      /*      i2c_repstart(adap);*/
+       }
+       return (i+1);
+@@ -380,6 +380,27 @@ mcf_xfer(
+       wait_for_bb(adap);
+       for (i = 0; ret >= 0 && i < num; i++) {
++              if (MCF_I2SR & MCF_I2SR_IBB) {
++                      MCF_I2ICR = 0x00;
++                      MCF_I2CR  = 0x00;
++                      MCF_I2CR  = 0x0A;
++                      timeout = MCF_I2DR;
++                      MCF_I2SR  = 0x00;
++                      MCF_I2CR  = 0x00;
++                      MCF_I2ICR = 0x01;
++              }
++              /* setup SCL clock */
++              MCF_I2FDR = get_clock(adap);
++              /* set slave address */
++              MCF_I2AR = get_own(adap);
++              /* enable I2C module */
++              MCF_I2CR = MCF_I2CR_IEN;
++
++              MCF_I2CR |= MCF_I2CR_TXAK;
++
++              /* Check for bus busy */
++              wait_for_bb(adap);
++
+               pmsg = &msgs[i];
+               printk(KERN_DEBUG "i2c-algo-mcf: Doing %s %d bytes "
+@@ -388,7 +409,7 @@ mcf_xfer(
+                       pmsg->len, pmsg->addr, i + 1, num);
+               /* Send START */
+-              if (i == 0)
++              /*if (i == 0)*/
+                       i2c_start(adap);
+               /* Wait for Bus Busy */
+@@ -440,6 +461,7 @@ mcf_xfer(
+                                       "%d bytes.\n", ret);
+                       }
+               }
++      MCF_I2CR = 0;
+       }
+       /* Disable I2C module */
diff --git a/target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch b/target/linux/coldfire/patches/089-m547x_8x_pci_reset_usb_fix.patch
new file mode 100644 (file)
index 0000000..79a1e39
--- /dev/null
@@ -0,0 +1,49 @@
+Bugzilla 1647. This patch resets PCI which fixes the USB problem on mcf5475.
+
+Set PCI registers MCF_PCIGSCR and MCF_PCITCR to their reset defaults. 
+This fixes the USB problem and enables other PCI cards, such as PCI
+network to function properly.
+
+Original work of Matt Waddel
+Signed-off-by: Ross Wille
+
+--- a/arch/m68k/coldfire/mcf548x-pci.c
++++ b/arch/m68k/coldfire/mcf548x-pci.c
+@@ -1,5 +1,23 @@
+ /*
+  *    ColdFire 547x/548x PCI Host Controller functions
++ *
++ * Copyright (c) 2005-2008 Freescale Semiconductor, Inc.
++ *
++ * This code is based on the 2.6.10 version of pci.c
++ *
++ * 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.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  */
+ #include <linux/kernel.h>
+ #include <linux/types.h>
+@@ -815,6 +833,13 @@ struct pci_bus_info *__init init_coldfir
+               return NULL;
+       }
++      /* Must Reset!!! If bootloader has PCI enabled, it will cause
++       * problem in linux when it tries to configure/find resources
++       * for the pci devices.  Both registers need to be reset.
++       */
++      MCF_PCIGSCR = 0x1;
++      MCF_PCITCR = 0x00000000;
++
+       /* Set up the arbiter */
+       MCF_PCIARB_PACR = 0 /*MCF_PCIARB_PACR_PKMD*/
+                       | MCF_PCIARB_PACR_INTMPRI 
diff --git a/target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch b/target/linux/coldfire/patches/090-m547x_8x_fec_rxfifo_check.patch
new file mode 100644 (file)
index 0000000..85f89c1
--- /dev/null
@@ -0,0 +1,27 @@
+Re-enable rx fifo buffer checks.
+
+LTIBName: linux-2.6.25-m547x-8x-fec-rxfifo-check
+Acked-by: Kurt Mahan <kmahan@freescale.com>
+Signed-off-by: Shrek Wu <b16972@freescale.com>
+--- a/drivers/net/fec/fec.c
++++ b/drivers/net/fec/fec.c
+@@ -941,9 +941,9 @@ void fec_interrupt_fec_rx_handler(struct
+ {
+       struct fec_priv *fp = netdev_priv(dev);
+       struct sk_buff *skb;
++      int i;
+       fp->fecpriv_rxflag = 1;
+-/*
+       // Some buffers can be missed
+       if(!(fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME))
+       {
+@@ -961,7 +961,7 @@ void fec_interrupt_fec_rx_handler(struct
+                       return;
+               }
+       }
+-*/
++
+       for (; fp->fecpriv_rxdesc[fp->fecpriv_current_rx].statCtrl & MCD_FEC_END_FRAME; fp->fecpriv_current_rx = (fp->fecpriv_current_rx + 1) & FEC_RX_INDEX_MASK) {
+           if( (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length <= FEC_MAXBUF_SIZE) &&
+                   (fp->fecpriv_rxdesc[fp->fecpriv_current_rx].length > 4)) { /* --tym-- */
index 7a579b3..0f0694e 100644 (file)
@@ -9,18 +9,6 @@
  {
        pgd_val(*pgdp) = virt_to_phys(pmdp);
  }
---- a/include/asm-m68k/irq.h
-+++ b/include/asm-m68k/irq.h
-@@ -61,7 +61,8 @@
- #define IRQ_USER      8
--extern unsigned int irq_canonicalize(unsigned int irq);
-+//extern unsigned int irq_canonicalize(unsigned int irq);
-+#define irq_canonicalize(irq)  (irq)
- struct pt_regs;
 --- a/arch/m68k/mm/cf-mmu.c
 +++ b/arch/m68k/mm/cf-mmu.c
 @@ -21,6 +21,7 @@
This page took 2.339588 seconds and 4 git commands to generate.