diff options
author | Imre Kaloz <kaloz@openwrt.org> | 2012-05-01 07:00:17 +0000 |
---|---|---|
committer | Imre Kaloz <kaloz@openwrt.org> | 2012-05-01 07:00:17 +0000 |
commit | 880de62f91bcffe7f1c7f16c9463e10853fa2524 (patch) | |
tree | 058bb1c73786a7bf492cc1a554effe4692a9b50e /target/linux/coldfire/patches-2.6.31 | |
parent | 7a8d12bafaf8b882d0278156e5f22d0a396687e2 (diff) | |
download | upstream-880de62f91bcffe7f1c7f16c9463e10853fa2524.tar.gz upstream-880de62f91bcffe7f1c7f16c9463e10853fa2524.tar.bz2 upstream-880de62f91bcffe7f1c7f16c9463e10853fa2524.zip |
switch to 2.6.38
SVN-Revision: 31546
Diffstat (limited to 'target/linux/coldfire/patches-2.6.31')
6 files changed, 0 insertions, 4184 deletions
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 deleted file mode 100644 index 269d13c05e..0000000000 --- a/target/linux/coldfire/patches-2.6.31/001-coldfire_support.patch +++ /dev/null @@ -1,4000 +0,0 @@ ---- 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_ */ diff --git a/target/linux/coldfire/patches-2.6.31/005-Add-common-serial-driver-and-add-IRDA-for-m5.patch b/target/linux/coldfire/patches-2.6.31/005-Add-common-serial-driver-and-add-IRDA-for-m5.patch deleted file mode 100644 index 2562b9a350..0000000000 --- a/target/linux/coldfire/patches-2.6.31/005-Add-common-serial-driver-and-add-IRDA-for-m5.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 9eaa978feb942497c4542cc82e63d5468dc8f184 Mon Sep 17 00:00:00 2001 -From: Wang Huan <wanghuan@zch06.freescale.net> -Date: Thu, 25 Feb 2010 15:27:21 +0800 -Subject: [PATCH 05/23] Add common serial driver and add IRDA support for m547x_8x - -Add common serial driver for mcf5445x board and mcf547x, mcf548x boards. -Also add IRDA support for mcf547x, mcf548x boards. - -Signed-off-by: Shrek Wu <b16972@freescale.com> -Signed-off-by: Jason Jin <jason.jin@freescale.com> -Signed-off-by: Chengju-Cai <b22600@freescale.com> ---- - arch/m68k/include/asm/mcfuart.h | 35 +++++++++++++--- - drivers/serial/Kconfig | 13 ++++++ - drivers/serial/mcf.c | 88 +++++++++++++++++++++++++++++++++++++++ - 3 files changed, 130 insertions(+), 6 deletions(-) - ---- a/arch/m68k/include/asm/mcfuart.h -+++ b/arch/m68k/include/asm/mcfuart.h -@@ -47,18 +48,35 @@ - #define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ - #define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ - #define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ -+#elif defined(CONFIG_M5445X) -+#include <asm/mcf5445x_intc.h> -+#define MCFUART_BASE1 0xfc060000 /* Base address of UART1 */ -+#define MCFUART_BASE2 0xfc064000 /* Base address of UART2 */ -+#define MCFUART_BASE3 0xfc068000 /* Base address of UART3 */ -+#define MCFINT_VECBASE 64 -+#define MCFINT_UART0 26 -+#elif defined(CONFIG_M547X_8X) -+#define MCFUART_BASE1 0x8600 /* Base address of UART1 */ -+#define MCFUART_BASE2 0x8700 /* Base address of UART2 */ -+#define MCFUART_BASE3 0x8800 /* Base address of UART3 */ -+#define MCFUART_BASE4 0x8900 /* Base address of UART4 */ -+#define MCFINT_VECBASE 64 -+#define MCFINT_UART0 35 -+#define MCFINT_UART1 34 -+#define MCFINT_UART2 33 -+#define MCFINT_UART3 32 - #endif - -- -+#ifndef __ASSEMBLY__ - #include <linux/serial_core.h> - #include <linux/platform_device.h> -- - struct mcf_platform_uart { -- unsigned long mapbase; /* Physical address base */ -- void __iomem *membase; /* Virtual address if mapped */ -- unsigned int irq; /* Interrupt vector */ -- unsigned int uartclk; /* UART clock rate */ -+ unsigned long mapbase; /* Physical address base */ -+ void __iomem *membase; /* Virtual address if mapped */ -+ unsigned int irq; /* Interrupt vector */ -+ unsigned int uartclk; /* UART clock rate */ - }; -+#endif - - /* - * Define the ColdFire UART register set addresses. diff --git a/target/linux/coldfire/patches-2.6.31/006-mcf548x_ethernet.patch b/target/linux/coldfire/patches-2.6.31/006-mcf548x_ethernet.patch deleted file mode 100644 index 22fb901b28..0000000000 --- a/target/linux/coldfire/patches-2.6.31/006-mcf548x_ethernet.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- a/drivers/net/Kconfig -+++ b/drivers/net/Kconfig -@@ -2010,6 +2010,29 @@ config FEC2 - Say Y here if you want to use the second built-in 10/100 Fast - ethernet controller on some Motorola ColdFire processors. - -+config FEC_548x -+ tristate "MCF547x/MCF548x Fast Ethernet Controller support" -+ depends on M547X_8X -+ select PHYLIB -+ help -+ The MCF547x and MCF548x have a built-in Fast Ethernet Controller. -+ Saying Y here will include support for this device in the kernel. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called fecm. -+ -+config FEC_548x_ENABLE_FEC2 -+ bool "Enable the second FEC" -+ depends on FEC_548x -+ help -+ This enables the second FEC on the 547x/548x. -+ -+config FEC_548x_SHARED_PHY -+ bool "Shared PHY interface(on some ColdFire designs)" -+ depends on FEC_548x_ENABLE_FEC2 -+ help -+ Say Y here if both PHYs are controlled via a single channel.+ -+ - config FEC_MPC52xx - tristate "MPC52xx FEC driver" - depends on PPC_MPC52xx && PPC_BESTCOMM ---- a/drivers/net/Makefile -+++ b/drivers/net/Makefile -@@ -114,6 +114,7 @@ obj-$(CONFIG_PCMCIA_PCNET) += 8390.o - obj-$(CONFIG_HP100) += hp100.o - obj-$(CONFIG_SMC9194) += smc9194.o - obj-$(CONFIG_FEC) += fec.o -+obj-$(CONFIG_FEC_548x) += fec_m547x.o - obj-$(CONFIG_FEC_MPC52xx) += fec_mpc52xx.o - ifeq ($(CONFIG_FEC_MPC52xx_MDIO),y) - obj-$(CONFIG_FEC_MPC52xx) += fec_mpc52xx_phy.o diff --git a/target/linux/coldfire/patches-2.6.31/007-bcm5222_phy.patch b/target/linux/coldfire/patches-2.6.31/007-bcm5222_phy.patch deleted file mode 100644 index 554fa6833d..0000000000 --- a/target/linux/coldfire/patches-2.6.31/007-bcm5222_phy.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/drivers/net/phy/Kconfig -+++ b/drivers/net/phy/Kconfig -@@ -62,6 +62,11 @@ config BROADCOM_PHY - Currently supports the BCM5411, BCM5421, BCM5461, BCM5464, BCM5481 - and BCM5482 PHYs. - -+config BROADCOM5222_PHY -+ tristate "Drivers for Broadcom5222 PHY" -+ ---help--- -+ Currently supports the BCM5222 PHYs. -+ - config ICPLUS_PHY - tristate "Drivers for ICPlus PHYs" - ---help--- ---- a/drivers/net/phy/Makefile -+++ b/drivers/net/phy/Makefile -@@ -12,6 +12,7 @@ obj-$(CONFIG_QSEMI_PHY) += qsemi.o - obj-$(CONFIG_SMSC_PHY) += smsc.o - obj-$(CONFIG_VITESSE_PHY) += vitesse.o - obj-$(CONFIG_BROADCOM_PHY) += broadcom.o -+obj-$(CONFIG_BROADCOM5222_PHY) += broadcom522x.o - obj-$(CONFIG_ICPLUS_PHY) += icplus.o - obj-$(CONFIG_ADM6996_PHY) += adm6996.o - obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o diff --git a/target/linux/coldfire/patches-2.6.31/019-Add-CFV4E-FPU-support-for-MCF547X_8X.patch b/target/linux/coldfire/patches-2.6.31/019-Add-CFV4E-FPU-support-for-MCF547X_8X.patch deleted file mode 100644 index 0d17aac59d..0000000000 --- a/target/linux/coldfire/patches-2.6.31/019-Add-CFV4E-FPU-support-for-MCF547X_8X.patch +++ /dev/null @@ -1,23 +0,0 @@ -From a324800cc0ac1a0bd2a596751d276f5daa9d17d2 Mon Sep 17 00:00:00 2001 -From: Wang Huan <wanghuan@zch06.freescale.net> -Date: Thu, 4 Feb 2010 16:42:07 +0800 -Subject: [PATCH 20/25] Add CFV4E FPU support for MCF547X_8X - -Porting the fpu support from ltib-mcf547x_8x-20070107 (2.6.10) - -Signed-off-by: Lanttor Guo <lanttor.guo@freescale.com> ---- - arch/m68k/include/asm/fpu.h | 2 ++ - 1 files changed, 2 insertions(+), 0 deletions(-) - ---- a/arch/m68k/include/asm/fpu.h -+++ b/arch/m68k/include/asm/fpu.h -@@ -14,6 +14,8 @@ - #define FPSTATESIZE (28) - #elif defined(CONFIG_M68060) - #define FPSTATESIZE (12) -+#elif defined(CONFIG_CFV4E) -+#define FPSTATESIZE (16) - #else - #define FPSTATESIZE (0) - #endif diff --git a/target/linux/coldfire/patches-2.6.31/074-Kconfig_lite_boards.patch b/target/linux/coldfire/patches-2.6.31/074-Kconfig_lite_boards.patch deleted file mode 100644 index 0015a34c12..0000000000 --- a/target/linux/coldfire/patches-2.6.31/074-Kconfig_lite_boards.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- a/arch/m68k/Kconfig -+++ b/arch/m68k/Kconfig -@@ -381,6 +381,9 @@ choice - depends on M547X_8X - default M5485CFE - -+config M5474LITE -+ bool "MCF5474LITE" -+ select M547X - config M5475AFE - bool "MCF5475AFE" - select M547X -@@ -399,6 +402,9 @@ config M5475EFE - config M5475FFE - bool "MCF5475FFE" - select M547X -+config M5484LITE -+ bool "MCF5484LITE" -+ select M548X - config M5485AFE - bool "MCF5485AFE" - select M548X -@@ -465,7 +471,10 @@ config NOR_FLASH_BASE - depends on COLDFIRE - default 0x00000000 if M54451EVB - default 0x00000000 if M54455EVB -- default 0xE0000000 if M547X_8X -+ default 0xE0000000 if M5475CFE -+ default 0xE0000000 if M5485CFE -+ default 0xFF800000 if M5484LITE -+ default 0xFF800000 if M5474LITE - - config DMA_BASE - hex |