[coldfire]: 2.6.31 support (WiP)
[openwrt/svn-archive/archive.git] / target / linux / coldfire / patches-2.6.31 / 001-coldfire_support.patch
diff --git a/target/linux/coldfire/patches-2.6.31/001-coldfire_support.patch b/target/linux/coldfire/patches-2.6.31/001-coldfire_support.patch
new file mode 100644 (file)
index 0000000..269d13c
--- /dev/null
@@ -0,0 +1,4000 @@
+--- a/arch/m68k/include/asm/atomic_mm.h
++++ b/arch/m68k/include/asm/atomic_mm.h
+@@ -20,12 +20,20 @@
+ 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)
+@@ -45,6 +53,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;
+@@ -155,7 +171,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/arch/m68k/include/asm/bitops_mm.h
++++ b/arch/m68k/include/asm/bitops_mm.h
+@@ -8,6 +8,10 @@
+  * for more details.
+  */
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_bitops.h>
++#else
++
+ #ifndef _LINUX_BITOPS_H
+ #error only <linux/bitops.h> can be included directly
+ #endif
+@@ -461,4 +465,6 @@ static inline int ext2_find_next_bit(con
+ #endif /* __KERNEL__ */
++#endif /* CONFIG_COLDFIRE */
++
+ #endif /* _M68K_BITOPS_H */
+--- a/arch/m68k/include/asm/bootinfo.h
++++ b/arch/m68k/include/asm/bootinfo.h
+@@ -25,6 +25,51 @@
+ #define _M68K_BOOTINFO_H
++#ifndef __ASSEMBLY__
++/*
++ * UBoot Support
++ *
++ * bd_info structure from uboot1.3.2/arch/m68k/include/asm/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_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
+      *
+--- a/arch/m68k/include/asm/cacheflush_mm.h
++++ b/arch/m68k/include/asm/cacheflush_mm.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/arch/m68k/include/asm/checksum_mm.h
++++ b/arch/m68k/include/asm/checksum_mm.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/arch/m68k/include/asm/coldfire.h
++++ b/arch/m68k/include/asm/coldfire.h
+@@ -5,6 +5,9 @@
+  *
+  *    (C) Copyright 1999-2006, Greg Ungerer (gerg@snapgear.com)
+  *    (C) Copyright 2000, Lineo (www.lineo.com)
++ *
++ *    Shrek Wu b16972@freescale.com
++ *    Copyright Freescale Semiconductor, Inc. 2009
+  */
+ /****************************************************************************/
+@@ -19,25 +22,78 @@
+  *    here. Also the peripheral clock (bus clock) divide ratio is set
+  *    at config time too.
+  */
++/*FIXME Jason*/
++#if 0
+ #ifdef CONFIG_CLOCK_SET
+ #define       MCF_CLK         CONFIG_CLOCK_FREQ
+ #define       MCF_BUSCLK      (CONFIG_CLOCK_FREQ / CONFIG_CLOCK_DIV)
+ #else
+ #error "Don't know what your ColdFire CPU clock frequency is??"
+ #endif
++#endif 
++
++
++#define MCF_CLK       CONFIG_MCFCLK
++#define MCF_BUSCLK    (CONFIG_MCFCLK/2)
++
++
++#if defined(CONFIG_M520x)
++#define       MCF_IPSBAR      0xFC000000
++#else
++#define       MCF_IPSBAR      0x40000000
++#endif
++#if defined(CONFIG_M5445X)
++#define MCF_MBAR      0x0
++/*
++ * Even though RAMBAR1 macro should be in the 0x8xxxxxxx range,
++ * here set the CONFIG_SDRAM_BASE value to it to use
++ * SDRAM memory, not SRAM memory.
++ */
++#define MCF_RAMBAR1   (CONFIG_SDRAM_BASE)
++#elif defined(CONFIG_M547X_8X)
++#define MCF_MBAR        0xF0000000
++#define MCF_MMUBAR      0xF1000000
++#define MCF_RAMBAR0     0xF3000000
++#define MCF_RAMBAR1     0xF3001000
++#else
+ /*
+  *    Define the processor support peripherals base address.
+  *    This is generally setup by the boards start up code.
+  */
+ #define       MCF_MBAR        0x10000000
+ #define       MCF_MBAR2       0x80000000
+-#if defined(CONFIG_M520x)
+-#define       MCF_IPSBAR      0xFC000000
+-#else
+-#define       MCF_IPSBAR      0x40000000
+ #endif
++#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__ */
++
++
+ #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
+     defined(CONFIG_M520x)
+ #undef MCF_MBAR
+--- a/arch/m68k/include/asm/delay_mm.h
++++ b/arch/m68k/include/asm/delay_mm.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/arch/m68k/include/asm/div64.h
++++ b/arch/m68k/include/asm/div64.h
+@@ -1,7 +1,7 @@
+ #ifndef _M68K_DIV64_H
+ #define _M68K_DIV64_H
+-#ifdef CONFIG_MMU
++#if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE)
+ #include <linux/types.h>
+--- a/arch/m68k/include/asm/dma_mm.h
++++ b/arch/m68k/include/asm/dma_mm.h
+@@ -4,13 +4,126 @@
+ /* it's useless on the m68k, but unfortunately needed by the new
+    bootmem allocator (but this should do it for this) */
++/*#ifdef CONFIG_COLDFIRE*/
++#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
++#define MAX_DMA_ADDRESS 0xefffffff
++#else
+ #define MAX_DMA_ADDRESS PAGE_OFFSET
++#endif
++#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
++
++#ifdef CONFIG_PCI
++extern int isa_dma_bridge_buggy;
++#else
+ #define isa_dma_bridge_buggy    (0)
++#endif
+ #endif /* _M68K_DMA_H */
+--- a/arch/m68k/include/asm/elf.h
++++ b/arch/m68k/include/asm/elf.h
+@@ -35,6 +35,27 @@
+ #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;
+ #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
+@@ -60,7 +81,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
+@@ -71,8 +92,10 @@ typedef struct user_m68kfp_struct elf_fp
+    the loader.  We need to make sure that it is out of the way of the program
+    that it will "exec", and that there is sufficient room for the brk.  */
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #define ELF_ET_DYN_BASE         0xD0000000UL
++#elif defined(CONFIG_COLDFIRE)
++#define ELF_ET_DYN_BASE               (TASK_UNMAPPED_BASE + 0x10000000)
+ #else
+ #define ELF_ET_DYN_BASE         0x0D800000UL
+ #endif
+@@ -116,4 +139,35 @@ typedef struct user_m68kfp_struct elf_fp
+ #define SET_PERSONALITY(ex) set_personality(PER_LINUX)
++/*
++ * VDSO
++ */
++#ifdef CONFIG_VDSO
++extern unsigned int vdso_enabled;
++
++#define VDSO_BASE     ((unsigned long)current->mm->context.vdso)
++#define VDSO_SYM(x)   (VDSO_BASE + (unsigned long)(x))
++
++#define VDSO_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 VDSO_AUX_ENT */
++#define VDSO_AUX_ENT
++#endif
++
++#define ARCH_DLINFO                                           \
++do {                                                          \
++      /* vdso entry */                                        \
++      VDSO_AUX_ENT;                                           \
++} while (0);
++
+ #endif
+--- a/arch/m68k/include/asm/io_mm.h
++++ b/arch/m68k/include/asm/io_mm.h
+@@ -7,17 +7,24 @@
+  *            - added skeleton for GG-II and Amiga PCMCIA
+  * 2/3/01 RZ: - moved a few more defs into raw_io.h
+  *
+- * inX/outX should not be used by any driver unless it does
+- * ISA access. Other drivers should use function defined in raw_io.h
++ * inX/outX/readX/writeX should not be used by any driver unless it does
++ * ISA or PCI access. Other drivers should use function defined in raw_io.h
+  * or define its own macros on top of these.
+  *
+- *    inX(),outX()              are for ISA I/O
++ *    inX(),outX()              are for PCI and ISA I/O
++ *    readX(),writeX()          are for PCI memory
+  *    isa_readX(),isa_writeX()  are for ISA memory
++ *
++ * moved mem{cpy,set}_*io inside CONFIG_PCI
+  */
+ #ifndef _IO_H
+ #define _IO_H
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_io.h>
++#else
++
+ #ifdef __KERNEL__
+ #include <linux/compiler.h>
+@@ -88,20 +95,20 @@ extern unsigned long gg2_isa_base;
+ #undef MULTI_ISA
+ #endif
+-#define ISA_TYPE_Q40 (1)
+-#define ISA_TYPE_GG2 (2)
+-#define ISA_TYPE_AG  (3)
++#define Q40_ISA (1)
++#define GG2_ISA (2)
++#define AG_ISA  (3)
+ #if defined(CONFIG_Q40) && !defined(MULTI_ISA)
+-#define ISA_TYPE ISA_TYPE_Q40
++#define ISA_TYPE Q40_ISA
+ #define ISA_SEX  0
+ #endif
+ #if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA)
+-#define ISA_TYPE ISA_TYPE_AG
++#define ISA_TYPE AG_ISA
+ #define ISA_SEX  1
+ #endif
+ #if defined(CONFIG_GG2) && !defined(MULTI_ISA)
+-#define ISA_TYPE ISA_TYPE_GG2
++#define ISA_TYPE GG2_ISA
+ #define ISA_SEX  0
+ #endif
+@@ -123,13 +130,13 @@ static inline u8 __iomem *isa_itb(unsign
+   switch(ISA_TYPE)
+     {
+ #ifdef CONFIG_Q40
+-    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr);
++    case Q40_ISA: return (u8 __iomem *)Q40_ISA_IO_B(addr);
+ #endif
+ #ifdef CONFIG_GG2
+-    case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_IO_B(addr);
++    case GG2_ISA: return (u8 __iomem *)GG2_ISA_IO_B(addr);
+ #endif
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
++    case AG_ISA: return (u8 __iomem *)AG_ISA_IO_B(addr);
+ #endif
+     default: return NULL; /* avoid warnings, just in case */
+     }
+@@ -139,13 +146,13 @@ static inline u16 __iomem *isa_itw(unsig
+   switch(ISA_TYPE)
+     {
+ #ifdef CONFIG_Q40
+-    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr);
++    case Q40_ISA: return (u16 __iomem *)Q40_ISA_IO_W(addr);
+ #endif
+ #ifdef CONFIG_GG2
+-    case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_IO_W(addr);
++    case GG2_ISA: return (u16 __iomem *)GG2_ISA_IO_W(addr);
+ #endif
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
++    case AG_ISA: return (u16 __iomem *)AG_ISA_IO_W(addr);
+ #endif
+     default: return NULL; /* avoid warnings, just in case */
+     }
+@@ -155,7 +162,7 @@ static inline u32 __iomem *isa_itl(unsig
+   switch(ISA_TYPE)
+     {
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
++    case AG_ISA: return (u32 __iomem *)AG_ISA_IO_W(addr);
+ #endif
+     default: return 0; /* avoid warnings, just in case */
+     }
+@@ -165,13 +172,13 @@ static inline u8 __iomem *isa_mtb(unsign
+   switch(ISA_TYPE)
+     {
+ #ifdef CONFIG_Q40
+-    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
++    case Q40_ISA: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
+ #endif
+ #ifdef CONFIG_GG2
+-    case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
++    case GG2_ISA: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
+ #endif
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: return (u8 __iomem *)addr;
++    case AG_ISA: return (u8 __iomem *)addr;
+ #endif
+     default: return NULL; /* avoid warnings, just in case */
+     }
+@@ -181,13 +188,13 @@ static inline u16 __iomem *isa_mtw(unsig
+   switch(ISA_TYPE)
+     {
+ #ifdef CONFIG_Q40
+-    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
++    case Q40_ISA: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
+ #endif
+ #ifdef CONFIG_GG2
+-    case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
++    case GG2_ISA: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
+ #endif
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: return (u16 __iomem *)addr;
++    case AG_ISA: return (u16 __iomem *)addr;
+ #endif
+     default: return NULL; /* avoid warnings, just in case */
+     }
+@@ -201,30 +208,29 @@ 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)))
+-#define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
+-#define isa_readw(p)       \
+-      (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
+-               : in_le16(isa_mtw((unsigned long)(p))))
+-#define isa_writeb(val,p)  out_8(isa_mtb((unsigned long)(p)),(val))
+-#define isa_writew(val,p)  \
+-      (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
+-               : out_le16(isa_mtw((unsigned long)(p)),(val)))
+-
++#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)))
+ static inline void isa_delay(void)
+ {
+-  switch(ISA_TYPE)
+-    {
++      switch (ISA_TYPE) {
+ #ifdef CONFIG_Q40
+-    case ISA_TYPE_Q40: isa_outb(0,0x80); break;
++      case Q40_ISA:
++              isa_outb(0, 0x80);
++              break;
+ #endif
+ #ifdef CONFIG_GG2
+-    case ISA_TYPE_GG2: break;
++      case GG2_ISA:
++              break;
+ #endif
+ #ifdef CONFIG_AMIGA_PCMCIA
+-    case ISA_TYPE_AG: break;
++      case AG_ISA:
++              break;
+ #endif
+-    default: break; /* avoid warnings */
+-    }
++      default:
++              break; /* avoid warnings */
++      }
+ }
+ #define isa_inb_p(p)      ({u8 v=isa_inb(p);isa_delay();v;})
+@@ -253,7 +259,10 @@ static inline void isa_delay(void)
+        (ISA_SEX ? raw_outsl(isa_itl(port), (u32 *)(buf), (nr)) :  \
+                   raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
++#endif  /* CONFIG_ISA */
++
++#if defined(CONFIG_ISA) && !defined(CONFIG_PCI)
+ #define inb     isa_inb
+ #define inb_p   isa_inb_p
+ #define outb    isa_outb
+@@ -276,9 +285,80 @@ static inline void isa_delay(void)
+ #define readw   isa_readw
+ #define writeb  isa_writeb
+ #define writew  isa_writew
++#endif /* CONFIG_ISA */
++
++#if defined(CONFIG_PCI)
++
++#define readl(addr)      in_le32(addr)
++#define writel(val, addr) out_le32((addr), (val))
++
++/* those can be defined for both ISA and PCI - it won't work though */
++#define readb(addr)       in_8(addr)
++#define readw(addr)       in_le16(addr)
++#define writeb(val, addr)  out_8((addr), (val))
++#define writew(val, addr)  out_le16((addr), (val))
++
++#define readb_relaxed(addr) readb(addr)
++#define readw_relaxed(addr) readw(addr)
++#define readl_relaxed(addr) readl(addr)
++
++#ifndef CONFIG_ISA
++#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)
++
++#define __raw_readb readb
++#define __raw_readw readw
++#define __raw_readl readl
++#define __raw_writeb writeb
++#define __raw_writew writew
++#define __raw_writel writel
+-#else  /* CONFIG_ISA */
++#else
++/*
++ * kernel with both ISA and PCI compiled in, those have
++ * conflicting defs for in/out. Simply consider port < 1024
++ * ISA and everything else PCI. read,write not defined
++ * in this case
++ */
++#define inb(port) ((port) < 1024 ? isa_inb(port) : in_8(port))
++#define inb_p(port) ((port) < 1024 ? isa_inb_p(port) : in_8(port))
++#define inw(port) ((port) < 1024 ? isa_inw(port) : in_le16(port))
++#define inw_p(port) ((port) < 1024 ? isa_inw_p(port) : in_le16(port))
++#define inl(port) ((port) < 1024 ? isa_inl(port) : in_le32(port))
++#define inl_p(port) ((port) < 1024 ? isa_inl_p(port) : in_le32(port))
++
++#define outb(val, port) (((port) < 1024) ? isa_outb((val), (port))
++              : out_8((port), (val)))
++#define outb_p(val, port) (((port) < 1024) ? isa_outb_p((val), (port))
++              : out_8((port), (val)))
++#define outw(val, port) (((port) < 1024) ? isa_outw((val), (port))
++              : out_le16((port), (val)))
++#define outw_p(val, port) (((port) < 1024) ? isa_outw_p((val), (port))
++              : out_le16((port), (val)))
++#define outl(val, port) (((port) < 1024) ? isa_outl((val), (port))
++              : out_le32((port), (val)))
++#define outl_p(val, port) (((port) < 1024) ? isa_outl_p((val), (port))
++              : out_le32((port), (val)))
++#endif
++#endif /* CONFIG_PCI */
++#if !defined(CONFIG_ISA) && !defined(CONFIG_PCI)
+ /*
+  * We need to define dummy functions for GENERIC_IOMAP support.
+  */
+@@ -305,11 +385,11 @@ static inline void isa_delay(void)
+ #define writeb(val,addr) out_8((addr),(val))
+ #define readw(addr)      in_le16(addr)
+ #define writew(val,addr) out_le16((addr),(val))
+-
+-#endif /* CONFIG_ISA */
+-
++#endif
++#if !defined(CONFIG_PCI)
+ #define readl(addr)      in_le32(addr)
+ #define writel(val,addr) out_le32((addr),(val))
++#endif
+ #define mmiowb()
+@@ -345,10 +425,10 @@ 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
++#else
++#define IO_SPACE_LIMIT 0xffff
+ #endif
+ #endif /* __KERNEL__ */
+@@ -366,4 +446,5 @@ static inline void memcpy_toio(volatile
+  */
+ #define xlate_dev_kmem_ptr(p) p
++#endif /* CONFIG_COLDFIRE */
+ #endif /* _IO_H */
+--- a/arch/m68k/include/asm/irq_mm.h
++++ b/arch/m68k/include/asm/irq_mm.h
+@@ -12,7 +12,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/arch/m68k/include/asm/machdep_mm.h
++++ b/arch/m68k/include/asm/machdep_mm.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/arch/m68k/include/asm/mcfsim.h
++++ b/arch/m68k/include/asm/mcfsim.h
+@@ -39,6 +39,25 @@
+ #include <asm/m5407sim.h>
+ #endif
++#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_ccm.h>
++#include <asm/mcf5445x_eport.h>
++#include <asm/mcf5445x_fbcs.h>
++#include <asm/mcf5445x_xbs.h>
++#include <asm/mcf5445x_dtim.h>
++#include <asm/mcf5445x_rtc.h>
++#include <asm/mcf5445x_scm.h>
++#elif defined(CONFIG_M547X_8X)
++#include <asm/m5485sim.h>
++#include <asm/m5485gpio.h>
++#include <asm/m5485gpt.h>
++#endif
+ /*
+  *    Define the base address of the SIM within the MBAR address space.
+--- a/arch/m68k/include/asm/mmu_context.h
++++ b/arch/m68k/include/asm/mmu_context.h
+@@ -8,7 +8,7 @@ static inline void enter_lazy_tlb(struct
+ }
+ #ifdef CONFIG_MMU
+-#ifndef CONFIG_SUN3
++#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
+ #include <asm/setup.h>
+ #include <asm/page.h>
+@@ -103,7 +103,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>
+@@ -151,7 +151,179 @@ static inline void activate_mm(struct mm
+       activate_context(next_mm);
+ }
++#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
++
++#ifdef CONFIG_VDSO
++#define cpu_context(mm)               ((mm)->context.id)
++#else
++#define cpu_context(mm)               ((mm)->context)
++#endif
++
++#ifdef CONFIG_VDSO
++extern void set_context(unsigned long context, pgd_t *pgd);
++#else
++extern void set_context(mm_context_t context, pgd_t *pgd);
++#endif
++extern unsigned long context_map[];
++#ifdef CONFIG_VDSO
++extern unsigned long next_mmu_context;
++#else
++extern mm_context_t next_mmu_context;
++#endif
++
++
++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)
++{
++#ifdef CONFIG_VDSO
++      unsigned long ctx;
++#else
++      mm_context_t ctx;
+ #endif
++
++      if (cpu_context(mm) != 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;
++      cpu_context(mm) = ctx;
++      context_mm[ctx] = mm;
++}
++
++/*
++ * Set up the context for a new address space.
++ */
++#define init_new_context(tsk, mm)     ((cpu_context(mm) = NO_CONTEXT), 0)
++/* #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 (cpu_context(mm) != NO_CONTEXT) {
++              clear_bit(cpu_context(mm), context_map);
++              cpu_context(mm) = 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(cpu_context(tsk->mm), 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(cpu_context(mm), 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(KERN_INFO "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 = cpu_context(mm) & 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(KERN_ERR "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 */
++
+ #else /* !CONFIG_MMU */
+ static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
+--- a/arch/m68k/include/asm/page_mm.h
++++ b/arch/m68k/include/asm/page_mm.h
+@@ -1,10 +1,15 @@
+ #ifndef _M68K_PAGE_H
+ #define _M68K_PAGE_H
++/*#if defined(CONFIG_COLDFIRE)*/
++#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
++#include <asm/cf_page.h>
++#else
++
+ #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)
+@@ -113,10 +118,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;
+@@ -138,6 +164,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 */
+@@ -169,6 +196,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)
+@@ -225,4 +254,10 @@ static inline __attribute_const__ int __
+ #include <asm-generic/getorder.h>
++#ifdef CONFIG_VDSO
++/* vDSO support */
++#define __HAVE_ARCH_GATE_AREA
++#endif
++
++#endif /* !CONFIG_COLDFIRE */
+ #endif /* _M68K_PAGE_H */
+--- a/arch/m68k/include/asm/page_offset.h
++++ b/arch/m68k/include/asm/page_offset.h
+@@ -1,10 +1,13 @@
+ /* This handles the memory map.. */
+ #ifdef CONFIG_MMU
+-#ifndef CONFIG_SUN3
+-#define PAGE_OFFSET_RAW               0x00000000
+-#else
++#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)
++#else
++#define PAGE_OFFSET_RAW               0x00000000
+ #endif
+ #else
+ #define       PAGE_OFFSET_RAW         CONFIG_RAMBASE
+--- a/arch/m68k/include/asm/pgalloc.h
++++ b/arch/m68k/include/asm/pgalloc.h
+@@ -7,8 +7,10 @@
+ #ifdef CONFIG_MMU
+ #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/arch/m68k/include/asm/pgtable_mm.h
++++ b/arch/m68k/include/asm/pgtable_mm.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      0xe8000000
+ #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
+@@ -138,6 +153,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
+@@ -152,6 +170,7 @@ static inline void update_mmu_cache(stru
+           ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S))  \
+           : (prot)))
++#endif /* CONFIG_COLDFIRE */
+ #include <asm-generic/pgtable.h>
+ #endif /* !__ASSEMBLY__ */
+--- a/arch/m68k/include/asm/processor_mm.h
++++ b/arch/m68k/include/asm/processor_mm.h
+@@ -2,6 +2,7 @@
+  * include/asm-m68k/processor.h
+  *
+  * Copyright (C) 1995 Hamish Macdonald
++ * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
+  */
+ #ifndef __ASM_M68K_PROCESSOR_H
+@@ -22,24 +23,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 +64,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     0x60000000UL
++#else /* CONFIG_SUN3 */
+ #define TASK_UNMAPPED_BASE    0x0A000000UL
+ #endif
+ #define TASK_UNMAPPED_ALIGN(addr, off)        PAGE_ALIGN(addr)
+@@ -60,7 +77,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 +102,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 +113,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/arch/m68k/include/asm/ptrace.h
++++ b/arch/m68k/include/asm/ptrace.h
+@@ -39,10 +39,21 @@ struct pt_regs {
+   long     orig_d0;
+   long     stkadj;
+ #ifdef CONFIG_COLDFIRE
++#if 0
+   unsigned format :  4; /* frame format specifier */
+   unsigned vector : 12; /* vector offset */
+   unsigned short sr;
+   unsigned long  pc;
++#endif
++/*FROM BSP*/
++    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;
+ #else
+   unsigned short sr;
+   unsigned long  pc;
+@@ -71,6 +82,8 @@ struct switch_stack {
+ #define PTRACE_GETFPREGS          14
+ #define PTRACE_SETFPREGS          15
++#define PTRACE_GET_THREAD_AREA    25
++
+ #ifdef __KERNEL__
+ #ifndef PS_S
+--- a/arch/m68k/include/asm/raw_io.h
++++ b/arch/m68k/include/asm/raw_io.h
+@@ -8,6 +8,10 @@
+ #ifndef _RAW_IO_H
+ #define _RAW_IO_H
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_raw_io.h>
++#else
++
+ #ifdef __KERNEL__
+ #include <asm/types.h>
+@@ -60,6 +64,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))
++
+ static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
+ {
+       unsigned int i;
+@@ -344,4 +351,6 @@ static inline void raw_outsw_swapw(volat
+ #endif /* __KERNEL__ */
++#endif /* CONFIG_COLDFIRE */
++
+ #endif /* _RAW_IO_H */
+--- a/arch/m68k/include/asm/segment.h
++++ b/arch/m68k/include/asm/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)
+ {
+ #ifdef CONFIG_MMU
+@@ -56,6 +57,15 @@ static inline void set_fs(mm_segment_t v
+ #endif
+ }
++#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/arch/m68k/include/asm/setup.h
++++ b/arch/m68k/include/asm/setup.h
+@@ -2,6 +2,7 @@
+ ** asm/setup.h -- Definition of the Linux/m68k setup information
+ **
+ ** Copyright 1992 by Greg Harp
++ * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
+ **
+ ** 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
+@@ -40,6 +41,7 @@
+ #define MACH_HP300    9
+ #define MACH_Q40     10
+ #define MACH_SUN3X   11
++#define MACH_CFMMU   12
+ #define COMMAND_LINE_SIZE 256
+@@ -189,6 +191,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 +221,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)
++#ifdef CONFIG_M547X_8X
++#define FPU_CFV4E      (1<<FPUB_CFV4E)
++#else
++#define FPU_CFV4E      0
++#endif
+ #define MMUB_68851     0
+ #define MMUB_68030     1                       /* Internal MMU */
+@@ -235,6 +253,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 +261,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 +361,14 @@ extern int m68k_is040or060;
+ #  endif
+ #endif
++#if !defined(CONFIG_CFV4E)
++#  define CPU_IS_COLDFIRE (0)
++#else
++#  define CPU_IS_COLDFIRE (m68k_cputype & CPU_CFV4E)
++#  define CPU_IS_CFV4E    (m68k_cputype & CPU_CFV4E)
++#  define MMU_IS_CFV4E    (m68k_mmutype & MMU_CFV4E)
++#endif
++
+ #define CPU_TYPE (m68k_cputype)
+ #ifdef CONFIG_M68KFPU_EMU
+@@ -371,6 +399,14 @@ extern int m68k_realnum_memory;           /* real
+ extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
+ #endif
++#ifdef CONFIG_CFV4E
++#define QCHIP_RESTORE_DIRECTIVE ".chip 547x"
++#define  CHIP_RESTORE_DIRECTIVE  .chip 547x
++#else
++#define QCHIP_RESTORE_DIRECTIVE ".chip 68k"
++#define  CHIP_RESTORE_DIRECTIVE  .chip 68k
++#endif
++
+ #endif /* __KERNEL__ */
+ #endif /* _M68K_SETUP_H */
+--- a/arch/m68k/include/asm/sigcontext.h
++++ b/arch/m68k/include/asm/sigcontext.h
+@@ -15,9 +15,15 @@ struct sigcontext {
+       unsigned long  sc_pc;
+       unsigned short sc_formatvec;
+ #ifndef __uClinux__
++# ifdef __mcoldfire__
++      unsigned long  sc_fpregs[2][2]; /* room for two fp registers */
++      unsigned long  sc_fpcntl[3];
++      unsigned char  sc_fpstate[16+6*8];
++# else
+       unsigned long  sc_fpregs[2*3];  /* room for two fp registers */
+       unsigned long  sc_fpcntl[3];
+       unsigned char  sc_fpstate[216];
++# endif
+ #endif
+ };
+--- a/arch/m68k/include/asm/siginfo.h
++++ b/arch/m68k/include/asm/siginfo.h
+@@ -29,7 +29,8 @@ typedef struct siginfo {
+               struct {
+                       timer_t _tid;           /* timer id */
+                       int _overrun;           /* overrun count */
+-                      char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
++                      char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)
++                                + sizeof(__kernel_uid_t)];
+                       sigval_t _sigval;       /* same as below */
+                       int _sys_private;       /* not to be passed to user */
+               } _timer;
+@@ -38,18 +39,18 @@ typedef struct siginfo {
+               struct {
+                       __kernel_pid_t _pid;    /* sender's pid */
+                       __kernel_uid_t _uid;    /* backwards compatibility */
+-                      sigval_t _sigval;
+                       __kernel_uid32_t _uid32; /* sender's uid */
++                      sigval_t _sigval;
+               } _rt;
+               /* SIGCHLD */
+               struct {
+                       __kernel_pid_t _pid;    /* which child */
+                       __kernel_uid_t _uid;    /* backwards compatibility */
+-                      int _status;            /* exit code */
++                      __kernel_uid32_t _uid32; /* sender's uid */
+                       clock_t _utime;
+                       clock_t _stime;
+-                      __kernel_uid32_t _uid32; /* sender's uid */
++                      int _status;            /* exit code */
+               } _sigchld;
+               /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
+--- a/arch/m68k/include/asm/signal.h
++++ b/arch/m68k/include/asm/signal.h
+@@ -150,7 +150,8 @@ typedef struct sigaltstack {
+ #ifdef __KERNEL__
+ #include <asm/sigcontext.h>
+-#ifndef __uClinux__
++//#ifndef __uClinux__
++#ifndef CONFIG_COLDFIRE   /*FIXME Jason*/
+ #define __HAVE_ARCH_SIG_BITOPS
+ static inline void sigaddset(sigset_t *set, int _sig)
+@@ -201,7 +202,6 @@ static inline int sigfindinword(unsigned
+ struct pt_regs;
+ extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
+-
+ #else
+ #undef __HAVE_ARCH_SIG_BITOPS
+--- a/arch/m68k/include/asm/string_mm.h
++++ b/arch/m68k/include/asm/string_mm.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/arch/m68k/include/asm/swab.h
++++ b/arch/m68k/include/asm/swab.h
+@@ -4,7 +4,7 @@
+ #include <linux/types.h>
+ #include <linux/compiler.h>
+-#define __SWAB_64_THRU_32__
++/*#define __SWAB_64_THRU_32__
+ #if defined (__mcfisaaplus__) || defined (__mcfisac__)
+ static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
+@@ -23,5 +23,29 @@ static inline __attribute_const__ __u32
+ }
+ #define __arch_swab32 __arch_swab32
+ #endif
++*/
++#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));
++      return val;
++}
++#define __arch__swab32(x) ___arch__swab32(x)
++
++#endif
++#endif
++
++#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
++#  define __BYTEORDER_HAS_U64__
++#  define __SWAB_64_THRU_32__
++#endif
+ #endif /* _M68K_SWAB_H */
+--- a/arch/m68k/include/asm/system_mm.h
++++ b/arch/m68k/include/asm/system_mm.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/arch/m68k/include/asm/thread_info_mm.h
++++ b/arch/m68k/include/asm/thread_info_mm.h
+@@ -10,6 +10,7 @@ struct thread_info {
+       struct exec_domain      *exec_domain;   /* execution domain */
+       int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
+       __u32 cpu; /* should always be 0 on m68k */
++      unsigned long tp_value;
+       struct restart_block    restart_block;
+ };
+--- a/arch/m68k/include/asm/tlbflush.h
++++ b/arch/m68k/include/asm/tlbflush.h
+@@ -2,7 +2,7 @@
+ #define _M68K_TLBFLUSH_H
+ #ifdef CONFIG_MMU
+-#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,15 @@ 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
+ #else /* !CONFIG_MMU */
+--- a/arch/m68k/include/asm/uaccess_mm.h
++++ b/arch/m68k/include/asm/uaccess_mm.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
+  */
+@@ -371,4 +374,5 @@ unsigned long __clear_user(void __user *
+ #define strlen_user(str) strnlen_user(str, 32767)
++#endif /* CONFIG_COLDFIRE */
+ #endif /* _M68K_UACCESS_H */
+--- a/arch/m68k/include/asm/ucontext.h
++++ b/arch/m68k/include/asm/ucontext.h
+@@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
+ typedef struct fpregset {
+       int f_fpcntl[3];
++#ifdef __mcoldfire__
++      int f_fpregs[8][2];
++#else
+       int f_fpregs[8*3];
++#endif
+ } fpregset_t;
+ struct mcontext {
+--- a/arch/m68k/include/asm/unistd.h
++++ b/arch/m68k/include/asm/unistd.h
+@@ -336,10 +336,14 @@
+ #define __NR_pwritev          330
+ #define __NR_rt_tgsigqueueinfo        331
+ #define __NR_perf_counter_open        332
++#define __NR_read_tp          333
++#define __NR_write_tp         334
++#define __NR_atomic_cmpxchg_32        335
++#define __NR_atomic_barrier   336
+ #ifdef __KERNEL__
+-#define NR_syscalls           333
++#define NR_syscalls           337
+ #define __ARCH_WANT_IPC_PARSE_VERSION
+ #define __ARCH_WANT_OLD_READDIR
+--- a/arch/m68k/include/asm/virtconvert.h
++++ b/arch/m68k/include/asm/virtconvert.h
+@@ -1,6 +1,10 @@
+ #ifndef __VIRT_CONVERT__
+ #define __VIRT_CONVERT__
++#ifdef CONFIG_COLDFIRE
++#include <asm/cf_virtconvert.h>
++#else
++
+ /*
+  * Macros used for converting between virtual and physical mappings.
+  */
+@@ -46,3 +50,4 @@ static inline void *phys_to_virt(unsigne
+ #endif
+ #endif
++#endif
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -12,6 +12,14 @@ config MMU
+       bool
+       default y
++config GENERIC_TIME
++        bool "Enable generic timer"
++        default n
++
++config GENERIC_CLOCKEVENTS
++        bool "Enable generic clockevents"
++        default n
++
+ config RWSEM_GENERIC_SPINLOCK
+       bool
+       default y
+@@ -37,7 +45,7 @@ config GENERIC_CALIBRATE_DELAY
+ config TIME_LOW_RES
+       bool
+-      default y
++      default n
+ config GENERIC_IOMAP
+       bool
+@@ -49,7 +57,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
+@@ -107,6 +115,35 @@ config PCMCIA
+         To compile this driver as modules, choose M here: the
+         modules will be called pcmcia_core and ds.
++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 FPU
++      bool "ColdFire V4e FPU support"
++      default n
++      help
++         This enables support for CFV4E FPU feature.
++
++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"
+       select MMU_MOTOROLA if MMU
+@@ -124,6 +161,16 @@ config ATARI
+         this kernel on an Atari, say Y here and browse the material
+         available in <file:Documentation/m68k>; otherwise say N.
++config PCI
++      bool "PCI bus support"
++      depends on 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
++        your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
++        VESA. If you have PCI, say Y, otherwise N.
++
+ config MAC
+       bool "Macintosh support"
+       select MMU_MOTOROLA if MMU
+@@ -278,6 +325,118 @@ 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
++      select GENERIC_TIME
++      select USB_EHCI_FSL
++      select HAVE_FSL_USB_DR
++      help
++          This option will add support for the MCF544x 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 HAVE_FSL_USB_DR
++      bool
++      default n
++
++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 240000000 if M54451EVB
++      default 266666666 if M54455EVB
++      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
+@@ -285,6 +444,70 @@ config MMU_SUN3
+       bool
+       depends on MMU && !MMU_MOTOROLA
++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 DMA_BASE
++      hex
++      depends on COLDFIRE
++      default 0xef000000
++
++config DMA_SIZE
++      hex
++      depends on COLDFIRE
++      default 0x1000000 if M5445X
++      default 0x800000 if M547X_8X
++
++config SRAM
++      bool "SRAM allocation APIs support on mcfv4 platform"
++      depends on COLDFIRE && M5445X
++      default y
++      select GENERIC_ALLOCATOR
++
++config SRAM_BASE
++      hex
++      depends on COLDFIRE && SRAM
++      default 0x8ff00000 if M5445X
++
++config SRAM_SIZE
++      hex
++      depends on COLDFIRE && SRAM
++      default 0x8000 if M5445X
++
++config SRAM_ALLOC_GRANULARITY
++      hex
++      depends on SRAM
++      default 0x200 if M5445X
++
++config VDSO
++      bool "Support VDSO page"
++      depends on MMU
++      default n
++      help
++        This will enable support for the kernel mapping a vDSO page
++        in process space, and subsequently handing down the entry point
++        to the libc through the ELF auxiliary vector.
++
+ config M68KFPU_EMU
+       bool "Math emulation support (EXPERIMENTAL)"
+       depends on EXPERIMENTAL
+@@ -451,6 +674,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
+@@ -589,7 +820,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_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_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
+@@ -612,6 +843,8 @@ config SERIAL_CONSOLE
+ endmenu
++source "kernel/time/Kconfig"
++
+ source "fs/Kconfig"
+ source "arch/m68k/Kconfig.debug"
+--- a/arch/m68k/kernel/asm-offsets.c
++++ b/arch/m68k/kernel/asm-offsets.c
+@@ -2,6 +2,11 @@
+  * This program is used to generate definitions needed by
+  * assembly language modules.
+  *
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *  Jason Jin Jason.Jin@freescale.com
++ *  Shrek Wu B16972@freescale.com
++ *  Add Codlfire support
++ *
+  * We use the technique used in the OSF Mach kernel code:
+  * generate asm statements containing #defines,
+  * compile this file to assembler, and then extract the
+@@ -56,8 +61,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
+@@ -1,4 +1,7 @@
+ /*
++ * Copyright Freescale Semiconductor, Inc. 2008, 2009
++ *    Jason Jin Jason.Jin@freescale.com
++ *    Shrek Wu B16972@freescale.com
+  * 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.
+@@ -11,12 +14,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_M5445X) | defined(CONFIG_M547X_8X)
++        /*
++      * 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 +70,7 @@ void *dma_alloc_coherent(struct device *
+       kfree(map);
+       return addr;
++#endif
+ }
+ EXPORT_SYMBOL(dma_alloc_coherent);
+@@ -62,7 +78,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_M5445X) | defined(CONFIG_M547X_8X)
++      kfree(addr);
++#else
+       vfree(addr);
++#endif
+ }
+ EXPORT_SYMBOL(dma_free_coherent);
+@@ -88,9 +108,16 @@ void dma_sync_sg_for_device(struct devic
+                           enum dma_data_direction dir)
+ {
+       int i;
++#ifdef CONFIG_COLDFIRE
++      struct scatterlist *_sg;
++      for_each_sg(sg, _sg, nents, i)
++              dma_sync_single_for_device(dev, _sg->dma_address,
++                              _sg->length, dir);
++#else
+       for (i = 0; i < nents; sg++, i++)
+               dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
++#endif
+ }
+ EXPORT_SYMBOL(dma_sync_sg_for_device);
+@@ -119,10 +146,19 @@ int dma_map_sg(struct device *dev, struc
+              enum dma_data_direction dir)
+ {
+       int i;
+-
++#ifdef CONFIG_COLDFIRE
++      struct scatterlist *_sg;
++#endif
++#ifndef CONFIG_COLDFIRE
+       for (i = 0; i < nents; sg++, i++) {
+               sg->dma_address = sg_phys(sg);
+               dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
++#else
++      for_each_sg(sg, _sg, nents, i) {
++              _sg->dma_address = sg_phys(_sg);
++              dma_sync_single_for_device(dev, _sg->dma_address,
++                              _sg->length, dir);
++#endif
+       }
+       return nents;
+ }
+--- a/arch/m68k/kernel/Makefile
++++ b/arch/m68k/kernel/Makefile
+@@ -2,16 +2,26 @@
+ # 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 time.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 time.o
++else   # CONFIG_COLDFIRE
++  extra-y := 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 \
+-         sys_m68k.o time.o setup.o m68k_ksyms.o devres.o
++obj-y += process.o ptrace.o module.o \
++         sys_m68k.o setup.o m68k_ksyms.o devres.o# semaphore.o
+ devres-y = ../../../kernel/irq/devres.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
+@@ -4,6 +4,11 @@
+  *  Copyright (C) 1995  Hamish Macdonald
+  *
+  *  68060 fixes by Jesper Skov
++ *
++ *  Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
++ *  Kurt.Mahan@freescale.com
++ *  Jason Jin Jason.Jin@freescale.com
++ *  Shrek Wu B16972@freescale.com
+  */
+ /*
+@@ -186,12 +191,21 @@ EXPORT_SYMBOL(kernel_thread);
+ void flush_thread(void)
+ {
+       unsigned long zero = 0;
++#if !defined(CONFIG_COLDFIRE)
+       set_fs(USER_DS);
+       current->thread.fs = __USER_DS;
+       if (!FPU_IS_EMU)
+               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
+ }
+ /*
+@@ -251,10 +265,15 @@ int copy_thread(unsigned long clone_flag
+       p->thread.usp = usp;
+       p->thread.ksp = (unsigned long)childstack;
++
++      if (clone_flags & CLONE_SETTLS)
++              task_thread_info(p)->tp_value = regs->d5;
++
+       /*
+        * 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) {
+@@ -266,9 +285,34 @@ int copy_thread(unsigned long clone_flag
+                               "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;
+ }
+@@ -277,7 +321,9 @@ int copy_thread(unsigned long clone_flag
+ 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;
+@@ -294,6 +340,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;
+@@ -304,6 +351,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/ptrace.c
++++ b/arch/m68k/kernel/ptrace.c
+@@ -265,6 +265,11 @@ long arch_ptrace(struct task_struct *chi
+                       ret = -EFAULT;
+               break;
++      case PTRACE_GET_THREAD_AREA:
++              ret = put_user(task_thread_info(child)->tp_value,
++                              (unsigned long __user *) data);
++              break;
++
+       default:
+               ret = ptrace_request(child, request, addr, data);
+               break;
+--- a/arch/m68k/kernel/setup.c
++++ b/arch/m68k/kernel/setup.c
+@@ -2,6 +2,9 @@
+  *  linux/arch/m68k/kernel/setup.c
+  *
+  *  Copyright (C) 1995  Hamish Macdonald
++ *  Copyright Freescale Semiconductor, Inc. 2008, 2009
++ *      Jason Jin Jason.Jin@freescale.com
++ *      Shrek Wu B16972@freescale.com 
+  */
+ /*
+@@ -75,13 +78,24 @@ 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);
+ void (*mach_get_hardware_list) (struct seq_file *m);
++
++#ifdef CONFIG_COLDFIRE
++void (*mach_tick)(void);
++#endif
++
+ /* machine dependent timer functions */
+ unsigned long (*mach_gettimeoffset) (void);
+ int (*mach_hwclk) (int, struct rtc_time*);
+@@ -137,13 +151,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)) {
+               int unknown = 0;
+               const unsigned long *data = record->data;
+@@ -203,6 +221,10 @@ static void __init m68k_parse_bootinfo(c
+                                             record->size);
+       }
++#ifdef CONFIG_COLDFIRE
++      coldfire_sort_memrec();
++#endif
++
+       m68k_realnum_memory = m68k_num_memory;
+ #ifdef CONFIG_SINGLE_MEMORY_CHUNK
+       if (m68k_num_memory > 1) {
+@@ -215,8 +237,11 @@ static void __init m68k_parse_bootinfo(c
+ void __init setup_arch(char **cmdline_p)
+ {
+-      int i;
++#if !defined(CONFIG_SUN3)
++      int i;
++#endif
++      
+       /* The bootinfo is located right after the kernel bss */
+       m68k_parse_bootinfo((const struct bi_record *)_end);
+@@ -230,9 +255,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));
+       }
+@@ -320,13 +346,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)
+       for (i = 1; i < m68k_num_memory; i++)
+               free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
+                                 m68k_memory[i].size);
+@@ -353,6 +384,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 (MACH_IS_Q40) {
+@@ -383,6 +418,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";
+@@ -396,6 +432,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;
+@@ -414,6 +453,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
+@@ -430,6 +471,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";
+@@ -512,7 +555,7 @@ module_init(proc_hardware_init);
+ 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
+@@ -1,5 +1,8 @@
+ /*
+  * linux/arch/m68k/kernel/sys_m68k.c
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *  Jason Jin Jason.Jin@freescale.com
++ *  Shrek Wu B16972@freescale.com
+  *
+  * This file contains various random system calls that
+  * have a non-standard calling sequence on the Linux/m68k
+@@ -29,6 +32,14 @@
+ #include <asm/traps.h>
+ #include <asm/page.h>
+ #include <asm/unistd.h>
++#include <linux/elf.h>
++#include <asm/tlb.h>
++#ifdef CONFIG_COLDFIRE
++#include <asm/cacheflush.h>
++#endif
++
++asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
++                      unsigned long error_code);
+ /* common code for old and new mmaps */
+ static inline long do_mmap2(
+@@ -240,6 +251,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)                                               \
+ ({                                                                    \
+@@ -563,6 +575,7 @@ cache_flush_060 (unsigned long addr, int
+     }
+   return 0;
+ }
++#endif /* CONFIG_COLDFIRE */
+ /* sys_cacheflush -- flush (part of) the processor cache.  */
+ asmlinkage int
+@@ -595,6 +608,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;
+@@ -639,6 +653,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;
+@@ -663,3 +687,79 @@ int kernel_execve(const char *filename,
+                       : "d" (__a), "d" (__b), "d" (__c));
+       return __res;
+ }
++
++asmlinkage unsigned long
++sys_read_tp(void)
++{
++      return current_thread_info()->tp_value;
++}
++
++asmlinkage int
++sys_write_tp(unsigned long tp)
++{
++      current_thread_info()->tp_value = tp;
++      return 0;
++}
++
++/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
++   D1 (newval).  */
++asmlinkage int
++sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
++              unsigned long __user *mem)
++{
++      /* This was borrowed from ARM's implementation.  */
++      for (;;) {
++              struct mm_struct *mm = current->mm;
++              pgd_t *pgd; pmd_t *pmd; pte_t *pte;
++              spinlock_t *ptl;
++              unsigned long mem_value;
++
++              down_read(&mm->mmap_sem);
++              pgd = pgd_offset(mm, (unsigned long)mem);
++              if (!pgd_present(*pgd))
++                      goto bad_access;
++              pmd = pmd_offset(pgd, (unsigned long)mem);
++              if (!pmd_present(*pmd))
++                      goto bad_access;
++              pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);
++              if (!pte_present(*pte) || !pte_dirty(*pte)) {
++                      pte_unmap_unlock(pte, ptl);
++                      goto bad_access;
++              }
++
++              mem_value = *mem;
++              if (mem_value == oldval)
++                      *mem = newval;
++
++              pte_unmap_unlock(pte, ptl);
++              up_read(&mm->mmap_sem);
++              return mem_value;
++
++bad_access:
++              up_read(&mm->mmap_sem);
++              /* This is not necessarily a bad access, we can get here if
++                 a memory we're trying to write to should be copied-on-write.
++                 Make the kernel do the necessary page stuff, then re-iterate.
++                 Simulate a write access fault to do that.  */
++              {
++                      /* The first argument of the function corresponds to
++                         D1, which is the first field of struct pt_regs.  */
++                      struct pt_regs *fp = (struct pt_regs *)&newval;
++
++                      /* '3' is an RMW flag.  */
++                      if (do_page_fault(fp, (unsigned long)mem, 3))
++                              /* If the do_page_fault() failed, we don't
++                                 have anything meaningful to return.
++                                 There should be a SIGSEGV pending for
++                                 the process.  */
++                              return 0xdeadbeef;
++              }
++      }
++}
++
++asmlinkage int
++sys_atomic_barrier(void)
++{
++      /* no code needed for uniprocs */
++      return 0;
++}
+--- a/arch/m68k/kernel/time.c
++++ b/arch/m68k/kernel/time.c
+@@ -2,6 +2,9 @@
+  *  linux/arch/m68k/kernel/time.c
+  *
+  *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
++ *  Copyright Freescale Semiconductor, Inc. 2008-2009
++ *   Jason Jin Jason.Jin@freescale.com
++ *   Shrek Wu B16972@freescale.com
+  *
+  * This file contains the m68k-specific time handling details.
+  * Most of the stuff is located in the machine specific files.
+@@ -41,6 +44,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 "vmlinux-cf.lds"
+ #else
+ #include "vmlinux-std.lds"
+ #endif
+--- a/arch/m68k/lib/checksum.c
++++ b/arch/m68k/lib/checksum.c
+@@ -30,6 +30,10 @@
+  * 1998/8/31  Andreas Schwab:
+  *            Zero out rest of buffer on exception in
+  *            csum_partial_copy_from_user.
++ *
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *     Jason Jin Jason.Jin@freescale.com
++ *     Shrek Wu B16972@freescale.com
+  */
+ #include <linux/module.h>
+@@ -39,8 +43,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 +550,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
+@@ -1,6 +1,9 @@
+ /* muldi3.c extracted from gcc-2.7.2.3/libgcc2.c and
+                          gcc-2.7.2.3/longlong.h which is: */
+ /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
++   Copyright Freescale Semiconductor, Inc. 2008-2009
++       Jason Jin Jason.Jin@freescale.com
++       Shrek Wu B16972@freescale.com
+ This file is part of GNU CC.
+@@ -21,12 +24,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/string.c
++++ b/arch/m68k/lib/string.c
+@@ -1,4 +1,8 @@
+ /*
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *  * Jason Jin Jason.Jin@freescale.com
++ *    Shrek Wu B16972@freescale.com
++ *
+  * 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.
+@@ -21,6 +25,7 @@ char *strcat(char *dest, const char *src
+ }
+ EXPORT_SYMBOL(strcat);
++#ifndef CONFIG_COLDFIRE
+ void *memset(void *s, int c, size_t count)
+ {
+       void *xs = s;
+@@ -149,6 +154,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 = s;
++
++  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
+@@ -1,10 +1,15 @@
+ /*
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *    Jason Jin Jason.Jin@freescale.com
++ *    Shrek Wu B16972@freescale.com
++ *
+  * 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>
++#ifndef CONFIG_COLDFIRE
+ #include <asm/uaccess.h>
+ unsigned long __generic_copy_from_user(void *to, const void __user *from,
+@@ -220,3 +225,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
+@@ -1,6 +1,8 @@
+ #
+ # m68k/Makefile
+ #
++# Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
++#
+ # This file is included by the global makefile so that you can add your own
+ # architecture-specific flags and dependencies. Remember to do have actions
+ # for "archclean" and "archdep" for cleaning up and making dependencies for
+@@ -10,13 +12,13 @@
+ # License.  See the file "COPYING" in the main directory of this archive
+ # for more details.
+ #
+-# Copyright (C) 1994 by Hamish Macdonald
+-#
+-KBUILD_DEFCONFIG := multi_defconfig
++KBUILD_DEFCONFIG := amiga_defconfig#multi_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  := -O binary -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,17 @@ 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 +76,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/common/head.o
++endif
++else
+ head-y := arch/m68k/kernel/sun3-head.o
+ endif
+@@ -79,7 +102,20 @@ 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/
++
++ifdef CONFIG_COLDFIRE
++boot := arch/m68k/boot
++
++all:  uImage
++
++zImage zImage.srec uImage uImage.srec vmlinux.srec: vmlinux
++      $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
++archclean:
++      $(Q)$(MAKE) $(clean)=$(boot)
++
++else
+ all:  zImage
+ lilo: vmlinux
+@@ -117,6 +153,7 @@ endif
+ archclean:
+       rm -f vmlinux.gz vmlinux.bz2
++endif
+ install:
+       sh $(srctree)/arch/m68k/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)"
+--- a/arch/m68k/mm/cache.c
++++ b/arch/m68k/mm/cache.c
+@@ -4,13 +4,20 @@
+  *  Instruction cache handling
+  *
+  *  Copyright (C) 1995  Hamish Macdonald
++ *  Copyright Freescale Semiconductor, Inc. 2008-2009
++ *    Jason Jin Jason.Jin@freescale.com
++ *    Shrek Wu B16972@freescale.com
+  */
+ #include <linux/module.h>
+ #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 +76,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 +108,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 +131,5 @@ void flush_icache_user_range(struct vm_a
+                             : "di" (FLUSH_I));
+       }
+ }
++#endif /* CONFIG_COLDFIRE */
+--- a/arch/m68k/mm/hwtest.c
++++ b/arch/m68k/mm/hwtest.c
+@@ -12,6 +12,10 @@
+  * them here complete with the comments from the original atari
+  * config.c...
+  *                -- PMM <pmaydell@chiark.greenend.org.uk>, 05/1998
++ *
++ * Copyright Freescale Semiconductor, Inc. 2008-2009
++ *   Jason Jin Jason.Jin@freescale.com
++ *   Shrek Wu B16972@freescale.com
+  */
+ /* This function tests for the presence of an address, specially a
+@@ -25,6 +29,7 @@
+ #include <linux/module.h>
++#ifndef CONFIG_COLDFIRE
+ int hwreg_present( volatile void *regp )
+ {
+     int       ret = 0;
+@@ -82,4 +87,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
+@@ -2,6 +2,9 @@
+  *  linux/arch/m68k/mm/init.c
+  *
+  *  Copyright (C) 1995  Hamish Macdonald
++ *  Copyright Freescale Semiconductor, Inc. 2008-2009
++ *   Jason Jin Jason.Jin@freescale.com
++ *   Shrek Wu B16972@freescale.com
+  *
+  *  Contains common initialization routines, specific init code moved
+  *  to motorola.c and sun3mmu.c
+@@ -31,6 +34,10 @@
+ #include <asm/sections.h>
+ #include <asm/tlb.h>
++#ifdef CONFIG_VDSO
++int vdso_init(void);
++#endif
++
+ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
+ pg_data_t pg_data_map[MAX_NUMNODES];
+@@ -88,7 +95,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) {
+@@ -112,7 +118,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++) {
+@@ -131,6 +137,11 @@ void __init mem_init(void)
+              codepages << (PAGE_SHIFT-10),
+              datapages << (PAGE_SHIFT-10),
+              initpages << (PAGE_SHIFT-10));
++
++#ifdef CONFIG_VDSO
++      /* init the vdso page */
++      vdso_init();
++#endif
+ }
+ #ifdef CONFIG_BLK_DEV_INITRD
+--- a/arch/m68k/mm/kmap.c
++++ b/arch/m68k/mm/kmap.c
+@@ -2,6 +2,9 @@
+  *  linux/arch/m68k/mm/kmap.c
+  *
+  *  Copyright (C) 1997 Roman Hodek
++ *  Copyright Freescale Semiconductor, Inc. 2008, 2009
++ *      Jason Jin Jason.Jin@freescale.com
++ *      Shrek Wu B16972@freescale.com
+  *
+  *  10/01/99 cleaned up the code and changing to the same interface
+  *         used by other architectures                /Roman Zippel
+@@ -24,7 +27,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 +57,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;
+@@ -127,8 +138,41 @@ 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;
++      }
++      if ((physaddr >= KMAP_START) && (physaddr <= KMAP_END)) {
++              /* if physaddr belongs to virtual address range for ioremap,
++               * then return physaddr because it has been ioremapped
++               */
++              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(KERN_ERR "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(KERN_ERR "ioremap: paddr=0x%lx,size=0x%lx(%d) - ",
++                      physaddr, size, cacheflag);
+ #endif
+       /*
+        * Mappings have to be aligned
+@@ -147,7 +191,8 @@ 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(KERN_ERR " paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx",
++                      physaddr, virtaddr, retaddr);
+ #endif
+       /*
+@@ -172,7 +217,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:
+@@ -252,6 +302,13 @@ void __iounmap(void *addr, unsigned long
+       pmd_t *pmd_dir;
+       pte_t *pte_dir;
++#ifdef CONFIG_M547X_8X
++      if ((addr >= (void *)0xd0000000)
++              && (addr + size < (void *)0xd800ffff)) {
++              printk(KERN_ERR "%s: PCI address\n", __func__);
++              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,5 @@ 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
++obj-$(CONFIG_SRAM)            += cf-sram.o
+--- a/arch/m68k/mm/memory.c
++++ b/arch/m68k/mm/memory.c
+@@ -2,6 +2,10 @@
+  *  linux/arch/m68k/mm/memory.c
+  *
+  *  Copyright (C) 1995  Hamish Macdonald
++ *  Copyright Freescale Semiconductor, Inc. 2008-2009
++ *    Jason Jin Jason.Jin@freescale.com
++ *    Shrek Wu B16972@freescale.com
++ *
+  */
+ #include <linux/module.h>
+@@ -127,6 +131,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 +178,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 +209,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 +248,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 +262,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 +307,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/fs/namespace.c
++++ b/fs/namespace.c
+@@ -3,6 +3,10 @@
+  *
+  * (C) Copyright Al Viro 2000, 2001
+  *    Released under GPL v2.
++ * (c) Copyright Freescale Semiconductor, Inc. 2008, 2009
++ *      Change to align on page size for coldfire
++ *      Jason Jin Jason.Jin@freescale.com
++ *      Shrek Wu B16972@freescale.com
+  *
+  * Based on code from fs/super.c, copyright Linus Torvalds and others.
+  * Heavily rewritten.
+@@ -1858,7 +1862,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) {
+--- a/include/linux/fsl_devices.h
++++ b/include/linux/fsl_devices.h
+@@ -6,7 +6,7 @@
+  *
+  * Maintainer: Kumar Gala <galak@kernel.crashing.org>
+  *
+- * Copyright 2004 Freescale Semiconductor, Inc
++ * Copyright 2004-2008 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
+@@ -18,6 +18,7 @@
+ #define _FSL_DEVICE_H_
+ #include <linux/types.h>
++#include <linux/interrupt.h>
+ /*
+  * Some conventions on how we handle peripherals on Freescale chips
+@@ -58,11 +59,42 @@ enum fsl_usb2_phy_modes {
+       FSL_USB2_PHY_SERIAL,
+ };
++struct platform_device;
+ struct fsl_usb2_platform_data {
+       /* board specific information */
+       enum fsl_usb2_operating_modes   operating_mode;
+       enum fsl_usb2_phy_modes         phy_mode;
+       unsigned int                    port_enables;
++
++      char *name;             /* pretty print */
++      int (*platform_init) (struct platform_device *);
++      void (*platform_uninit) (struct fsl_usb2_platform_data *);
++      void __iomem *regs;     /* ioremap'd register base */
++      u32 xcvr_type;          /* PORTSC_PTS_* */
++      char *transceiver;      /* transceiver name */
++      unsigned power_budget;  /* for hcd->power_budget */
++      struct platform_device *pdev;
++      struct fsl_xcvr_ops *xcvr_ops;
++      int (*gpio_usb_active) (void);
++      void (*gpio_usb_inactive) (void);
++      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                        suspended : 1;
++      unsigned                        already_suspended : 1;
++
++      /* register save area for suspend/resume */
++      u32                             pm_command;
++      u32                             pm_status;
++      u32                             pm_intr_enable;
++      u32                             pm_frame_index;
++      u32                             pm_segment;
++      u32                             pm_frame_list;
++      u32                             pm_async_next;
++      u32                             pm_configured_flag;
++      u32                             pm_portsc;
+ };
+ /* Flags in fsl_usb2_mph_platform_data */
+@@ -92,4 +124,30 @@ struct mpc8xx_pcmcia_ops {
+  */
+ int fsl_deep_sleep(void);
++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);
++};
++
++struct coldfire_fec_platform_data {
++      int     hash_table;
++      unsigned int *fec_hw;
++      void    (*request_intrs)(struct net_device *dev,
++              irqreturn_t (*)(int, void *),
++              void *irq_privatedata);
++      void    (*set_mii)(struct net_device *dev);
++      void    (*get_mac)(struct net_device *dev);
++      void    (*enable_phy_intr)(void);
++      void    (*disable_phy_intr)(void);
++      void    (*phy_ack_intr)(void);
++      void    (*localhw_setup)(void);
++      void    (*uncache)(unsigned long addr);
++      void    (*platform_flush_cache)(void);
++};
+ #endif /* _FSL_DEVICE_H_ */