2.6.31 support (WiP)
[oweals/openwrt.git] / target / linux / coldfire / patches-2.6.31 / 001-coldfire_support.patch
1 --- a/arch/m68k/include/asm/atomic_mm.h
2 +++ b/arch/m68k/include/asm/atomic_mm.h
3 @@ -20,12 +20,20 @@
4  
5  static inline void atomic_add(int i, atomic_t *v)
6  {
7 +#ifndef CONFIG_COLDFIRE
8         __asm__ __volatile__("addl %1,%0" : "+m" (*v) : "id" (i));
9 +#else
10 +       __asm__ __volatile__("addl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
11 +#endif
12  }
13  
14  static inline void atomic_sub(int i, atomic_t *v)
15  {
16 +#ifndef CONFIG_COLDFIRE
17         __asm__ __volatile__("subl %1,%0" : "+m" (*v) : "id" (i));
18 +#else
19 +       __asm__ __volatile__("subl %1,%0" : "=m" (*v) : "d" (i), "m" (*v));
20 +#endif
21  }
22  
23  static inline void atomic_inc(atomic_t *v)
24 @@ -45,6 +53,14 @@ static inline int atomic_dec_and_test(at
25         return c != 0;
26  }
27  
28 +static __inline__ int atomic_dec_and_test_lt(volatile atomic_t *v)
29 +{
30 +       char c;
31 +       __asm__ __volatile__("subql #1,%1; slt %0" : "=d" (c), "=m" (*v)
32 +                            : "m" (*v));
33 +       return c != 0 ;
34 +}
35 +
36  static inline int atomic_inc_and_test(atomic_t *v)
37  {
38         char c;
39 @@ -155,7 +171,12 @@ static inline int atomic_sub_and_test(in
40  static inline int atomic_add_negative(int i, atomic_t *v)
41  {
42         char c;
43 +#ifndef CONFIG_COLDFIRE
44         __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "+m" (*v): "g" (i));
45 +#else
46 +        __asm__ __volatile__("addl %2,%1; smi %0" : "=d" (c), "=m" (*v)
47 +                             : "d" (i) , "m" (*v));
48 +#endif
49         return c != 0;
50  }
51  
52 --- a/arch/m68k/include/asm/bitops_mm.h
53 +++ b/arch/m68k/include/asm/bitops_mm.h
54 @@ -8,6 +8,10 @@
55   * for more details.
56   */
57  
58 +#ifdef CONFIG_COLDFIRE
59 +#include <asm/cf_bitops.h>
60 +#else
61 +
62  #ifndef _LINUX_BITOPS_H
63  #error only <linux/bitops.h> can be included directly
64  #endif
65 @@ -461,4 +465,6 @@ static inline int ext2_find_next_bit(con
66  
67  #endif /* __KERNEL__ */
68  
69 +#endif /* CONFIG_COLDFIRE */
70 +
71  #endif /* _M68K_BITOPS_H */
72 --- a/arch/m68k/include/asm/bootinfo.h
73 +++ b/arch/m68k/include/asm/bootinfo.h
74 @@ -25,6 +25,51 @@
75  #define _M68K_BOOTINFO_H
76  
77  
78 +#ifndef __ASSEMBLY__
79 +/*
80 + * UBoot Support
81 + *
82 + * bd_info structure from uboot1.3.2/arch/m68k/include/asm/u-boot.h
83 + */
84 +
85 +struct bd_info {
86 +       unsigned long bi_memstart;      /* start of DRAM memory */
87 +       unsigned long bi_memsize;       /* size  of DRAM memory in bytes */
88 +       unsigned long bi_flashstart;    /* start of FLASH memory */
89 +       unsigned long bi_flashsize;     /* size  of FLASH memory */
90 +       unsigned long bi_flashoffset;   /* reserved area for startup monitor */
91 +       unsigned long bi_sramstart;     /* start of SRAM memory */
92 +       unsigned long bi_sramsize;      /* size  of SRAM memory */
93 +       unsigned long bi_mbar_base;     /* base of internal registers */
94 +       unsigned long bi_bootflags;     /* boot / reboot flag (for LynxOS) */
95 +       unsigned long bi_boot_params;   /* where this board expects params */
96 +       unsigned long bi_ip_addr;       /* IP Address */
97 +       unsigned char bi_enet0addr[6];  /* Ethernet 0 mac address */
98 +       unsigned short bi_ethspeed;     /* Ethernet speed in Mbps */
99 +       unsigned long bi_intfreq;       /* Internal Freq, in MHz */
100 +       unsigned long bi_busfreq;       /* Bus Freq, in MHz */
101 +#ifdef UBOOT_EXTRA_CLOCK
102 +       unsigned long bi_inpfreq;       /* input Freq in MHz */
103 +       unsigned long bi_vcofreq;       /* vco Freq in MHz */
104 +       unsigned long bi_flbfreq;       /* Flexbus Freq in MHz */
105 +#endif
106 +       unsigned long bi_baudrate;      /* Console Baudrate */
107 +       unsigned char bi_enet1addr[6];  /* eth1 mac address */
108 +       unsigned char bi_enet2addr[6];  /* eth2 mac address */
109 +       unsigned char bi_enet3addr[6];  /* eth3 mac address */
110 +};
111 +
112 +struct uboot_record {
113 +       struct bd_info *bdi;
114 +       unsigned long initrd_start;
115 +       unsigned long initrd_end;
116 +       unsigned long cmd_line_start;
117 +       unsigned long cmd_line_stop;
118 +};
119 +
120 +#endif /* __ASSEMBLY__ */
121 +
122 +
123      /*
124       *  Bootinfo definitions
125       *
126 --- a/arch/m68k/include/asm/cacheflush_mm.h
127 +++ b/arch/m68k/include/asm/cacheflush_mm.h
128 @@ -6,6 +6,9 @@
129  /* cache code */
130  #define FLUSH_I_AND_D  (0x00000808)
131  #define FLUSH_I                (0x00000008)
132 +#ifdef CONFIG_COLDFIRE
133 +#include <asm/cf_cacheflush.h>
134 +#else /* !CONFIG_COLDFIRE */
135  
136  /*
137   * Cache handling functions
138 @@ -153,4 +156,5 @@ static inline void copy_from_user_page(s
139         memcpy(dst, src, len);
140  }
141  
142 +#endif /* !CONFIG_COLDFIRE */
143  #endif /* _M68K_CACHEFLUSH_H */
144 --- a/arch/m68k/include/asm/checksum_mm.h
145 +++ b/arch/m68k/include/asm/checksum_mm.h
146 @@ -34,6 +34,7 @@ extern __wsum csum_partial_copy_nocheck(
147                                               void *dst, int len,
148                                               __wsum sum);
149  
150 +#ifndef CONFIG_COLDFIRE  /* CF has own copy in arch/m68k/lib/checksum.c */
151  /*
152   *     This is a version of ip_compute_csum() optimized for IP headers,
153   *     which always checksum on 4 octet boundaries.
154 @@ -59,6 +60,9 @@ static inline __sum16 ip_fast_csum(const
155                  : "memory");
156         return (__force __sum16)~sum;
157  }
158 +#else
159 +extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
160 +#endif
161  
162  /*
163   *     Fold a partial checksum
164 @@ -67,6 +71,11 @@ static inline __sum16 ip_fast_csum(const
165  static inline __sum16 csum_fold(__wsum sum)
166  {
167         unsigned int tmp = (__force u32)sum;
168 +#ifdef CONFIG_COLDFIRE
169 +       tmp = (tmp & 0xffff) + (tmp >> 16);
170 +       tmp = (tmp & 0xffff) + (tmp >> 16);
171 +       return (__force __sum16) ~tmp;
172 +#else
173         __asm__("swap %1\n\t"
174                 "addw %1, %0\n\t"
175                 "clrw %1\n\t"
176 @@ -74,6 +83,7 @@ static inline __sum16 csum_fold(__wsum s
177                 : "=&d" (sum), "=&d" (tmp)
178                 : "0" (sum), "1" (tmp));
179         return (__force __sum16)~sum;
180 +#endif
181  }
182  
183  
184 --- a/arch/m68k/include/asm/coldfire.h
185 +++ b/arch/m68k/include/asm/coldfire.h
186 @@ -5,6 +5,9 @@
187   *
188   *     (C) Copyright 1999-2006, Greg Ungerer (gerg@snapgear.com)
189   *     (C) Copyright 2000, Lineo (www.lineo.com)
190 + *
191 + *     Shrek Wu b16972@freescale.com
192 + *     Copyright Freescale Semiconductor, Inc. 2009
193   */
194  
195  /****************************************************************************/
196 @@ -19,25 +22,78 @@
197   *     here. Also the peripheral clock (bus clock) divide ratio is set
198   *     at config time too.
199   */
200 +/*FIXME Jason*/
201 +#if 0
202  #ifdef CONFIG_CLOCK_SET
203  #define        MCF_CLK         CONFIG_CLOCK_FREQ
204  #define        MCF_BUSCLK      (CONFIG_CLOCK_FREQ / CONFIG_CLOCK_DIV)
205  #else
206  #error "Don't know what your ColdFire CPU clock frequency is??"
207  #endif
208 +#endif 
209 +
210 +
211 +#define MCF_CLK        CONFIG_MCFCLK
212 +#define MCF_BUSCLK     (CONFIG_MCFCLK/2)
213 +
214 +
215 +#if defined(CONFIG_M520x)
216 +#define        MCF_IPSBAR      0xFC000000
217 +#else
218 +#define        MCF_IPSBAR      0x40000000
219 +#endif
220  
221 +#if defined(CONFIG_M5445X)
222 +#define MCF_MBAR       0x0
223 +/*
224 + * Even though RAMBAR1 macro should be in the 0x8xxxxxxx range,
225 + * here set the CONFIG_SDRAM_BASE value to it to use
226 + * SDRAM memory, not SRAM memory.
227 + */
228 +#define MCF_RAMBAR1    (CONFIG_SDRAM_BASE)
229 +#elif defined(CONFIG_M547X_8X)
230 +#define MCF_MBAR        0xF0000000
231 +#define MCF_MMUBAR      0xF1000000
232 +#define MCF_RAMBAR0     0xF3000000
233 +#define MCF_RAMBAR1     0xF3001000
234 +#else
235  /*
236   *     Define the processor support peripherals base address.
237   *     This is generally setup by the boards start up code.
238   */
239  #define        MCF_MBAR        0x10000000
240  #define        MCF_MBAR2       0x80000000
241 -#if defined(CONFIG_M520x)
242 -#define        MCF_IPSBAR      0xFC000000
243 -#else
244 -#define        MCF_IPSBAR      0x40000000
245  #endif
246  
247 +#ifdef __ASSEMBLY__
248 +#define REG32
249 +#define REG16
250 +#define REG08
251 +#else  /* __ASSEMBLY__ */
252 +#define REG32(x) ((volatile unsigned long  *)(x))
253 +#define REG16(x) ((volatile unsigned short *)(x))
254 +#define REG08(x) ((volatile unsigned char  *)(x))
255 +
256 +#define MCF_REG32(x) *(volatile unsigned long  *)(MCF_MBAR+(x))
257 +#define MCF_REG16(x) *(volatile unsigned short *)(MCF_MBAR+(x))
258 +#define MCF_REG08(x) *(volatile unsigned char  *)(MCF_MBAR+(x))
259 +
260 +void cacr_set(unsigned long);
261 +unsigned long cacr_get(void);
262 +
263 +#define coldfire_enable_irq0(irq)      MCF_INTC0_CIMR = (irq);
264 +
265 +#define coldfire_enable_irq1(irq)      MCF_INTC1_CIMR = (irq);
266 +
267 +#define coldfire_disable_irq0(irq)     MCF_INTC0_SIMR = (irq);
268 +
269 +#define coldfire_disable_irq1(irq)     MCF_INTC1_SIMR = (irq);
270 +
271 +#define getiprh()                      MCF_INTC0_IPRH
272 +
273 +#endif /* __ASSEMBLY__ */
274 +
275 +
276  #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \
277      defined(CONFIG_M520x)
278  #undef MCF_MBAR
279 --- a/arch/m68k/include/asm/delay_mm.h
280 +++ b/arch/m68k/include/asm/delay_mm.h
281 @@ -11,8 +11,25 @@
282  
283  static inline void __delay(unsigned long loops)
284  {
285 +#if defined(CONFIG_COLDFIRE)
286 +       /* The coldfire runs this loop at significantly different speeds
287 +        * depending upon long word alignment or not.  We'll pad it to
288 +        * long word alignment which is the faster version.
289 +        * The 0x4a8e is of course a 'tstl %fp' instruction.  This is better
290 +        * than using a NOP (0x4e71) instruction because it executes in one
291 +        * cycle not three and doesn't allow for an arbitary delay waiting
292 +        * for bus cycles to finish.  Also fp/a6 isn't likely to cause a
293 +        * stall waiting for the register to become valid if such is added
294 +        * to the coldfire at some stage.
295 +        */
296 +       __asm__ __volatile__ (".balignw 4, 0x4a8e\n\t"
297 +                             "1: subql #1, %0\n\t"
298 +                             "jcc 1b"
299 +                             : "=d" (loops) : "0" (loops));
300 +#else
301         __asm__ __volatile__ ("1: subql #1,%0; jcc 1b"
302                 : "=d" (loops) : "0" (loops));
303 +#endif
304  }
305  
306  extern void __bad_udelay(void);
307 @@ -26,12 +43,17 @@ extern void __bad_udelay(void);
308   */
309  static inline void __const_udelay(unsigned long xloops)
310  {
311 +#if defined(CONFIG_COLDFIRE)
312 +
313 +       __delay(((((unsigned long long) xloops * loops_per_jiffy))>>32)*HZ);
314 +#else
315         unsigned long tmp;
316  
317         __asm__ ("mulul %2,%0:%1"
318                 : "=d" (xloops), "=d" (tmp)
319                 : "d" (xloops), "1" (loops_per_jiffy));
320         __delay(xloops * HZ);
321 +#endif
322  }
323  
324  static inline void __udelay(unsigned long usecs)
325 @@ -46,12 +68,16 @@ static inline void __udelay(unsigned lon
326  static inline unsigned long muldiv(unsigned long a, unsigned long b,
327                                    unsigned long c)
328  {
329 +#if defined(CONFIG_COLDFIRE)
330 +       return (long)(((unsigned long long)a * b)/c);
331 +#else
332         unsigned long tmp;
333  
334         __asm__ ("mulul %2,%0:%1; divul %3,%0:%1"
335                 : "=d" (tmp), "=d" (a)
336                 : "d" (b), "d" (c), "1" (a));
337         return a;
338 +#endif
339  }
340  
341  #endif /* defined(_M68K_DELAY_H) */
342 --- a/arch/m68k/include/asm/div64.h
343 +++ b/arch/m68k/include/asm/div64.h
344 @@ -1,7 +1,7 @@
345  #ifndef _M68K_DIV64_H
346  #define _M68K_DIV64_H
347  
348 -#ifdef CONFIG_MMU
349 +#if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE)
350  
351  #include <linux/types.h>
352  
353 --- a/arch/m68k/include/asm/dma_mm.h
354 +++ b/arch/m68k/include/asm/dma_mm.h
355 @@ -4,13 +4,126 @@
356  
357  /* it's useless on the m68k, but unfortunately needed by the new
358     bootmem allocator (but this should do it for this) */
359 +/*#ifdef CONFIG_COLDFIRE*/
360 +#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
361 +#define MAX_DMA_ADDRESS 0xefffffff
362 +#else
363  #define MAX_DMA_ADDRESS PAGE_OFFSET
364 +#endif
365  
366 +#ifndef CONFIG_COLDFIRE
367  #define MAX_DMA_CHANNELS 8
368  
369  extern int request_dma(unsigned int dmanr, const char * device_id);    /* reserve a DMA channel */
370  extern void free_dma(unsigned int dmanr);      /* release it again */
371  
372 +#else /* not (defined(CONFIG_MCF5474) || defined(CONFIG_MCF5484)
373 +        || defined(CONFIG_MCF5475) || defined(CONFIG_MCF5485)) */
374 +/************************************************
375 + *      Multichannel DMA definitions            *
376 + ************************************************/
377 +#ifdef CONFIG_MCD_DMA
378 +#include <asm/MCD_dma.h>
379 +#include <asm/m5485dma.h>
380 +
381 +struct scatterlist;
382 +
383 +#define MAX_DMA_CHANNELS NCHANNELS
384 +/*
385 + *  identifiers for each initiator/requestor
386 + */
387 +#define DMA_ALWAYS      (0)
388 +#define DMA_DSPI_RX     (1)
389 +#define DMA_DSPI_TX     (2)
390 +#define DMA_DREQ0       (3)
391 +#define DMA_PSC0_RX     (4)
392 +#define DMA_PSC0_TX     (5)
393 +#define DMA_USBEP0      (6)
394 +#define DMA_USBEP1      (7)
395 +#define DMA_USBEP2      (8)
396 +#define DMA_USBEP3      (9)
397 +#define DMA_PCI_TX      (10)
398 +#define DMA_PCI_RX      (11)
399 +#define DMA_PSC1_RX     (12)
400 +#define DMA_PSC1_TX     (13)
401 +#define DMA_I2C_RX      (14)
402 +#define DMA_I2C_TX      (15)
403 +#define DMA_FEC0_RX     (16)
404 +#define DMA_FEC0_TX     (17)
405 +#define DMA_FEC1_RX     (18)
406 +#define DMA_FEC1_TX     (19)
407 +#define DMA_DREQ1       (20)
408 +#define DMA_CTM0        (21)
409 +#define DMA_CTM1        (22)
410 +#define DMA_CTM2        (23)
411 +#define DMA_CTM3        (24)
412 +#define DMA_CTM4        (25)
413 +#define DMA_CTM5        (26)
414 +#define DMA_CTM6        (27)
415 +#define DMA_CTM7        (28)
416 +#define DMA_USBEP4      (29)
417 +#define DMA_USBEP5      (30)
418 +#define DMA_USBEP6      (31)
419 +#define DMA_PSC2_RX     (32)
420 +#define DMA_PSC2_TX     (33)
421 +#define DMA_PSC3_RX     (34)
422 +#define DMA_PSC3_TX     (35)
423 +#define DMA_FEC_RX(x)   ((x == 0) ? DMA_FEC0_RX : DMA_FEC1_RX)
424 +#define DMA_FEC_TX(x)   ((x == 0) ? DMA_FEC0_TX : DMA_FEC1_TX)
425 +
426 +int  dma_set_initiator(int);
427 +unsigned int dma_get_initiator(int);
428 +void dma_remove_initiator(int);
429 +int dma_set_channel(int);
430 +int dma_get_channel(int);
431 +void dma_remove_channel(int);
432 +int dma_set_channel_fec(int requestor);
433 +int dma_connect(int channel, int address);
434 +int dma_disconnect(int channel);
435 +void dma_remove_channel_by_number(int channel);
436 +int dma_init(void);
437 +#endif /* CONFIG_MCD_DMA */
438 +
439 +extern spinlock_t dma_spin_lock;
440 +
441 +static __inline__ unsigned long claim_dma_lock(void)
442 +{
443 +       unsigned long flags;
444 +       spin_lock_irqsave(&dma_spin_lock, flags);
445 +       return flags;
446 +}
447 +
448 +static __inline__ void release_dma_lock(unsigned long flags)
449 +{
450 +       spin_unlock_irqrestore(&dma_spin_lock, flags);
451 +}
452 +
453 +
454 +/*
455 + *  Linux standard DMA stuff
456 + */
457 +#if 0
458 +int  request_dma(unsigned int channel, const char * device_id);
459 +void free_dma(unsigned int channel);
460 +void enable_dma(unsigned int channel);
461 +void disable_dma(unsigned int channel);
462 +int  dma_channel_active(unsigned int channel);
463 +void set_dma_sg(unsigned int channel, struct scatterlist *sg, int nr_sg);
464 +void set_dma_page(unsigned int channel, char pagenr);
465 +void set_dma_addr(unsigned int channel, unsigned long physaddr);
466 +void set_dma_count(unsigned int channel, unsigned long count);
467 +void set_dma_mode(unsigned int channel, unsigned int mode);
468 +void set_dma_speed(unsigned int channel, int cycle_ns);
469 +int  get_dma_residue(unsigned int channel);
470 +#endif
471 +#define clear_dma_ff(channel)
472 +
473 +#endif
474 +
475 +#ifdef CONFIG_PCI
476 +extern int isa_dma_bridge_buggy;
477 +#else
478  #define isa_dma_bridge_buggy    (0)
479 +#endif
480  
481  #endif /* _M68K_DMA_H */
482 --- a/arch/m68k/include/asm/elf.h
483 +++ b/arch/m68k/include/asm/elf.h
484 @@ -35,6 +35,27 @@
485  #define R_68K_JMP_SLOT 21
486  #define R_68K_RELATIVE 22
487  
488 +/* TLS static relocations */
489 +#define R_68K_TLS_GD32 25
490 +#define R_68K_TLS_GD16 26
491 +#define R_68K_TLS_GD8  27
492 +#define R_68K_TLS_LDM32        28
493 +#define R_68K_TLS_LDM16        29
494 +#define R_68K_TLS_LDM8 30
495 +#define R_68K_TLS_LDO32        31
496 +#define R_68K_TLS_LDO16        32
497 +#define R_68K_TLS_LDO8 33
498 +#define R_68K_TLS_IE32 34
499 +#define R_68K_TLS_IE16 35
500 +#define R_68K_TLS_IE8  36
501 +#define R_68K_TLS_LE32 37
502 +#define R_68K_TLS_LE16 38
503 +#define R_68K_TLS_LE8  39
504 +/* TLS dynamic relocations */
505 +#define R_68K_TLS_DTPMOD32     40
506 +#define R_68K_TLS_DTPREL32     41
507 +#define R_68K_TLS_TPREL32      42
508 +
509  typedef unsigned long elf_greg_t;
510  
511  #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
512 @@ -60,7 +81,7 @@ typedef struct user_m68kfp_struct elf_fp
513  #define ELF_PLAT_INIT(_r, load_addr)   _r->a1 = 0
514  
515  #define USE_ELF_CORE_DUMP
516 -#ifndef CONFIG_SUN3
517 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
518  #define ELF_EXEC_PAGESIZE      4096
519  #else
520  #define ELF_EXEC_PAGESIZE      8192
521 @@ -71,8 +92,10 @@ typedef struct user_m68kfp_struct elf_fp
522     the loader.  We need to make sure that it is out of the way of the program
523     that it will "exec", and that there is sufficient room for the brk.  */
524  
525 -#ifndef CONFIG_SUN3
526 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
527  #define ELF_ET_DYN_BASE         0xD0000000UL
528 +#elif defined(CONFIG_COLDFIRE)
529 +#define ELF_ET_DYN_BASE                (TASK_UNMAPPED_BASE + 0x10000000)
530  #else
531  #define ELF_ET_DYN_BASE         0x0D800000UL
532  #endif
533 @@ -116,4 +139,35 @@ typedef struct user_m68kfp_struct elf_fp
534  
535  #define SET_PERSONALITY(ex) set_personality(PER_LINUX)
536  
537 +/*
538 + * VDSO
539 + */
540 +#ifdef CONFIG_VDSO
541 +extern unsigned int vdso_enabled;
542 +
543 +#define VDSO_BASE      ((unsigned long)current->mm->context.vdso)
544 +#define VDSO_SYM(x)    (VDSO_BASE + (unsigned long)(x))
545 +
546 +#define VDSO_AUX_ENT                                           \
547 +       if (vdso_enabled)                                       \
548 +               NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE);
549 +
550 +/* additional pages */
551 +#define ARCH_HAS_SETUP_ADDITIONAL_PAGES                1
552 +
553 +struct linux_binprm;
554 +extern int arch_setup_additional_pages(struct linux_binprm *bprm,
555 +                                       int executable_stack);
556 +
557 +#else
558 +/* no VDSO_AUX_ENT */
559 +#define VDSO_AUX_ENT
560 +#endif
561 +
562 +#define ARCH_DLINFO                                            \
563 +do {                                                           \
564 +       /* vdso entry */                                        \
565 +       VDSO_AUX_ENT;                                           \
566 +} while (0);
567 +
568  #endif
569 --- a/arch/m68k/include/asm/io_mm.h
570 +++ b/arch/m68k/include/asm/io_mm.h
571 @@ -7,17 +7,24 @@
572   *            - added skeleton for GG-II and Amiga PCMCIA
573   * 2/3/01 RZ: - moved a few more defs into raw_io.h
574   *
575 - * inX/outX should not be used by any driver unless it does
576 - * ISA access. Other drivers should use function defined in raw_io.h
577 + * inX/outX/readX/writeX should not be used by any driver unless it does
578 + * ISA or PCI access. Other drivers should use function defined in raw_io.h
579   * or define its own macros on top of these.
580   *
581 - *    inX(),outX()              are for ISA I/O
582 + *    inX(),outX()              are for PCI and ISA I/O
583 + *    readX(),writeX()          are for PCI memory
584   *    isa_readX(),isa_writeX()  are for ISA memory
585 + *
586 + * moved mem{cpy,set}_*io inside CONFIG_PCI
587   */
588  
589  #ifndef _IO_H
590  #define _IO_H
591  
592 +#ifdef CONFIG_COLDFIRE
593 +#include <asm/cf_io.h>
594 +#else
595 +
596  #ifdef __KERNEL__
597  
598  #include <linux/compiler.h>
599 @@ -88,20 +95,20 @@ extern unsigned long gg2_isa_base;
600  #undef MULTI_ISA
601  #endif
602  
603 -#define ISA_TYPE_Q40 (1)
604 -#define ISA_TYPE_GG2 (2)
605 -#define ISA_TYPE_AG  (3)
606 +#define Q40_ISA (1)
607 +#define GG2_ISA (2)
608 +#define AG_ISA  (3)
609  
610  #if defined(CONFIG_Q40) && !defined(MULTI_ISA)
611 -#define ISA_TYPE ISA_TYPE_Q40
612 +#define ISA_TYPE Q40_ISA
613  #define ISA_SEX  0
614  #endif
615  #if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA)
616 -#define ISA_TYPE ISA_TYPE_AG
617 +#define ISA_TYPE AG_ISA
618  #define ISA_SEX  1
619  #endif
620  #if defined(CONFIG_GG2) && !defined(MULTI_ISA)
621 -#define ISA_TYPE ISA_TYPE_GG2
622 +#define ISA_TYPE GG2_ISA
623  #define ISA_SEX  0
624  #endif
625  
626 @@ -123,13 +130,13 @@ static inline u8 __iomem *isa_itb(unsign
627    switch(ISA_TYPE)
628      {
629  #ifdef CONFIG_Q40
630 -    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr);
631 +    case Q40_ISA: return (u8 __iomem *)Q40_ISA_IO_B(addr);
632  #endif
633  #ifdef CONFIG_GG2
634 -    case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_IO_B(addr);
635 +    case GG2_ISA: return (u8 __iomem *)GG2_ISA_IO_B(addr);
636  #endif
637  #ifdef CONFIG_AMIGA_PCMCIA
638 -    case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr);
639 +    case AG_ISA: return (u8 __iomem *)AG_ISA_IO_B(addr);
640  #endif
641      default: return NULL; /* avoid warnings, just in case */
642      }
643 @@ -139,13 +146,13 @@ static inline u16 __iomem *isa_itw(unsig
644    switch(ISA_TYPE)
645      {
646  #ifdef CONFIG_Q40
647 -    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr);
648 +    case Q40_ISA: return (u16 __iomem *)Q40_ISA_IO_W(addr);
649  #endif
650  #ifdef CONFIG_GG2
651 -    case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_IO_W(addr);
652 +    case GG2_ISA: return (u16 __iomem *)GG2_ISA_IO_W(addr);
653  #endif
654  #ifdef CONFIG_AMIGA_PCMCIA
655 -    case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr);
656 +    case AG_ISA: return (u16 __iomem *)AG_ISA_IO_W(addr);
657  #endif
658      default: return NULL; /* avoid warnings, just in case */
659      }
660 @@ -155,7 +162,7 @@ static inline u32 __iomem *isa_itl(unsig
661    switch(ISA_TYPE)
662      {
663  #ifdef CONFIG_AMIGA_PCMCIA
664 -    case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr);
665 +    case AG_ISA: return (u32 __iomem *)AG_ISA_IO_W(addr);
666  #endif
667      default: return 0; /* avoid warnings, just in case */
668      }
669 @@ -165,13 +172,13 @@ static inline u8 __iomem *isa_mtb(unsign
670    switch(ISA_TYPE)
671      {
672  #ifdef CONFIG_Q40
673 -    case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
674 +    case Q40_ISA: return (u8 __iomem *)Q40_ISA_MEM_B(addr);
675  #endif
676  #ifdef CONFIG_GG2
677 -    case ISA_TYPE_GG2: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
678 +    case GG2_ISA: return (u8 __iomem *)GG2_ISA_MEM_B(addr);
679  #endif
680  #ifdef CONFIG_AMIGA_PCMCIA
681 -    case ISA_TYPE_AG: return (u8 __iomem *)addr;
682 +    case AG_ISA: return (u8 __iomem *)addr;
683  #endif
684      default: return NULL; /* avoid warnings, just in case */
685      }
686 @@ -181,13 +188,13 @@ static inline u16 __iomem *isa_mtw(unsig
687    switch(ISA_TYPE)
688      {
689  #ifdef CONFIG_Q40
690 -    case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
691 +    case Q40_ISA: return (u16 __iomem *)Q40_ISA_MEM_W(addr);
692  #endif
693  #ifdef CONFIG_GG2
694 -    case ISA_TYPE_GG2: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
695 +    case GG2_ISA: return (u16 __iomem *)GG2_ISA_MEM_W(addr);
696  #endif
697  #ifdef CONFIG_AMIGA_PCMCIA
698 -    case ISA_TYPE_AG: return (u16 __iomem *)addr;
699 +    case AG_ISA: return (u16 __iomem *)addr;
700  #endif
701      default: return NULL; /* avoid warnings, just in case */
702      }
703 @@ -201,30 +208,29 @@ static inline u16 __iomem *isa_mtw(unsig
704  #define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val)))
705  #define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val)))
706  
707 -#define isa_readb(p)       in_8(isa_mtb((unsigned long)(p)))
708 -#define isa_readw(p)       \
709 -       (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \
710 -                : in_le16(isa_mtw((unsigned long)(p))))
711 -#define isa_writeb(val,p)  out_8(isa_mtb((unsigned long)(p)),(val))
712 -#define isa_writew(val,p)  \
713 -       (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val))  \
714 -                : out_le16(isa_mtw((unsigned long)(p)),(val)))
715 -
716 +#define isa_readb(p)       in_8(isa_mtb(p))
717 +#define isa_readw(p)       (ISA_SEX ? in_be16(isa_mtw(p)) : in_le16(isa_mtw(p)))
718 +#define isa_writeb(val,p)  out_8(isa_mtb(p),(val))
719 +#define isa_writew(val,p)  (ISA_SEX ? out_be16(isa_mtw(p),(val)) : out_le16(isa_mtw(p),(val)))
720  static inline void isa_delay(void)
721  {
722 -  switch(ISA_TYPE)
723 -    {
724 +       switch (ISA_TYPE) {
725  #ifdef CONFIG_Q40
726 -    case ISA_TYPE_Q40: isa_outb(0,0x80); break;
727 +       case Q40_ISA:
728 +               isa_outb(0, 0x80);
729 +               break;
730  #endif
731  #ifdef CONFIG_GG2
732 -    case ISA_TYPE_GG2: break;
733 +       case GG2_ISA:
734 +               break;
735  #endif
736  #ifdef CONFIG_AMIGA_PCMCIA
737 -    case ISA_TYPE_AG: break;
738 +       case AG_ISA:
739 +               break;
740  #endif
741 -    default: break; /* avoid warnings */
742 -    }
743 +       default:
744 +               break; /* avoid warnings */
745 +       }
746  }
747  
748  #define isa_inb_p(p)      ({u8 v=isa_inb(p);isa_delay();v;})
749 @@ -253,7 +259,10 @@ static inline void isa_delay(void)
750         (ISA_SEX ? raw_outsl(isa_itl(port), (u32 *)(buf), (nr)) :  \
751                    raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1))
752  
753 +#endif  /* CONFIG_ISA */
754  
755 +
756 +#if defined(CONFIG_ISA) && !defined(CONFIG_PCI)
757  #define inb     isa_inb
758  #define inb_p   isa_inb_p
759  #define outb    isa_outb
760 @@ -276,9 +285,80 @@ static inline void isa_delay(void)
761  #define readw   isa_readw
762  #define writeb  isa_writeb
763  #define writew  isa_writew
764 +#endif /* CONFIG_ISA */
765 +
766 +#if defined(CONFIG_PCI)
767 +
768 +#define readl(addr)      in_le32(addr)
769 +#define writel(val, addr) out_le32((addr), (val))
770 +
771 +/* those can be defined for both ISA and PCI - it won't work though */
772 +#define readb(addr)       in_8(addr)
773 +#define readw(addr)       in_le16(addr)
774 +#define writeb(val, addr)  out_8((addr), (val))
775 +#define writew(val, addr)  out_le16((addr), (val))
776 +
777 +#define readb_relaxed(addr) readb(addr)
778 +#define readw_relaxed(addr) readw(addr)
779 +#define readl_relaxed(addr) readl(addr)
780 +
781 +#ifndef CONFIG_ISA
782 +#define inb(port)      in_8(port)
783 +#define outb(val, port) out_8((port), (val))
784 +#define inw(port)      in_le16(port)
785 +#define outw(val, port) out_le16((port), (val))
786 +#define inl(port)      in_le32(port)
787 +#define outl(val, port) out_le32((port), (val))
788 +#define insb(port, buf, nr)    \
789 +               raw_insb((u8 *)(port), (u8 *)(buf), (nr))
790 +#define outsb(port, buf, nr)   \
791 +               raw_outsb((u8 *)(port), (u8 *)(buf), (nr))
792 +#define insw(port, buf, nr)    \
793 +               raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr))
794 +#define outsw(port, buf, nr)   \
795 +               raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr))
796 +#define insl(port, buf, nr)    \
797 +               raw_insw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
798 +#define outsl(port, buf, nr)   \
799 +               raw_outsw_swapw((u16 *)(port), (u16 *)(buf), (nr)<<1)
800 +
801 +#define __raw_readb readb
802 +#define __raw_readw readw
803 +#define __raw_readl readl
804 +#define __raw_writeb writeb
805 +#define __raw_writew writew
806 +#define __raw_writel writel
807  
808 -#else  /* CONFIG_ISA */
809 +#else
810 +/*
811 + * kernel with both ISA and PCI compiled in, those have
812 + * conflicting defs for in/out. Simply consider port < 1024
813 + * ISA and everything else PCI. read,write not defined
814 + * in this case
815 + */
816 +#define inb(port) ((port) < 1024 ? isa_inb(port) : in_8(port))
817 +#define inb_p(port) ((port) < 1024 ? isa_inb_p(port) : in_8(port))
818 +#define inw(port) ((port) < 1024 ? isa_inw(port) : in_le16(port))
819 +#define inw_p(port) ((port) < 1024 ? isa_inw_p(port) : in_le16(port))
820 +#define inl(port) ((port) < 1024 ? isa_inl(port) : in_le32(port))
821 +#define inl_p(port) ((port) < 1024 ? isa_inl_p(port) : in_le32(port))
822 +
823 +#define outb(val, port) (((port) < 1024) ? isa_outb((val), (port))
824 +               : out_8((port), (val)))
825 +#define outb_p(val, port) (((port) < 1024) ? isa_outb_p((val), (port))
826 +               : out_8((port), (val)))
827 +#define outw(val, port) (((port) < 1024) ? isa_outw((val), (port))
828 +               : out_le16((port), (val)))
829 +#define outw_p(val, port) (((port) < 1024) ? isa_outw_p((val), (port))
830 +               : out_le16((port), (val)))
831 +#define outl(val, port) (((port) < 1024) ? isa_outl((val), (port))
832 +               : out_le32((port), (val)))
833 +#define outl_p(val, port) (((port) < 1024) ? isa_outl_p((val), (port))
834 +               : out_le32((port), (val)))
835 +#endif
836 +#endif /* CONFIG_PCI */
837  
838 +#if !defined(CONFIG_ISA) && !defined(CONFIG_PCI)
839  /*
840   * We need to define dummy functions for GENERIC_IOMAP support.
841   */
842 @@ -305,11 +385,11 @@ static inline void isa_delay(void)
843  #define writeb(val,addr) out_8((addr),(val))
844  #define readw(addr)      in_le16(addr)
845  #define writew(val,addr) out_le16((addr),(val))
846 -
847 -#endif /* CONFIG_ISA */
848 -
849 +#endif
850 +#if !defined(CONFIG_PCI)
851  #define readl(addr)      in_le32(addr)
852  #define writel(val,addr) out_le32((addr),(val))
853 +#endif
854  
855  #define mmiowb()
856  
857 @@ -345,10 +425,10 @@ static inline void memcpy_toio(volatile
858         __builtin_memcpy((void __force *) dst, src, count);
859  }
860  
861 -#ifndef CONFIG_SUN3
862 -#define IO_SPACE_LIMIT 0xffff
863 -#else
864 +#if defined(CONFIG_SUN3)
865  #define IO_SPACE_LIMIT 0x0fffffff
866 +#else
867 +#define IO_SPACE_LIMIT 0xffff
868  #endif
869  
870  #endif /* __KERNEL__ */
871 @@ -366,4 +446,5 @@ static inline void memcpy_toio(volatile
872   */
873  #define xlate_dev_kmem_ptr(p)  p
874  
875 +#endif /* CONFIG_COLDFIRE */
876  #endif /* _IO_H */
877 --- a/arch/m68k/include/asm/irq_mm.h
878 +++ b/arch/m68k/include/asm/irq_mm.h
879 @@ -12,7 +12,10 @@
880   * Currently the Atari has 72 and the Amiga 24, but if both are
881   * supported in the kernel it is better to make room for 72.
882   */
883 -#if defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
884 +#if defined(CONFIG_COLDFIRE)
885 +#define SYS_IRQS 256
886 +#define NR_IRQS SYS_IRQS
887 +#elif defined(CONFIG_VME) || defined(CONFIG_SUN3) || defined(CONFIG_SUN3X)
888  #define NR_IRQS 200
889  #elif defined(CONFIG_ATARI) || defined(CONFIG_MAC)
890  #define NR_IRQS 72
891 --- a/arch/m68k/include/asm/machdep_mm.h
892 +++ b/arch/m68k/include/asm/machdep_mm.h
893 @@ -32,4 +32,11 @@ extern void (*mach_heartbeat) (int);
894  extern void (*mach_l2_flush) (int);
895  extern void (*mach_beep) (unsigned int, unsigned int);
896  
897 +#ifdef CONFIG_COLDFIRE
898 +extern void __init config_coldfire(void);
899 +extern void __init mmu_context_init(void);
900 +extern irq_handler_t mach_default_handler;
901 +extern void (*mach_tick)(void);
902 +#endif
903 +
904  #endif /* _M68K_MACHDEP_H */
905 --- a/arch/m68k/include/asm/mcfsim.h
906 +++ b/arch/m68k/include/asm/mcfsim.h
907 @@ -39,6 +39,25 @@
908  #include <asm/m5407sim.h>
909  #endif
910  
911 +#if defined(CONFIG_COLDFIRE)
912 +#include <asm/coldfire.h>
913 +#endif
914 +
915 +#if defined(CONFIG_M5445X)
916 +#include <asm/mcf5445x_intc.h>
917 +#include <asm/mcf5445x_gpio.h>
918 +#include <asm/mcf5445x_ccm.h>
919 +#include <asm/mcf5445x_eport.h>
920 +#include <asm/mcf5445x_fbcs.h>
921 +#include <asm/mcf5445x_xbs.h>
922 +#include <asm/mcf5445x_dtim.h>
923 +#include <asm/mcf5445x_rtc.h>
924 +#include <asm/mcf5445x_scm.h>
925 +#elif defined(CONFIG_M547X_8X)
926 +#include <asm/m5485sim.h>
927 +#include <asm/m5485gpio.h>
928 +#include <asm/m5485gpt.h>
929 +#endif
930  
931  /*
932   *     Define the base address of the SIM within the MBAR address space.
933 --- a/arch/m68k/include/asm/mmu_context.h
934 +++ b/arch/m68k/include/asm/mmu_context.h
935 @@ -8,7 +8,7 @@ static inline void enter_lazy_tlb(struct
936  }
937  
938  #ifdef CONFIG_MMU
939 -#ifndef CONFIG_SUN3
940 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
941  
942  #include <asm/setup.h>
943  #include <asm/page.h>
944 @@ -103,7 +103,7 @@ static inline void activate_mm(struct mm
945                 switch_mm_0460(next_mm);
946  }
947  
948 -#else  /* CONFIG_SUN3 */
949 +#elif defined(CONFIG_SUN3)
950  #include <asm/sun3mmu.h>
951  #include <linux/sched.h>
952  
953 @@ -151,7 +151,179 @@ static inline void activate_mm(struct mm
954         activate_context(next_mm);
955  }
956  
957 +#else /* CONFIG_COLDFIRE */
958 +
959 +#include <asm/coldfire.h>
960 +#include <asm/atomic.h>
961 +#include <asm/bitops.h>
962 +#include <asm/mmu.h>
963 +
964 +#define NO_CONTEXT             256
965 +#define LAST_CONTEXT           255
966 +#define FIRST_CONTEXT          1
967 +
968 +#ifdef CONFIG_VDSO
969 +#define cpu_context(mm)                ((mm)->context.id)
970 +#else
971 +#define cpu_context(mm)                ((mm)->context)
972 +#endif
973 +
974 +#ifdef CONFIG_VDSO
975 +extern void set_context(unsigned long context, pgd_t *pgd);
976 +#else
977 +extern void set_context(mm_context_t context, pgd_t *pgd);
978 +#endif
979 +extern unsigned long context_map[];
980 +#ifdef CONFIG_VDSO
981 +extern unsigned long next_mmu_context;
982 +#else
983 +extern mm_context_t next_mmu_context;
984 +#endif
985 +
986 +
987 +extern atomic_t nr_free_contexts;
988 +extern struct mm_struct *context_mm[LAST_CONTEXT+1];
989 +extern void steal_context(void);
990 +
991 +static inline void get_mmu_context(struct mm_struct *mm)
992 +{
993 +#ifdef CONFIG_VDSO
994 +       unsigned long ctx;
995 +#else
996 +       mm_context_t ctx;
997  #endif
998 +
999 +       if (cpu_context(mm) != NO_CONTEXT)
1000 +               return;
1001 +       while (atomic_dec_and_test_lt(&nr_free_contexts)) {
1002 +               atomic_inc(&nr_free_contexts);
1003 +               steal_context();
1004 +       }
1005 +       ctx = next_mmu_context;
1006 +       while (test_and_set_bit(ctx, context_map)) {
1007 +               ctx = find_next_zero_bit(context_map, LAST_CONTEXT+1, ctx);
1008 +               if (ctx > LAST_CONTEXT)
1009 +                       ctx = 0;
1010 +       }
1011 +       next_mmu_context = (ctx + 1) & LAST_CONTEXT;
1012 +       cpu_context(mm) = ctx;
1013 +       context_mm[ctx] = mm;
1014 +}
1015 +
1016 +/*
1017 + * Set up the context for a new address space.
1018 + */
1019 +#define init_new_context(tsk, mm)      ((cpu_context(mm) = NO_CONTEXT), 0)
1020 +/* #define init_new_context(tsk, mm)   (((mm)->context = NO_CONTEXT), 0) */
1021 +
1022 +/*
1023 + * We're finished using the context for an address space.
1024 + */
1025 +static inline void destroy_context(struct mm_struct *mm)
1026 +{
1027 +       if (cpu_context(mm) != NO_CONTEXT) {
1028 +               clear_bit(cpu_context(mm), context_map);
1029 +               cpu_context(mm) = NO_CONTEXT;
1030 +               atomic_inc(&nr_free_contexts);
1031 +       }
1032 +}
1033 +
1034 +static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
1035 +       struct task_struct *tsk)
1036 +{
1037 +       get_mmu_context(tsk->mm);
1038 +       set_context(cpu_context(tsk->mm), next->pgd);
1039 +}
1040 +
1041 +/*
1042 + * After we have set current->mm to a new value, this activates
1043 + * the context for the new mm so we see the new mappings.
1044 + */
1045 +static inline void activate_mm(struct mm_struct *active_mm,
1046 +       struct mm_struct *mm)
1047 +{
1048 +       get_mmu_context(mm);
1049 +       set_context(cpu_context(mm), mm->pgd);
1050 +}
1051 +
1052 +#define deactivate_mm(tsk, mm) do { } while (0)
1053 +
1054 +extern void mmu_context_init(void);
1055 +#if defined(CONFIG_M547X_8X)
1056 +#define prepare_arch_switch(next)      load_ksp_mmu(next)
1057 +
1058 +static inline void load_ksp_mmu(struct task_struct *task)
1059 +{
1060 +       int flags;
1061 +       struct mm_struct *mm;
1062 +       int asid;
1063 +       pgd_t *pgd;
1064 +       pmd_t *pmd;
1065 +       pte_t *pte;
1066 +       unsigned long mmuar;
1067 +
1068 +       local_irq_save(flags);
1069 +       mmuar = task->thread.ksp;
1070 +
1071 +       /* Search for a valid TLB entry, if one is found, don't remap */
1072 +       *MMUAR = mmuar;
1073 +       *MMUOR = MMUOR_STLB | MMUOR_ADR;
1074 +       if ((*MMUSR) & MMUSR_HIT)
1075 +               goto end;
1076 +
1077 +       if (mmuar >= PAGE_OFFSET) {
1078 +               mm = &init_mm;
1079 +       } else {
1080 +               printk(KERN_INFO "load_ksp_mmu: non-kernel"
1081 +                        " mm found: 0x%08x\n", (unsigned int) task->mm);
1082 +               mm = task->mm;
1083 +       }
1084 +
1085 +       if (!mm)
1086 +               goto bug;
1087 +
1088 +       pgd = pgd_offset(mm, mmuar);
1089 +       if (pgd_none(*pgd))
1090 +               goto bug;
1091 +
1092 +       pmd = pmd_offset(pgd, mmuar);
1093 +       if (pmd_none(*pmd))
1094 +               goto bug;
1095 +
1096 +       pte = (mmuar >= PAGE_OFFSET) ? pte_offset_kernel(pmd, mmuar)
1097 +                       : pte_offset_map(pmd, mmuar);
1098 +       if (pte_none(*pte) || !pte_present(*pte))
1099 +               goto bug;
1100 +
1101 +       set_pte(pte, pte_mkyoung(*pte));
1102 +       asid = cpu_context(mm) & 0xff;
1103 +       if (!pte_dirty(*pte) && mmuar <= PAGE_OFFSET)
1104 +               set_pte(pte, pte_wrprotect(*pte));
1105 +
1106 +       *MMUTR = (mmuar & PAGE_MASK) | (asid << CF_ASID_MMU_SHIFT)
1107 +               | (((int)(pte->pte) & (int)CF_PAGE_MMUTR_MASK)
1108 +                       >> CF_PAGE_MMUTR_SHIFT)
1109 +               | MMUTR_V;
1110 +
1111 +       *MMUDR = (pte_val(*pte) & PAGE_MASK)
1112 +               | ((pte->pte) & CF_PAGE_MMUDR_MASK)
1113 +               | MMUDR_SZ8K | MMUDR_X;
1114 +
1115 +       *MMUOR = MMUOR_ACC | MMUOR_UAA;
1116 +       asm ("nop");
1117 +
1118 +       goto end;
1119 +
1120 +bug:
1121 +       printk(KERN_ERR "ksp load failed: mm=0x%08x ksp=0x%08x\n",
1122 +               (unsigned int) mm, (unsigned int) mmuar);
1123 +end:
1124 +       local_irq_restore(flags);
1125 +}
1126 +#endif /* CONFIG_M547X_8X */
1127 +
1128 +#endif /* CONFIG_COLDFIRE */
1129 +
1130  #else /* !CONFIG_MMU */
1131  
1132  static inline int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
1133 --- a/arch/m68k/include/asm/page_mm.h
1134 +++ b/arch/m68k/include/asm/page_mm.h
1135 @@ -1,10 +1,15 @@
1136  #ifndef _M68K_PAGE_H
1137  #define _M68K_PAGE_H
1138  
1139 +/*#if defined(CONFIG_COLDFIRE)*/
1140 +#if defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
1141 +#include <asm/cf_page.h>
1142 +#else
1143 +
1144  #include <linux/const.h>
1145  
1146  /* PAGE_SHIFT determines the page size */
1147 -#ifndef CONFIG_SUN3
1148 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
1149  #define PAGE_SHIFT     (12)
1150  #else
1151  #define PAGE_SHIFT     (13)
1152 @@ -113,10 +118,31 @@ typedef struct page *pgtable_t;
1153  
1154  extern unsigned long m68k_memoffset;
1155  
1156 -#ifndef CONFIG_SUN3
1157 +#if !defined(CONFIG_SUN3)
1158  
1159  #define WANT_PAGE_VIRTUAL
1160  
1161 +#if defined(CONFIG_COLDFIRE)
1162 +static inline unsigned long ___pa(void *vaddr)
1163 +{
1164 +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
1165 +       return (((unsigned long)vaddr & 0x0fffffff) + CONFIG_SDRAM_BASE);
1166 +#else
1167 +       return (unsigned long)vaddr;
1168 +#endif
1169 +}
1170 +#define __pa(vaddr)    ___pa((void *)(vaddr))
1171 +
1172 +static inline void *__va(unsigned long paddr)
1173 +{
1174 +#if CONFIG_SDRAM_BASE != PAGE_OFFSET
1175 +       return (void *)((paddr & 0x0fffffff) + PAGE_OFFSET);
1176 +#else
1177 +       return (void *)paddr;
1178 +#endif
1179 +}
1180 +
1181 +#else
1182  static inline unsigned long ___pa(void *vaddr)
1183  {
1184         unsigned long paddr;
1185 @@ -138,6 +164,7 @@ static inline void *__va(unsigned long p
1186                 : "0" (paddr), "i" (m68k_fixup_memoffset));
1187         return vaddr;
1188  }
1189 +#endif
1190  
1191  #else  /* !CONFIG_SUN3 */
1192  /* This #define is a horrible hack to suppress lots of warnings. --m */
1193 @@ -169,6 +196,8 @@ static inline void *__va(unsigned long x
1194   * memory node, but we have no highmem, so that works for now.
1195   * TODO: implement (fast) pfn<->pgdat_idx conversion functions, this makes lots
1196   * of the shifts unnecessary.
1197 + *
1198 + * PFNs are used to map physical pages.  So PFN[0] maps to the base phys addr.
1199   */
1200  #define virt_to_pfn(kaddr)     (__pa(kaddr) >> PAGE_SHIFT)
1201  #define pfn_to_virt(pfn)       __va((pfn) << PAGE_SHIFT)
1202 @@ -225,4 +254,10 @@ static inline __attribute_const__ int __
1203  
1204  #include <asm-generic/getorder.h>
1205  
1206 +#ifdef CONFIG_VDSO
1207 +/* vDSO support */
1208 +#define __HAVE_ARCH_GATE_AREA
1209 +#endif
1210 +
1211 +#endif /* !CONFIG_COLDFIRE */
1212  #endif /* _M68K_PAGE_H */
1213 --- a/arch/m68k/include/asm/page_offset.h
1214 +++ b/arch/m68k/include/asm/page_offset.h
1215 @@ -1,10 +1,13 @@
1216  /* This handles the memory map.. */
1217  
1218  #ifdef CONFIG_MMU
1219 -#ifndef CONFIG_SUN3
1220 -#define PAGE_OFFSET_RAW                0x00000000
1221 -#else
1222 +#if defined(CONFIG_SUN3)
1223  #define PAGE_OFFSET_RAW                0x0E000000
1224 +#elif defined(CONFIG_M5445X) || defined(CONFIG_M547X_8X)
1225 +#define PHYS_OFFSET            CONFIG_SDRAM_BASE
1226 +#define PAGE_OFFSET_RAW                (PHYS_OFFSET)
1227 +#else
1228 +#define PAGE_OFFSET_RAW                0x00000000
1229  #endif
1230  #else
1231  #define        PAGE_OFFSET_RAW         CONFIG_RAMBASE
1232 --- a/arch/m68k/include/asm/pgalloc.h
1233 +++ b/arch/m68k/include/asm/pgalloc.h
1234 @@ -7,8 +7,10 @@
1235  
1236  #ifdef CONFIG_MMU
1237  #include <asm/virtconvert.h>
1238 -#ifdef CONFIG_SUN3
1239 +#if defined (CONFIG_SUN3)
1240  #include <asm/sun3_pgalloc.h>
1241 +#elif defined(CONFIG_COLDFIRE)
1242 +#include <asm/cf_pgalloc.h>
1243  #else
1244  #include <asm/motorola_pgalloc.h>
1245  #endif
1246 --- a/arch/m68k/include/asm/pgtable_mm.h
1247 +++ b/arch/m68k/include/asm/pgtable_mm.h
1248 @@ -40,6 +40,8 @@
1249  /* PGDIR_SHIFT determines what a third-level page table entry can map */
1250  #ifdef CONFIG_SUN3
1251  #define PGDIR_SHIFT     17
1252 +#elif defined(CONFIG_COLDFIRE)
1253 +#define PGDIR_SHIFT    22
1254  #else
1255  #define PGDIR_SHIFT    25
1256  #endif
1257 @@ -54,6 +56,10 @@
1258  #define PTRS_PER_PTE   16
1259  #define PTRS_PER_PMD   1
1260  #define PTRS_PER_PGD   2048
1261 +#elif defined(CONFIG_COLDFIRE)
1262 +#define PTRS_PER_PTE    512
1263 +#define PTRS_PER_PMD    1
1264 +#define PTRS_PER_PGD    1024
1265  #else
1266  #define PTRS_PER_PTE   1024
1267  #define PTRS_PER_PMD   8
1268 @@ -66,6 +72,11 @@
1269  #ifdef CONFIG_SUN3
1270  #define KMAP_START     0x0DC00000
1271  #define KMAP_END       0x0E000000
1272 +#elif defined(CONFIG_COLDFIRE)
1273 +#define        VMALLOC_START   0xc0000000
1274 +#define VMALLOC_END    0xcfffffff
1275 +#define KMAP_START     (VMALLOC_END + 1)
1276 +#define KMAP_END       0xe8000000
1277  #else
1278  #define        KMAP_START      0xd0000000
1279  #define        KMAP_END        0xf0000000
1280 @@ -79,9 +90,11 @@
1281   * The vmalloc() routines leaves a hole of 4kB between each vmalloced
1282   * area for the same reason. ;)
1283   */
1284 +#if !defined(CONFIG_COLDFIRE)
1285  #define VMALLOC_OFFSET (8*1024*1024)
1286  #define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
1287  #define VMALLOC_END KMAP_START
1288 +#endif
1289  #else
1290  extern unsigned long vmalloc_end;
1291  #define VMALLOC_START 0x0f800000
1292 @@ -130,6 +143,8 @@ static inline void update_mmu_cache(stru
1293  
1294  #ifdef CONFIG_SUN3
1295  #include <asm/sun3_pgtable.h>
1296 +#elif defined(CONFIG_COLDFIRE)
1297 +#include <asm/cf_pgtable.h>
1298  #else
1299  #include <asm/motorola_pgtable.h>
1300  #endif
1301 @@ -138,6 +153,9 @@ static inline void update_mmu_cache(stru
1302  /*
1303   * Macro to mark a page protection value as "uncacheable".
1304   */
1305 +#ifdef CONFIG_COLDFIRE
1306 +# define pgprot_noncached(prot)        (__pgprot(pgprot_val(prot) | CF_PAGE_NOCACHE))
1307 +#else /* CONFIG_COLDFIRE */
1308  #ifdef SUN3_PAGE_NOCACHE
1309  # define __SUN3_PAGE_NOCACHE   SUN3_PAGE_NOCACHE
1310  #else
1311 @@ -152,6 +170,7 @@ static inline void update_mmu_cache(stru
1312             ? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S))  \
1313             : (prot)))
1314  
1315 +#endif /* CONFIG_COLDFIRE */
1316  #include <asm-generic/pgtable.h>
1317  #endif /* !__ASSEMBLY__ */
1318  
1319 --- a/arch/m68k/include/asm/processor_mm.h
1320 +++ b/arch/m68k/include/asm/processor_mm.h
1321 @@ -2,6 +2,7 @@
1322   * include/asm-m68k/processor.h
1323   *
1324   * Copyright (C) 1995 Hamish Macdonald
1325 + * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
1326   */
1327  
1328  #ifndef __ASM_M68K_PROCESSOR_H
1329 @@ -22,24 +23,38 @@ static inline unsigned long rdusp(void)
1330  {
1331         unsigned long usp;
1332  
1333 +#ifndef CONFIG_COLDFIRE
1334         __asm__ __volatile__("move %/usp,%0" : "=a" (usp));
1335 +#else
1336 +       __asm__ __volatile__("movel %/usp,%0" : "=a" (usp));
1337 +#endif
1338         return usp;
1339  }
1340  
1341  static inline void wrusp(unsigned long usp)
1342  {
1343 +#ifndef CONFIG_COLDFIRE
1344         __asm__ __volatile__("move %0,%/usp" : : "a" (usp));
1345 +#else
1346 +       __asm__ __volatile__("movel %0,%/usp" : : "a" (usp));
1347 +#endif
1348  }
1349  
1350  /*
1351   * User space process size: 3.75GB. This is hardcoded into a few places,
1352   * so don't change it unless you know what you are doing.
1353   */
1354 -#ifndef CONFIG_SUN3
1355 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
1356  #define TASK_SIZE      (0xF0000000UL)
1357 +#elif defined(CONFIG_COLDFIRE)
1358 +#define TASK_SIZE       (0xC0000000UL)
1359 +#else /* CONFIG_SUN3 */
1360 +#ifdef __ASSEMBLY__
1361 +#define TASK_SIZE      (0x0E000000)
1362  #else
1363  #define TASK_SIZE      (0x0E000000UL)
1364  #endif
1365 +#endif
1366  
1367  #ifdef __KERNEL__
1368  #define STACK_TOP      TASK_SIZE
1369 @@ -49,9 +64,11 @@ static inline void wrusp(unsigned long u
1370  /* This decides where the kernel will search for a free chunk of vm
1371   * space during mmap's.
1372   */
1373 -#ifndef CONFIG_SUN3
1374 -#define TASK_UNMAPPED_BASE     0xC0000000UL
1375 -#else
1376 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
1377 +#define TASK_UNMAPPED_BASE     0xC0000000UL
1378 +#elif defined(CONFIG_COLDFIRE)
1379 +#define TASK_UNMAPPED_BASE     0x60000000UL
1380 +#else /* CONFIG_SUN3 */
1381  #define TASK_UNMAPPED_BASE     0x0A000000UL
1382  #endif
1383  #define TASK_UNMAPPED_ALIGN(addr, off) PAGE_ALIGN(addr)
1384 @@ -60,7 +77,11 @@ struct thread_struct {
1385         unsigned long  ksp;             /* kernel stack pointer */
1386         unsigned long  usp;             /* user stack pointer */
1387         unsigned short sr;              /* saved status register */
1388 +#ifndef CONFIG_COLDFIRE
1389         unsigned short fs;              /* saved fs (sfc, dfc) */
1390 +#else
1391 +       mm_segment_t   fs;
1392 +#endif
1393         unsigned long  crp[2];          /* cpu root pointer */
1394         unsigned long  esp0;            /* points to SR of stack frame */
1395         unsigned long  faddr;           /* info about last fault */
1396 @@ -81,6 +102,7 @@ struct thread_struct {
1397  /*
1398   * Do necessary setup to start up a newly executed thread.
1399   */
1400 +#ifndef CONFIG_COLDFIRE
1401  static inline void start_thread(struct pt_regs * regs, unsigned long pc,
1402                                 unsigned long usp)
1403  {
1404 @@ -91,6 +113,23 @@ static inline void start_thread(struct p
1405         regs->sr &= ~0x2000;
1406         wrusp(usp);
1407  }
1408 +#else
1409 +/*
1410 + * Do necessary setup to start up a newly executed thread.
1411 + *
1412 + * pass the data segment into user programs if it exists,
1413 + * it can't hurt anything as far as I can tell
1414 + */
1415 +#define start_thread(_regs, _pc, _usp)                 \
1416 +do {                                                   \
1417 +       set_fs(USER_DS); /* reads from user space */    \
1418 +       (_regs)->pc = (_pc);                            \
1419 +       if (current->mm)                                \
1420 +               (_regs)->d5 = current->mm->start_data;  \
1421 +       (_regs)->sr &= ~0x2000;                         \
1422 +       wrusp(_usp);                                    \
1423 +} while (0)
1424 +#endif
1425  
1426  /* Forward declaration, a strange C thing */
1427  struct task_struct;
1428 --- a/arch/m68k/include/asm/ptrace.h
1429 +++ b/arch/m68k/include/asm/ptrace.h
1430 @@ -39,10 +39,21 @@ struct pt_regs {
1431    long     orig_d0;
1432    long     stkadj;
1433  #ifdef CONFIG_COLDFIRE
1434 +#if 0
1435    unsigned format :  4; /* frame format specifier */
1436    unsigned vector : 12; /* vector offset */
1437    unsigned short sr;
1438    unsigned long  pc;
1439 +#endif
1440 +/*FROM BSP*/
1441 +    unsigned long mmuar;
1442 +    unsigned long mmusr;
1443 +    unsigned format : 4;  /* frame format specifier */
1444 +    unsigned fs2 : 2;
1445 +    unsigned vector: 8;
1446 +    unsigned fs1 : 2;
1447 +    unsigned short sr;
1448 +    unsigned long pc;
1449  #else
1450    unsigned short sr;
1451    unsigned long  pc;
1452 @@ -71,6 +82,8 @@ struct switch_stack {
1453  #define PTRACE_GETFPREGS          14
1454  #define PTRACE_SETFPREGS          15
1455  
1456 +#define PTRACE_GET_THREAD_AREA    25
1457 +
1458  #ifdef __KERNEL__
1459  
1460  #ifndef PS_S
1461 --- a/arch/m68k/include/asm/raw_io.h
1462 +++ b/arch/m68k/include/asm/raw_io.h
1463 @@ -8,6 +8,10 @@
1464  #ifndef _RAW_IO_H
1465  #define _RAW_IO_H
1466  
1467 +#ifdef CONFIG_COLDFIRE
1468 +#include <asm/cf_raw_io.h>
1469 +#else
1470 +
1471  #ifdef __KERNEL__
1472  
1473  #include <asm/types.h>
1474 @@ -60,6 +64,9 @@ extern void __iounmap(void *addr, unsign
1475  #define __raw_writew(val,addr) out_be16((addr),(val))
1476  #define __raw_writel(val,addr) out_be32((addr),(val))
1477  
1478 +#define swap_inw(port) in_le16((port))
1479 +#define swap_outw(val,port) out_le16((port),(val))
1480 +
1481  static inline void raw_insb(volatile u8 __iomem *port, u8 *buf, unsigned int len)
1482  {
1483         unsigned int i;
1484 @@ -344,4 +351,6 @@ static inline void raw_outsw_swapw(volat
1485  
1486  #endif /* __KERNEL__ */
1487  
1488 +#endif /* CONFIG_COLDFIRE */
1489 +
1490  #endif /* _RAW_IO_H */
1491 --- a/arch/m68k/include/asm/segment.h
1492 +++ b/arch/m68k/include/asm/segment.h
1493 @@ -29,6 +29,7 @@ typedef struct {
1494   * Get/set the SFC/DFC registers for MOVES instructions
1495   */
1496  
1497 +#ifndef CONFIG_COLDFIRE
1498  static inline mm_segment_t get_fs(void)
1499  {
1500  #ifdef CONFIG_MMU
1501 @@ -56,6 +57,15 @@ static inline void set_fs(mm_segment_t v
1502  #endif
1503  }
1504  
1505 +#else /* CONFIG_COLDFIRE */
1506 +
1507 +#include <asm/current.h>
1508 +#define get_fs()       (current->thread.fs)
1509 +#define set_fs(val)    (current->thread.fs = (val))
1510 +#define get_ds()       (KERNEL_DS)
1511 +
1512 +#endif /* CONFIG_COLDFIRE */
1513 +
1514  #define segment_eq(a,b)        ((a).seg == (b).seg)
1515  
1516  #endif /* __ASSEMBLY__ */
1517 --- a/arch/m68k/include/asm/setup.h
1518 +++ b/arch/m68k/include/asm/setup.h
1519 @@ -2,6 +2,7 @@
1520  ** asm/setup.h -- Definition of the Linux/m68k setup information
1521  **
1522  ** Copyright 1992 by Greg Harp
1523 + * Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
1524  **
1525  ** This file is subject to the terms and conditions of the GNU General Public
1526  ** License.  See the file COPYING in the main directory of this archive
1527 @@ -40,6 +41,7 @@
1528  #define MACH_HP300    9
1529  #define MACH_Q40     10
1530  #define MACH_SUN3X   11
1531 +#define MACH_CFMMU   12
1532  
1533  #define COMMAND_LINE_SIZE 256
1534  
1535 @@ -189,6 +191,14 @@ extern unsigned long m68k_machtype;
1536  #  define MACH_TYPE (MACH_SUN3X)
1537  #endif
1538  
1539 +#if !defined(CONFIG_COLDFIRE)
1540 +#  define MACH_IS_COLDFIRE (0)
1541 +#else
1542 +#  define CONFIG_COLDFIRE_ONLY
1543 +#  define MACH_IS_COLDFIRE (1)
1544 +#  define MACH_TYPE (MACH_CFMMU)
1545 +#endif
1546 +
1547  #ifndef MACH_TYPE
1548  #  define MACH_TYPE (m68k_machtype)
1549  #endif
1550 @@ -211,23 +221,31 @@ extern unsigned long m68k_machtype;
1551  #define CPUB_68030     1
1552  #define CPUB_68040     2
1553  #define CPUB_68060     3
1554 +#define CPUB_CFV4E     4
1555  
1556  #define CPU_68020      (1<<CPUB_68020)
1557  #define CPU_68030      (1<<CPUB_68030)
1558  #define CPU_68040      (1<<CPUB_68040)
1559  #define CPU_68060      (1<<CPUB_68060)
1560 +#define CPU_CFV4E      (1<<CPUB_CFV4E)
1561  
1562  #define FPUB_68881     0
1563  #define FPUB_68882     1
1564  #define FPUB_68040     2                       /* Internal FPU */
1565  #define FPUB_68060     3                       /* Internal FPU */
1566  #define FPUB_SUNFPA    4                       /* Sun-3 FPA */
1567 +#define FPUB_CFV4E     5
1568  
1569  #define FPU_68881      (1<<FPUB_68881)
1570  #define FPU_68882      (1<<FPUB_68882)
1571  #define FPU_68040      (1<<FPUB_68040)
1572  #define FPU_68060      (1<<FPUB_68060)
1573  #define FPU_SUNFPA     (1<<FPUB_SUNFPA)
1574 +#ifdef CONFIG_M547X_8X
1575 +#define FPU_CFV4E      (1<<FPUB_CFV4E)
1576 +#else
1577 +#define FPU_CFV4E      0
1578 +#endif
1579  
1580  #define MMUB_68851     0
1581  #define MMUB_68030     1                       /* Internal MMU */
1582 @@ -235,6 +253,7 @@ extern unsigned long m68k_machtype;
1583  #define MMUB_68060     3                       /* Internal MMU */
1584  #define MMUB_APOLLO    4                       /* Custom Apollo */
1585  #define MMUB_SUN3      5                       /* Custom Sun-3 */
1586 +#define MMUB_CFV4E     6
1587  
1588  #define MMU_68851      (1<<MMUB_68851)
1589  #define MMU_68030      (1<<MMUB_68030)
1590 @@ -242,6 +261,7 @@ extern unsigned long m68k_machtype;
1591  #define MMU_68060      (1<<MMUB_68060)
1592  #define MMU_SUN3       (1<<MMUB_SUN3)
1593  #define MMU_APOLLO     (1<<MMUB_APOLLO)
1594 +#define MMU_CFV4E      (1<<MMUB_CFV4E)
1595  
1596  #ifdef __KERNEL__
1597  
1598 @@ -341,6 +361,14 @@ extern int m68k_is040or060;
1599  #  endif
1600  #endif
1601  
1602 +#if !defined(CONFIG_CFV4E)
1603 +#  define CPU_IS_COLDFIRE (0)
1604 +#else
1605 +#  define CPU_IS_COLDFIRE (m68k_cputype & CPU_CFV4E)
1606 +#  define CPU_IS_CFV4E    (m68k_cputype & CPU_CFV4E)
1607 +#  define MMU_IS_CFV4E    (m68k_mmutype & MMU_CFV4E)
1608 +#endif
1609 +
1610  #define CPU_TYPE (m68k_cputype)
1611  
1612  #ifdef CONFIG_M68KFPU_EMU
1613 @@ -371,6 +399,14 @@ extern int m68k_realnum_memory;            /* real
1614  extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */
1615  #endif
1616  
1617 +#ifdef CONFIG_CFV4E
1618 +#define QCHIP_RESTORE_DIRECTIVE ".chip 547x"
1619 +#define  CHIP_RESTORE_DIRECTIVE  .chip 547x
1620 +#else
1621 +#define QCHIP_RESTORE_DIRECTIVE ".chip 68k"
1622 +#define  CHIP_RESTORE_DIRECTIVE  .chip 68k
1623 +#endif
1624 +
1625  #endif /* __KERNEL__ */
1626  
1627  #endif /* _M68K_SETUP_H */
1628 --- a/arch/m68k/include/asm/sigcontext.h
1629 +++ b/arch/m68k/include/asm/sigcontext.h
1630 @@ -15,9 +15,15 @@ struct sigcontext {
1631         unsigned long  sc_pc;
1632         unsigned short sc_formatvec;
1633  #ifndef __uClinux__
1634 +# ifdef __mcoldfire__
1635 +       unsigned long  sc_fpregs[2][2]; /* room for two fp registers */
1636 +       unsigned long  sc_fpcntl[3];
1637 +       unsigned char  sc_fpstate[16+6*8];
1638 +# else
1639         unsigned long  sc_fpregs[2*3];  /* room for two fp registers */
1640         unsigned long  sc_fpcntl[3];
1641         unsigned char  sc_fpstate[216];
1642 +# endif
1643  #endif
1644  };
1645  
1646 --- a/arch/m68k/include/asm/siginfo.h
1647 +++ b/arch/m68k/include/asm/siginfo.h
1648 @@ -29,7 +29,8 @@ typedef struct siginfo {
1649                 struct {
1650                         timer_t _tid;           /* timer id */
1651                         int _overrun;           /* overrun count */
1652 -                       char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
1653 +                       char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)
1654 +                                 + sizeof(__kernel_uid_t)];
1655                         sigval_t _sigval;       /* same as below */
1656                         int _sys_private;       /* not to be passed to user */
1657                 } _timer;
1658 @@ -38,18 +39,18 @@ typedef struct siginfo {
1659                 struct {
1660                         __kernel_pid_t _pid;    /* sender's pid */
1661                         __kernel_uid_t _uid;    /* backwards compatibility */
1662 -                       sigval_t _sigval;
1663                         __kernel_uid32_t _uid32; /* sender's uid */
1664 +                       sigval_t _sigval;
1665                 } _rt;
1666  
1667                 /* SIGCHLD */
1668                 struct {
1669                         __kernel_pid_t _pid;    /* which child */
1670                         __kernel_uid_t _uid;    /* backwards compatibility */
1671 -                       int _status;            /* exit code */
1672 +                       __kernel_uid32_t _uid32; /* sender's uid */
1673                         clock_t _utime;
1674                         clock_t _stime;
1675 -                       __kernel_uid32_t _uid32; /* sender's uid */
1676 +                       int _status;            /* exit code */
1677                 } _sigchld;
1678  
1679                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
1680 --- a/arch/m68k/include/asm/signal.h
1681 +++ b/arch/m68k/include/asm/signal.h
1682 @@ -150,7 +150,8 @@ typedef struct sigaltstack {
1683  #ifdef __KERNEL__
1684  #include <asm/sigcontext.h>
1685  
1686 -#ifndef __uClinux__
1687 +//#ifndef __uClinux__
1688 +#ifndef CONFIG_COLDFIRE   /*FIXME Jason*/
1689  #define __HAVE_ARCH_SIG_BITOPS
1690  
1691  static inline void sigaddset(sigset_t *set, int _sig)
1692 @@ -201,7 +202,6 @@ static inline int sigfindinword(unsigned
1693  
1694  struct pt_regs;
1695  extern void ptrace_signal_deliver(struct pt_regs *regs, void *cookie);
1696 -
1697  #else
1698  
1699  #undef __HAVE_ARCH_SIG_BITOPS
1700 --- a/arch/m68k/include/asm/string_mm.h
1701 +++ b/arch/m68k/include/asm/string_mm.h
1702 @@ -93,6 +93,7 @@ static inline char *strchr(const char *s
1703         return (char *)s - 1;
1704  }
1705  
1706 +#ifndef CONFIG_COLDFIRE
1707  #define __HAVE_ARCH_STRCMP
1708  static inline int strcmp(const char *cs, const char *ct)
1709  {
1710 @@ -110,6 +111,7 @@ static inline int strcmp(const char *cs,
1711                 : "+a" (cs), "+a" (ct), "=d" (res));
1712         return res;
1713  }
1714 +#endif
1715  
1716  #define __HAVE_ARCH_MEMSET
1717  extern void *memset(void *, int, __kernel_size_t);
1718 --- a/arch/m68k/include/asm/swab.h
1719 +++ b/arch/m68k/include/asm/swab.h
1720 @@ -4,7 +4,7 @@
1721  #include <linux/types.h>
1722  #include <linux/compiler.h>
1723  
1724 -#define __SWAB_64_THRU_32__
1725 +/*#define __SWAB_64_THRU_32__
1726  
1727  #if defined (__mcfisaaplus__) || defined (__mcfisac__)
1728  static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
1729 @@ -23,5 +23,29 @@ static inline __attribute_const__ __u32
1730  }
1731  #define __arch_swab32 __arch_swab32
1732  #endif
1733 +*/
1734 +#if defined(__GNUC__)
1735 +#if defined(__mcfisaaplus__) || defined(__mcfisac__)
1736 +static inline __attribute_const__ __u32 ___arch__swab32(__u32 val)
1737 +{
1738 +       __asm__ ("byterev %0" : "=d" (val) : "0" (val));
1739 +       return val;
1740 +}
1741 +#define __arch__swab32(x) ___arch__swab32(x)
1742 +#elif !defined(__mcoldfire__)
1743 +static inline __attribute_const__ __u32 ___arch__swab32(__u32 val)
1744 +{
1745 +       __asm__("rolw #8,%0; swap %0; rolw #8,%0" : "=d" (val) : "0" (val));
1746 +       return val;
1747 +}
1748 +#define __arch__swab32(x) ___arch__swab32(x)
1749 +
1750 +#endif
1751 +#endif
1752 +
1753 +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__)
1754 +#  define __BYTEORDER_HAS_U64__
1755 +#  define __SWAB_64_THRU_32__
1756 +#endif
1757  
1758  #endif /* _M68K_SWAB_H */
1759 --- a/arch/m68k/include/asm/system_mm.h
1760 +++ b/arch/m68k/include/asm/system_mm.h
1761 @@ -5,9 +5,24 @@
1762  #include <linux/kernel.h>
1763  #include <asm/segment.h>
1764  #include <asm/entry.h>
1765 +#include <asm/cfcache.h>
1766  
1767  #ifdef __KERNEL__
1768  
1769 +#ifdef CONFIG_COLDFIRE
1770 +#define FLUSH_BC        (0x00040000)
1771 +
1772 +#define finish_arch_switch(prev) do {          \
1773 +       unsigned long tmpreg;                   \
1774 +       asm volatile ( "move.l %2,%0\n"         \
1775 +                      "orl %1,%0\n"            \
1776 +                      "movec %0,%%cacr"        \
1777 +                      : "=&d" (tmpreg)         \
1778 +                      : "id" (FLUSH_BC), "m" (shadow_cacr));   \
1779 +       } while(0)
1780 +
1781 +#endif
1782 +
1783  /*
1784   * switch_to(n) should switch tasks to task ptr, first checking that
1785   * ptr isn't the current task, in which case it does nothing.  This
1786 @@ -63,16 +78,25 @@ asmlinkage void resume(void);
1787  #define smp_read_barrier_depends()     ((void)0)
1788  
1789  /* interrupt control.. */
1790 -#if 0
1791 -#define local_irq_enable() asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory")
1792 -#else
1793  #include <linux/hardirq.h>
1794 +#ifndef CONFIG_COLDFIRE
1795  #define local_irq_enable() ({                                                  \
1796         if (MACH_IS_Q40 || !hardirq_count())                                    \
1797                 asm volatile ("andiw %0,%%sr": : "i" (ALLOWINT) : "memory");    \
1798  })
1799 -#endif
1800  #define local_irq_disable() asm volatile ("oriw  #0x0700,%%sr": : : "memory")
1801 +#else /* CONFIG_COLDFIRE */
1802 +#define local_irq_enable()                                             \
1803 +       asm volatile ("move.w %%sr, %%d0\n\t"                           \
1804 +                     "andil #0xf8ff,%%d0\n\t"                          \
1805 +                     "move.w %%d0, %%sr\n"                             \
1806 +                     : : : "cc", "d0", "memory")
1807 +#define local_irq_disable()                                            \
1808 +       asm volatile ("move %/sr,%%d0\n\t"                              \
1809 +                     "ori.l  #0x0700,%%d0\n\t"                         \
1810 +                     "move %%d0,%/sr\n"                                \
1811 +                     : : : "cc", "%d0", "memory")
1812 +#endif
1813  #define local_save_flags(x) asm volatile ("movew %%sr,%0":"=d" (x) : : "memory")
1814  #define local_irq_restore(x) asm volatile ("movew %0,%%sr": :"d" (x) : "memory")
1815  
1816 --- a/arch/m68k/include/asm/thread_info_mm.h
1817 +++ b/arch/m68k/include/asm/thread_info_mm.h
1818 @@ -10,6 +10,7 @@ struct thread_info {
1819         struct exec_domain      *exec_domain;   /* execution domain */
1820         int                     preempt_count;  /* 0 => preemptable, <0 => BUG */
1821         __u32 cpu; /* should always be 0 on m68k */
1822 +       unsigned long tp_value;
1823         struct restart_block    restart_block;
1824  };
1825  
1826 --- a/arch/m68k/include/asm/tlbflush.h
1827 +++ b/arch/m68k/include/asm/tlbflush.h
1828 @@ -2,7 +2,7 @@
1829  #define _M68K_TLBFLUSH_H
1830  
1831  #ifdef CONFIG_MMU
1832 -#ifndef CONFIG_SUN3
1833 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
1834  
1835  #include <asm/current.h>
1836  
1837 @@ -92,7 +92,12 @@ static inline void flush_tlb_kernel_rang
1838         flush_tlb_all();
1839  }
1840  
1841 -#else
1842 +static inline void flush_tlb_pgtables(struct mm_struct *mm,
1843 +                                     unsigned long start, unsigned long end)
1844 +{
1845 +}
1846 +
1847 +#elif defined(CONFIG_SUN3)
1848  
1849  
1850  /* Reserved PMEGs. */
1851 @@ -214,6 +219,15 @@ static inline void flush_tlb_kernel_page
1852         sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG);
1853  }
1854  
1855 +static inline void flush_tlb_pgtables(struct mm_struct *mm,
1856 +                                     unsigned long start, unsigned long end)
1857 +{
1858 +}
1859 +
1860 +#else /* CONFIG_COLDFIRE */
1861 +
1862 +#include <asm/cf_tlbflush.h>
1863 +
1864  #endif
1865  
1866  #else /* !CONFIG_MMU */
1867 --- a/arch/m68k/include/asm/uaccess_mm.h
1868 +++ b/arch/m68k/include/asm/uaccess_mm.h
1869 @@ -1,6 +1,9 @@
1870  #ifndef __M68K_UACCESS_H
1871  #define __M68K_UACCESS_H
1872  
1873 +#ifdef CONFIG_COLDFIRE
1874 +#include <asm/cf_uaccess.h>
1875 +#else
1876  /*
1877   * User space memory access functions
1878   */
1879 @@ -371,4 +374,5 @@ unsigned long __clear_user(void __user *
1880  
1881  #define strlen_user(str) strnlen_user(str, 32767)
1882  
1883 +#endif /* CONFIG_COLDFIRE */
1884  #endif /* _M68K_UACCESS_H */
1885 --- a/arch/m68k/include/asm/ucontext.h
1886 +++ b/arch/m68k/include/asm/ucontext.h
1887 @@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
1888  
1889  typedef struct fpregset {
1890         int f_fpcntl[3];
1891 +#ifdef __mcoldfire__
1892 +       int f_fpregs[8][2];
1893 +#else
1894         int f_fpregs[8*3];
1895 +#endif
1896  } fpregset_t;
1897  
1898  struct mcontext {
1899 --- a/arch/m68k/include/asm/unistd.h
1900 +++ b/arch/m68k/include/asm/unistd.h
1901 @@ -336,10 +336,14 @@
1902  #define __NR_pwritev           330
1903  #define __NR_rt_tgsigqueueinfo 331
1904  #define __NR_perf_counter_open 332
1905 +#define __NR_read_tp           333
1906 +#define __NR_write_tp          334
1907 +#define __NR_atomic_cmpxchg_32 335
1908 +#define __NR_atomic_barrier    336
1909  
1910  #ifdef __KERNEL__
1911  
1912 -#define NR_syscalls            333
1913 +#define NR_syscalls            337
1914  
1915  #define __ARCH_WANT_IPC_PARSE_VERSION
1916  #define __ARCH_WANT_OLD_READDIR
1917 --- a/arch/m68k/include/asm/virtconvert.h
1918 +++ b/arch/m68k/include/asm/virtconvert.h
1919 @@ -1,6 +1,10 @@
1920  #ifndef __VIRT_CONVERT__
1921  #define __VIRT_CONVERT__
1922  
1923 +#ifdef CONFIG_COLDFIRE
1924 +#include <asm/cf_virtconvert.h>
1925 +#else
1926 +
1927  /*
1928   * Macros used for converting between virtual and physical mappings.
1929   */
1930 @@ -46,3 +50,4 @@ static inline void *phys_to_virt(unsigne
1931  
1932  #endif
1933  #endif
1934 +#endif
1935 --- a/arch/m68k/Kconfig
1936 +++ b/arch/m68k/Kconfig
1937 @@ -12,6 +12,14 @@ config MMU
1938         bool
1939         default y
1940  
1941 +config GENERIC_TIME
1942 +        bool "Enable generic timer"
1943 +        default n
1944 +
1945 +config GENERIC_CLOCKEVENTS
1946 +        bool "Enable generic clockevents"
1947 +        default n
1948 +
1949  config RWSEM_GENERIC_SPINLOCK
1950         bool
1951         default y
1952 @@ -37,7 +45,7 @@ config GENERIC_CALIBRATE_DELAY
1953  
1954  config TIME_LOW_RES
1955         bool
1956 -       default y
1957 +       default n
1958  
1959  config GENERIC_IOMAP
1960         bool
1961 @@ -49,7 +57,7 @@ config ARCH_MAY_HAVE_PC_FDC
1962         default y
1963  
1964  config NO_IOPORT
1965 -       def_bool y
1966 +       def_bool !(M5445X || M547X_8X)
1967  
1968  config NO_DMA
1969         def_bool SUN3
1970 @@ -107,6 +115,35 @@ config PCMCIA
1971           To compile this driver as modules, choose M here: the
1972           modules will be called pcmcia_core and ds.
1973  
1974 +config COLDFIRE
1975 +       bool "ColdFire V4e support"
1976 +       default y
1977 +       select CFV4E
1978 +       help
1979 +         Say Y if you want to build a kernel to run on one of the ColdFire
1980 +         V4e boards.
1981 +
1982 +config CFV4E
1983 +       bool
1984 +       depends on COLDFIRE
1985 +       select MMU_CFV4E if MMU
1986 +       default y
1987 +
1988 +config FPU
1989 +       bool "ColdFire V4e FPU support"
1990 +       default n
1991 +       help
1992 +          This enables support for CFV4E FPU feature.
1993 +
1994 +config MCD_DMA
1995 +       bool "ColdFire MCD DMA support"
1996 +       depends on M547X_8X
1997 +       default y
1998 +       help
1999 +         This enables support for the ColdFire 547x/548x family
2000 +         multichannel DMA support.  Many drivers need it.
2001 +         If you want it, say Y
2002 +
2003  config AMIGA
2004         bool "Amiga support"
2005         select MMU_MOTOROLA if MMU
2006 @@ -124,6 +161,16 @@ config ATARI
2007           this kernel on an Atari, say Y here and browse the material
2008           available in <file:Documentation/m68k>; otherwise say N.
2009  
2010 +config PCI
2011 +       bool "PCI bus support"
2012 +       depends on M54455 || M547X_8X
2013 +       default n
2014 +       help
2015 +         Find out whether you have a PCI motherboard. PCI is the name of a
2016 +         bus system, i.e. the way the CPU talks to the other stuff inside
2017 +         your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or
2018 +         VESA. If you have PCI, say Y, otherwise N.
2019 +
2020  config MAC
2021         bool "Macintosh support"
2022         select MMU_MOTOROLA if MMU
2023 @@ -278,6 +325,118 @@ config M68060
2024           If you anticipate running this kernel on a computer with a MC68060
2025           processor, say Y. Otherwise, say N.
2026  
2027 +config M5445X
2028 +       bool "MCF5445x support"
2029 +       depends on COLDFIRE
2030 +       select GENERIC_TIME
2031 +       select USB_EHCI_FSL
2032 +       select HAVE_FSL_USB_DR
2033 +       help
2034 +          This option will add support for the MCF544x processor with mmu.
2035 +
2036 +config M54451
2037 +       bool
2038 +       depends on M5445X
2039 +       default n
2040 +
2041 +config M54455
2042 +       bool
2043 +       depends on M5445X
2044 +       default n
2045 +
2046 +choice
2047 +       prompt "Model"
2048 +       depends on M5445X
2049 +       default M54451EVB
2050 +       config M54451EVB
2051 +               bool "M54451EVB"
2052 +               select M54451
2053 +       config M54455EVB
2054 +               bool "M54455EVB"
2055 +               select M54455
2056 +endchoice
2057 +
2058 +config HAVE_FSL_USB_DR
2059 +       bool
2060 +       default n
2061 +
2062 +config M547X_8X
2063 +       bool "MCF547x/MCF548x support"
2064 +       depends on COLDFIRE
2065 +       help
2066 +         This option will add support for the MCF547x/MCF548x processor with mmu.
2067 +
2068 +config M547X
2069 +       bool
2070 +       depends on M547X_8X
2071 +       default n
2072 +
2073 +config M548X
2074 +       bool
2075 +       depends on M547X_8X
2076 +       default n
2077 +
2078 +choice
2079 +       prompt "Model"
2080 +       depends on M547X_8X
2081 +       default M5485CFE
2082 +
2083 +config M5475AFE
2084 +       bool "MCF5475AFE"
2085 +       select M547X
2086 +config M5475BFE
2087 +       bool "MCF5475BFE"
2088 +       select M547X
2089 +config M5475CFE
2090 +       bool "MCF5475CFE"
2091 +       select M547X
2092 +config M5475DFE
2093 +       bool "MCF5475DFE"
2094 +       select M547X
2095 +config M5475EFE
2096 +       bool "MCF5475EFE"
2097 +       select M547X
2098 +config M5475FFE
2099 +       bool "MCF5475FFE"
2100 +       select M547X
2101 +config M5485AFE
2102 +       bool "MCF5485AFE"
2103 +       select M548X
2104 +config M5485BFE
2105 +       bool "MCF5485BFE"
2106 +       select M548X
2107 +config M5485CFE
2108 +       bool "MCF5485CFE"
2109 +       select M548X
2110 +config M5485DFE
2111 +       bool "MCF5485DFE"
2112 +       select M548X
2113 +config M5485EFE
2114 +       bool "MCF5485EFE"
2115 +       select M548X
2116 +config M5485FFE
2117 +       bool "MCF5485FFE"
2118 +       select M548X
2119 +
2120 +endchoice
2121 +
2122 +
2123 +config MCFCLK
2124 +       int
2125 +       default 240000000 if M54451EVB
2126 +       default 266666666 if M54455EVB
2127 +       default 266000000 if M547X
2128 +       default 200000000 if M548X
2129 +       help
2130 +         Coldfire System clock.
2131 +
2132 +config MCF_USER_HALT
2133 +       bool "Coldfire User Halt Enable"
2134 +       depends on M5445X || M547X_8X
2135 +       default n
2136 +       help
2137 +         Enables the HALT instruction in User Mode.
2138 +
2139  config MMU_MOTOROLA
2140         bool
2141  
2142 @@ -285,6 +444,70 @@ config MMU_SUN3
2143         bool
2144         depends on MMU && !MMU_MOTOROLA
2145  
2146 +config MMU_CFV4E
2147 +       bool
2148 +
2149 +config SDRAM_BASE
2150 +       hex
2151 +       depends on COLDFIRE
2152 +       default 0x40000000 if M5445X
2153 +       default 0x00000000 if M547X_8X
2154 +
2155 +config SDRAM_SIZE
2156 +       hex
2157 +       depends on COLDFIRE
2158 +       default 0x08000000 if M54451EVB
2159 +       default 0x10000000 if M54455EVB
2160 +       default 0x04000000 if M547X_8X
2161 +
2162 +config NOR_FLASH_BASE
2163 +       hex "NOR Flash Base Address"
2164 +       depends on COLDFIRE
2165 +       default 0x00000000 if M54451EVB
2166 +       default 0x00000000 if M54455EVB
2167 +       default 0xE0000000 if M547X_8X
2168 +
2169 +config DMA_BASE
2170 +       hex
2171 +       depends on COLDFIRE
2172 +       default 0xef000000
2173 +
2174 +config DMA_SIZE
2175 +       hex
2176 +       depends on COLDFIRE
2177 +       default 0x1000000 if M5445X
2178 +       default 0x800000 if M547X_8X
2179 +
2180 +config SRAM
2181 +       bool "SRAM allocation APIs support on mcfv4 platform"
2182 +       depends on COLDFIRE && M5445X
2183 +       default y
2184 +       select GENERIC_ALLOCATOR
2185 +
2186 +config SRAM_BASE
2187 +       hex
2188 +       depends on COLDFIRE && SRAM
2189 +       default 0x8ff00000 if M5445X
2190 +
2191 +config SRAM_SIZE
2192 +       hex
2193 +       depends on COLDFIRE && SRAM
2194 +       default 0x8000 if M5445X
2195 +
2196 +config SRAM_ALLOC_GRANULARITY
2197 +       hex
2198 +       depends on SRAM
2199 +       default 0x200 if M5445X
2200 +
2201 +config VDSO
2202 +       bool "Support VDSO page"
2203 +       depends on MMU
2204 +       default n
2205 +       help
2206 +         This will enable support for the kernel mapping a vDSO page
2207 +         in process space, and subsequently handing down the entry point
2208 +         to the libc through the ELF auxiliary vector.
2209 +
2210  config M68KFPU_EMU
2211         bool "Math emulation support (EXPERIMENTAL)"
2212         depends on EXPERIMENTAL
2213 @@ -451,6 +674,14 @@ config ZONE_DMA
2214  source "drivers/pci/Kconfig"
2215  
2216  source "drivers/zorro/Kconfig"
2217 +endmenu
2218 +
2219 +menu "Power management options"
2220 +
2221 +config PM
2222 +       bool "Power Management support"
2223 +       help
2224 +         Support processor power management modes
2225  
2226  endmenu
2227  
2228 @@ -589,7 +820,7 @@ config DN_SERIAL
2229  
2230  config SERIAL_CONSOLE
2231         bool "Support for serial port console"
2232 -       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)
2233 +       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)
2234         ---help---
2235           If you say Y here, it will be possible to use a serial port as the
2236           system console (the system console is the device which receives all
2237 @@ -612,6 +843,8 @@ config SERIAL_CONSOLE
2238  
2239  endmenu
2240  
2241 +source "kernel/time/Kconfig"
2242 +
2243  source "fs/Kconfig"
2244  
2245  source "arch/m68k/Kconfig.debug"
2246 --- a/arch/m68k/kernel/asm-offsets.c
2247 +++ b/arch/m68k/kernel/asm-offsets.c
2248 @@ -2,6 +2,11 @@
2249   * This program is used to generate definitions needed by
2250   * assembly language modules.
2251   *
2252 + * Copyright Freescale Semiconductor, Inc. 2008-2009
2253 + *  Jason Jin Jason.Jin@freescale.com
2254 + *  Shrek Wu B16972@freescale.com
2255 + *  Add Codlfire support
2256 + *
2257   * We use the technique used in the OSF Mach kernel code:
2258   * generate asm statements containing #defines,
2259   * compile this file to assembler, and then extract the
2260 @@ -56,8 +61,15 @@ int main(void)
2261         DEFINE(PT_A2, offsetof(struct pt_regs, a2));
2262         DEFINE(PT_PC, offsetof(struct pt_regs, pc));
2263         DEFINE(PT_SR, offsetof(struct pt_regs, sr));
2264 +#ifdef CONFIG_COLDFIRE
2265 +       /* Need to get the context out of struct mm for ASID setting */
2266 +       DEFINE(MM_CONTEXT, offsetof(struct mm_struct, context));
2267 +       /* Coldfire exception frame has vector *before* pc */
2268 +       DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) - 4);
2269 +#else
2270         /* bitfields are a bit difficult */
2271         DEFINE(PT_VECTOR, offsetof(struct pt_regs, pc) + 4);
2272 +#endif
2273  
2274         /* offsets into the irq_handler struct */
2275         DEFINE(IRQ_HANDLER, offsetof(struct irq_node, handler));
2276 --- a/arch/m68k/kernel/dma.c
2277 +++ b/arch/m68k/kernel/dma.c
2278 @@ -1,4 +1,7 @@
2279  /*
2280 + * Copyright Freescale Semiconductor, Inc. 2008, 2009
2281 + *    Jason Jin Jason.Jin@freescale.com
2282 + *    Shrek Wu B16972@freescale.com
2283   * This file is subject to the terms and conditions of the GNU General Public
2284   * License.  See the file COPYING in the main directory of this archive
2285   * for more details.
2286 @@ -11,12 +14,24 @@
2287  #include <linux/kernel.h>
2288  #include <linux/scatterlist.h>
2289  #include <linux/vmalloc.h>
2290 -
2291 +#include <linux/pci.h>
2292  #include <asm/pgalloc.h>
2293  
2294  void *dma_alloc_coherent(struct device *dev, size_t size,
2295                          dma_addr_t *handle, gfp_t flag)
2296  {
2297 +#if defined(CONFIG_M5445X) | defined(CONFIG_M547X_8X)
2298 +        /*
2299 +       * On the M5445x platform the memory allocated with GFP_DMA
2300 +       * is guaranteed to be DMA'able.
2301 +       */
2302 +        void *addr;
2303 +
2304 +        size = PAGE_ALIGN(size);
2305 +        addr = kmalloc(size, GFP_DMA);
2306 +        *handle = virt_to_phys(addr);
2307 +        return addr;
2308 +#else
2309         struct page *page, **map;
2310         pgprot_t pgprot;
2311         void *addr;
2312 @@ -55,6 +70,7 @@ void *dma_alloc_coherent(struct device *
2313         kfree(map);
2314  
2315         return addr;
2316 +#endif
2317  }
2318  EXPORT_SYMBOL(dma_alloc_coherent);
2319  
2320 @@ -62,7 +78,11 @@ void dma_free_coherent(struct device *de
2321                        void *addr, dma_addr_t handle)
2322  {
2323         pr_debug("dma_free_coherent: %p, %x\n", addr, handle);
2324 +#if defined(CONFIG_M5445X) | defined(CONFIG_M547X_8X)
2325 +       kfree(addr);
2326 +#else
2327         vfree(addr);
2328 +#endif
2329  }
2330  EXPORT_SYMBOL(dma_free_coherent);
2331  
2332 @@ -88,9 +108,16 @@ void dma_sync_sg_for_device(struct devic
2333                             enum dma_data_direction dir)
2334  {
2335         int i;
2336 +#ifdef CONFIG_COLDFIRE
2337 +       struct scatterlist *_sg;
2338  
2339 +       for_each_sg(sg, _sg, nents, i)
2340 +               dma_sync_single_for_device(dev, _sg->dma_address,
2341 +                               _sg->length, dir);
2342 +#else
2343         for (i = 0; i < nents; sg++, i++)
2344                 dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
2345 +#endif
2346  }
2347  EXPORT_SYMBOL(dma_sync_sg_for_device);
2348  
2349 @@ -119,10 +146,19 @@ int dma_map_sg(struct device *dev, struc
2350                enum dma_data_direction dir)
2351  {
2352         int i;
2353 -
2354 +#ifdef CONFIG_COLDFIRE
2355 +       struct scatterlist *_sg;
2356 +#endif
2357 +#ifndef CONFIG_COLDFIRE
2358         for (i = 0; i < nents; sg++, i++) {
2359                 sg->dma_address = sg_phys(sg);
2360                 dma_sync_single_for_device(dev, sg->dma_address, sg->length, dir);
2361 +#else
2362 +       for_each_sg(sg, _sg, nents, i) {
2363 +               _sg->dma_address = sg_phys(_sg);
2364 +               dma_sync_single_for_device(dev, _sg->dma_address,
2365 +                               _sg->length, dir);
2366 +#endif
2367         }
2368         return nents;
2369  }
2370 --- a/arch/m68k/kernel/Makefile
2371 +++ b/arch/m68k/kernel/Makefile
2372 @@ -2,16 +2,26 @@
2373  # Makefile for the linux kernel.
2374  #
2375  
2376 -ifndef CONFIG_SUN3
2377 -  extra-y := head.o
2378 +ifdef CONFIG_SUN3
2379 +  extra-y := sun3-head.o vmlinux.lds
2380 +  obj-y := entry.o signal.o ints.o time.o
2381  else
2382 -  extra-y := sun3-head.o
2383 +ifndef CONFIG_COLDFIRE
2384 +  extra-y := head.o vmlinux.lds
2385 +  obj-y := entry.o signal.o traps.o ints.o time.o
2386 +else   # CONFIG_COLDFIRE
2387 +  extra-y := vmlinux.lds
2388 +  ifdef CONFIG_M547X_8X
2389 +  obj-$(CONFIG_PCI) += bios32_mcf548x.o
2390 +  endif
2391 +endif
2392  endif
2393 -extra-y        += vmlinux.lds
2394  
2395 -obj-y  := entry.o process.o traps.o ints.o signal.o ptrace.o module.o \
2396 -          sys_m68k.o time.o setup.o m68k_ksyms.o devres.o
2397 +obj-y  += process.o ptrace.o module.o \
2398 +          sys_m68k.o setup.o m68k_ksyms.o devres.o# semaphore.o
2399  
2400  devres-y = ../../../kernel/irq/devres.o
2401  
2402  obj-y$(CONFIG_MMU_SUN3) += dma.o       # no, it's not a typo
2403 +
2404 +EXTRA_AFLAGS := -traditional
2405 --- a/arch/m68k/kernel/process.c
2406 +++ b/arch/m68k/kernel/process.c
2407 @@ -4,6 +4,11 @@
2408   *  Copyright (C) 1995  Hamish Macdonald
2409   *
2410   *  68060 fixes by Jesper Skov
2411 + *
2412 + *  Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved.
2413 + *  Kurt.Mahan@freescale.com
2414 + *  Jason Jin Jason.Jin@freescale.com
2415 + *  Shrek Wu B16972@freescale.com
2416   */
2417  
2418  /*
2419 @@ -186,12 +191,21 @@ EXPORT_SYMBOL(kernel_thread);
2420  void flush_thread(void)
2421  {
2422         unsigned long zero = 0;
2423 +#if !defined(CONFIG_COLDFIRE)
2424         set_fs(USER_DS);
2425         current->thread.fs = __USER_DS;
2426         if (!FPU_IS_EMU)
2427                 asm volatile (".chip 68k/68881\n\t"
2428                               "frestore %0@\n\t"
2429                               ".chip 68k" : : "a" (&zero));
2430 +#else
2431 +       set_fs(USER_DS);
2432 +       current->thread.fs = USER_DS;
2433 +#if defined(CONFIG_FPU)
2434 +       if (!FPU_IS_EMU)
2435 +               asm volatile ("frestore %0@\n\t" : : "a" (&zero));
2436 +#endif
2437 +#endif
2438  }
2439  
2440  /*
2441 @@ -251,10 +265,15 @@ int copy_thread(unsigned long clone_flag
2442  
2443         p->thread.usp = usp;
2444         p->thread.ksp = (unsigned long)childstack;
2445 +
2446 +       if (clone_flags & CLONE_SETTLS)
2447 +               task_thread_info(p)->tp_value = regs->d5;
2448 +
2449         /*
2450          * Must save the current SFC/DFC value, NOT the value when
2451          * the parent was last descheduled - RGH  10-08-96
2452          */
2453 +#if !defined(CONFIG_COLDFIRE)
2454         p->thread.fs = get_fs().seg;
2455  
2456         if (!FPU_IS_EMU) {
2457 @@ -266,9 +285,34 @@ int copy_thread(unsigned long clone_flag
2458                                 "fmoveml %/fpiar/%/fpcr/%/fpsr,%1"
2459                                 : : "m" (p->thread.fp[0]), "m" (p->thread.fpcntl[0])
2460                                 : "memory");
2461 +#else
2462 +       p->thread.fs = get_fs();
2463 +
2464 +#if defined(CONFIG_FPU)
2465 +       if (!FPU_IS_EMU) {
2466 +               /* Copy the current fpu state */
2467 +               asm volatile ("fsave %0" : : "m" (p->thread.fpstate[0])
2468 +                             : "memory");
2469 +
2470 +               if (p->thread.fpstate[0]) {
2471 +                       asm volatile ("fmovemd %/fp0-%/fp7,%0"
2472 +                                     : : "m" (p->thread.fp[0])
2473 +                                     : "memory");
2474 +                       asm volatile ("fmovel %/fpiar,%0"
2475 +                                     : : "m" (p->thread.fpcntl[0])
2476 +                                     : "memory");
2477 +                       asm volatile ("fmovel %/fpcr,%0"
2478 +                                     : : "m" (p->thread.fpcntl[1])
2479 +                                     : "memory");
2480 +                       asm volatile ("fmovel %/fpsr,%0"
2481 +                                     : : "m" (p->thread.fpcntl[2])
2482 +                                     : "memory");
2483 +               }
2484                 /* Restore the state in case the fpu was busy */
2485                 asm volatile ("frestore %0" : : "m" (p->thread.fpstate[0]));
2486         }
2487 +#endif
2488 +#endif
2489  
2490         return 0;
2491  }
2492 @@ -277,7 +321,9 @@ int copy_thread(unsigned long clone_flag
2493  
2494  int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
2495  {
2496 +#if !defined(CONFIG_COLDFIRE) || defined(CONFIG_FPU)
2497         char fpustate[216];
2498 +#endif
2499  
2500         if (FPU_IS_EMU) {
2501                 int i;
2502 @@ -294,6 +340,7 @@ int dump_fpu (struct pt_regs *regs, stru
2503         }
2504  
2505         /* First dump the fpu context to avoid protocol violation.  */
2506 +#if !defined(CONFIG_COLDFIRE)
2507         asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
2508         if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
2509                 return 0;
2510 @@ -304,6 +351,25 @@ int dump_fpu (struct pt_regs *regs, stru
2511         asm volatile ("fmovemx %/fp0-%/fp7,%0"
2512                 :: "m" (fpu->fpregs[0])
2513                 : "memory");
2514 +#elif defined(CONFIG_FPU)
2515 +       asm volatile ("fsave %0" :: "m" (fpustate[0]) : "memory");
2516 +       if (!CPU_IS_060 ? !fpustate[0] : !fpustate[2])
2517 +               return 0;
2518 +
2519 +       asm volatile ("fmovel %/fpiar,%0"
2520 +                     : : "m" (fpu->fpcntl[0])
2521 +                     : "memory");
2522 +       asm volatile ("fmovel %/fpcr,%0"
2523 +                     : : "m" (fpu->fpcntl[1])
2524 +                     : "memory");
2525 +       asm volatile ("fmovel %/fpsr,%0"
2526 +                     : : "m" (fpu->fpcntl[2])
2527 +                     : "memory");
2528 +       asm volatile ("fmovemd %/fp0-%/fp7,%0"
2529 +                     : : "m" (fpu->fpregs[0])
2530 +                     : "memory");
2531 +#endif
2532 +
2533         return 1;
2534  }
2535  EXPORT_SYMBOL(dump_fpu);
2536 --- a/arch/m68k/kernel/ptrace.c
2537 +++ b/arch/m68k/kernel/ptrace.c
2538 @@ -265,6 +265,11 @@ long arch_ptrace(struct task_struct *chi
2539                         ret = -EFAULT;
2540                 break;
2541  
2542 +       case PTRACE_GET_THREAD_AREA:
2543 +               ret = put_user(task_thread_info(child)->tp_value,
2544 +                               (unsigned long __user *) data);
2545 +               break;
2546 +
2547         default:
2548                 ret = ptrace_request(child, request, addr, data);
2549                 break;
2550 --- a/arch/m68k/kernel/setup.c
2551 +++ b/arch/m68k/kernel/setup.c
2552 @@ -2,6 +2,9 @@
2553   *  linux/arch/m68k/kernel/setup.c
2554   *
2555   *  Copyright (C) 1995  Hamish Macdonald
2556 + *  Copyright Freescale Semiconductor, Inc. 2008, 2009
2557 + *      Jason Jin Jason.Jin@freescale.com
2558 + *      Shrek Wu B16972@freescale.com 
2559   */
2560  
2561  /*
2562 @@ -75,13 +78,24 @@ EXPORT_SYMBOL(m68k_memory);
2563  
2564  struct mem_info m68k_ramdisk;
2565  
2566 +#if !defined(CONFIG_COLDFIRE)
2567  static char m68k_command_line[CL_SIZE];
2568 +#else
2569 +char m68k_command_line[CL_SIZE];
2570 +unsigned long uboot_info_stk;
2571 +EXPORT_SYMBOL(uboot_info_stk);
2572 +#endif
2573  
2574  void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL;
2575  /* machine dependent irq functions */
2576  void (*mach_init_IRQ) (void) __initdata = NULL;
2577  void (*mach_get_model) (char *model);
2578  void (*mach_get_hardware_list) (struct seq_file *m);
2579 +
2580 +#ifdef CONFIG_COLDFIRE
2581 +void (*mach_tick)(void);
2582 +#endif
2583 +
2584  /* machine dependent timer functions */
2585  unsigned long (*mach_gettimeoffset) (void);
2586  int (*mach_hwclk) (int, struct rtc_time*);
2587 @@ -137,13 +151,17 @@ extern void config_hp300(void);
2588  extern void config_q40(void);
2589  extern void config_sun3x(void);
2590  
2591 +#ifdef CONFIG_COLDFIRE
2592 +void coldfire_sort_memrec(void);
2593 +#endif
2594 +
2595  #define MASK_256K 0xfffc0000
2596  
2597  extern void paging_init(void);
2598  
2599  static void __init m68k_parse_bootinfo(const struct bi_record *record)
2600  {
2601 -       while (record->tag != BI_LAST) {
2602 +       while ((record->tag != BI_LAST)) {
2603                 int unknown = 0;
2604                 const unsigned long *data = record->data;
2605  
2606 @@ -203,6 +221,10 @@ static void __init m68k_parse_bootinfo(c
2607                                               record->size);
2608         }
2609  
2610 +#ifdef CONFIG_COLDFIRE
2611 +       coldfire_sort_memrec();
2612 +#endif
2613 +
2614         m68k_realnum_memory = m68k_num_memory;
2615  #ifdef CONFIG_SINGLE_MEMORY_CHUNK
2616         if (m68k_num_memory > 1) {
2617 @@ -215,8 +237,11 @@ static void __init m68k_parse_bootinfo(c
2618  
2619  void __init setup_arch(char **cmdline_p)
2620  {
2621 -       int i;
2622  
2623 +#if !defined(CONFIG_SUN3)
2624 +       int i;
2625 +#endif
2626 +       
2627         /* The bootinfo is located right after the kernel bss */
2628         m68k_parse_bootinfo((const struct bi_record *)_end);
2629  
2630 @@ -230,9 +255,10 @@ void __init setup_arch(char **cmdline_p)
2631          * We should really do our own FPU check at startup.
2632          * [what do we do with buggy 68LC040s? if we have problems
2633          *  with them, we should add a test to check_bugs() below] */
2634 -#ifndef CONFIG_M68KFPU_EMU_ONLY
2635 +#if !defined(CONFIG_M68KFPU_EMU_ONLY) && defined(CONFIG_FPU)
2636         /* clear the fpu if we have one */
2637 -       if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) {
2638 +       if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060|
2639 +                           FPU_CFV4E)) {
2640                 volatile int zero = 0;
2641                 asm volatile ("frestore %0" : : "m" (zero));
2642         }
2643 @@ -320,13 +346,18 @@ void __init setup_arch(char **cmdline_p)
2644                 config_sun3x();
2645                 break;
2646  #endif
2647 +#ifdef CONFIG_COLDFIRE
2648 +       case MACH_CFMMU:
2649 +               config_coldfire();
2650 +               break;
2651 +#endif
2652         default:
2653                 panic("No configuration setup");
2654         }
2655  
2656         paging_init();
2657  
2658 -#ifndef CONFIG_SUN3
2659 +#if !defined(CONFIG_SUN3)
2660         for (i = 1; i < m68k_num_memory; i++)
2661                 free_bootmem_node(NODE_DATA(i), m68k_memory[i].addr,
2662                                   m68k_memory[i].size);
2663 @@ -353,6 +384,10 @@ void __init setup_arch(char **cmdline_p)
2664  
2665  #endif /* !CONFIG_SUN3 */
2666  
2667 +#ifdef CONFIG_COLDFIRE
2668 +       mmu_context_init();
2669 +#endif
2670 +
2671  /* set ISA defs early as possible */
2672  #if defined(CONFIG_ISA) && defined(MULTI_ISA)
2673         if (MACH_IS_Q40) {
2674 @@ -383,6 +418,7 @@ static int show_cpuinfo(struct seq_file
2675  #define LOOP_CYCLES_68030      (8)
2676  #define LOOP_CYCLES_68040      (3)
2677  #define LOOP_CYCLES_68060      (1)
2678 +#define LOOP_CYCLES_COLDFIRE   (2)
2679  
2680         if (CPU_IS_020) {
2681                 cpu = "68020";
2682 @@ -396,6 +432,9 @@ static int show_cpuinfo(struct seq_file
2683         } else if (CPU_IS_060) {
2684                 cpu = "68060";
2685                 clockfactor = LOOP_CYCLES_68060;
2686 +       } else if (CPU_IS_CFV4E) {
2687 +               cpu = "ColdFire V4e";
2688 +               clockfactor = LOOP_CYCLES_COLDFIRE;
2689         } else {
2690                 cpu = "680x0";
2691                 clockfactor = 0;
2692 @@ -414,6 +453,8 @@ static int show_cpuinfo(struct seq_file
2693                 fpu = "68060";
2694         else if (m68k_fputype & FPU_SUNFPA)
2695                 fpu = "Sun FPA";
2696 +       else if (m68k_fputype & FPU_CFV4E)
2697 +               fpu = "ColdFire V4e";
2698         else
2699                 fpu = "none";
2700  #endif
2701 @@ -430,6 +471,8 @@ static int show_cpuinfo(struct seq_file
2702                 mmu = "Sun-3";
2703         else if (m68k_mmutype & MMU_APOLLO)
2704                 mmu = "Apollo";
2705 +       else if (m68k_mmutype & MMU_CFV4E)
2706 +               mmu = "ColdFire";
2707         else
2708                 mmu = "unknown";
2709  
2710 @@ -512,7 +555,7 @@ module_init(proc_hardware_init);
2711  
2712  void check_bugs(void)
2713  {
2714 -#ifndef CONFIG_M68KFPU_EMU
2715 +#if !defined(CONFIG_M68KFPU_EMU) && !defined(CONFIG_M5445X)
2716         if (m68k_fputype == 0) {
2717                 printk(KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
2718                         "WHICH IS REQUIRED BY LINUX/M68K ***\n");
2719 --- a/arch/m68k/kernel/sys_m68k.c
2720 +++ b/arch/m68k/kernel/sys_m68k.c
2721 @@ -1,5 +1,8 @@
2722  /*
2723   * linux/arch/m68k/kernel/sys_m68k.c
2724 + * Copyright Freescale Semiconductor, Inc. 2008-2009
2725 + *  Jason Jin Jason.Jin@freescale.com
2726 + *  Shrek Wu B16972@freescale.com
2727   *
2728   * This file contains various random system calls that
2729   * have a non-standard calling sequence on the Linux/m68k
2730 @@ -29,6 +32,14 @@
2731  #include <asm/traps.h>
2732  #include <asm/page.h>
2733  #include <asm/unistd.h>
2734 +#include <linux/elf.h>
2735 +#include <asm/tlb.h>
2736 +#ifdef CONFIG_COLDFIRE
2737 +#include <asm/cacheflush.h>
2738 +#endif
2739 +
2740 +asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
2741 +                       unsigned long error_code);
2742  
2743  /* common code for old and new mmaps */
2744  static inline long do_mmap2(
2745 @@ -240,6 +251,7 @@ asmlinkage int sys_ipc (uint call, int f
2746         return -EINVAL;
2747  }
2748  
2749 +#ifndef CONFIG_COLDFIRE
2750  /* Convert virtual (user) address VADDR to physical address PADDR */
2751  #define virt_to_phys_040(vaddr)                                                \
2752  ({                                                                     \
2753 @@ -563,6 +575,7 @@ cache_flush_060 (unsigned long addr, int
2754      }
2755    return 0;
2756  }
2757 +#endif /* CONFIG_COLDFIRE */
2758  
2759  /* sys_cacheflush -- flush (part of) the processor cache.  */
2760  asmlinkage int
2761 @@ -595,6 +608,7 @@ sys_cacheflush (unsigned long addr, int
2762                         goto out;
2763         }
2764  
2765 +#ifndef CONFIG_COLDFIRE
2766         if (CPU_IS_020_OR_030) {
2767                 if (scope == FLUSH_SCOPE_LINE && len < 256) {
2768                         unsigned long cacr;
2769 @@ -639,6 +653,16 @@ sys_cacheflush (unsigned long addr, int
2770                 ret = cache_flush_060 (addr, scope, cache, len);
2771             }
2772         }
2773 +#else /* CONFIG_COLDFIRE */
2774 +       if ((cache & FLUSH_CACHE_INSN) && (cache & FLUSH_CACHE_DATA))
2775 +               flush_bcache();
2776 +       else if (cache & FLUSH_CACHE_INSN)
2777 +               flush_icache();
2778 +       else
2779 +               flush_dcache();
2780 +
2781 +       ret = 0;
2782 +#endif /* CONFIG_COLDFIRE */
2783  out:
2784         unlock_kernel();
2785         return ret;
2786 @@ -663,3 +687,79 @@ int kernel_execve(const char *filename,
2787                         : "d" (__a), "d" (__b), "d" (__c));
2788         return __res;
2789  }
2790 +
2791 +asmlinkage unsigned long
2792 +sys_read_tp(void)
2793 +{
2794 +       return current_thread_info()->tp_value;
2795 +}
2796 +
2797 +asmlinkage int
2798 +sys_write_tp(unsigned long tp)
2799 +{
2800 +       current_thread_info()->tp_value = tp;
2801 +       return 0;
2802 +}
2803 +
2804 +/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
2805 +   D1 (newval).  */
2806 +asmlinkage int
2807 +sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
2808 +               unsigned long __user *mem)
2809 +{
2810 +       /* This was borrowed from ARM's implementation.  */
2811 +       for (;;) {
2812 +               struct mm_struct *mm = current->mm;
2813 +               pgd_t *pgd; pmd_t *pmd; pte_t *pte;
2814 +               spinlock_t *ptl;
2815 +               unsigned long mem_value;
2816 +
2817 +               down_read(&mm->mmap_sem);
2818 +               pgd = pgd_offset(mm, (unsigned long)mem);
2819 +               if (!pgd_present(*pgd))
2820 +                       goto bad_access;
2821 +               pmd = pmd_offset(pgd, (unsigned long)mem);
2822 +               if (!pmd_present(*pmd))
2823 +                       goto bad_access;
2824 +               pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);
2825 +               if (!pte_present(*pte) || !pte_dirty(*pte)) {
2826 +                       pte_unmap_unlock(pte, ptl);
2827 +                       goto bad_access;
2828 +               }
2829 +
2830 +               mem_value = *mem;
2831 +               if (mem_value == oldval)
2832 +                       *mem = newval;
2833 +
2834 +               pte_unmap_unlock(pte, ptl);
2835 +               up_read(&mm->mmap_sem);
2836 +               return mem_value;
2837 +
2838 +bad_access:
2839 +               up_read(&mm->mmap_sem);
2840 +               /* This is not necessarily a bad access, we can get here if
2841 +                  a memory we're trying to write to should be copied-on-write.
2842 +                  Make the kernel do the necessary page stuff, then re-iterate.
2843 +                  Simulate a write access fault to do that.  */
2844 +               {
2845 +                       /* The first argument of the function corresponds to
2846 +                          D1, which is the first field of struct pt_regs.  */
2847 +                       struct pt_regs *fp = (struct pt_regs *)&newval;
2848 +
2849 +                       /* '3' is an RMW flag.  */
2850 +                       if (do_page_fault(fp, (unsigned long)mem, 3))
2851 +                               /* If the do_page_fault() failed, we don't
2852 +                                  have anything meaningful to return.
2853 +                                  There should be a SIGSEGV pending for
2854 +                                  the process.  */
2855 +                               return 0xdeadbeef;
2856 +               }
2857 +       }
2858 +}
2859 +
2860 +asmlinkage int
2861 +sys_atomic_barrier(void)
2862 +{
2863 +       /* no code needed for uniprocs */
2864 +       return 0;
2865 +}
2866 --- a/arch/m68k/kernel/time.c
2867 +++ b/arch/m68k/kernel/time.c
2868 @@ -2,6 +2,9 @@
2869   *  linux/arch/m68k/kernel/time.c
2870   *
2871   *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
2872 + *  Copyright Freescale Semiconductor, Inc. 2008-2009
2873 + *   Jason Jin Jason.Jin@freescale.com
2874 + *   Shrek Wu B16972@freescale.com
2875   *
2876   * This file contains the m68k-specific time handling details.
2877   * Most of the stuff is located in the machine specific files.
2878 @@ -41,6 +44,11 @@ static inline int set_rtc_mmss(unsigned
2879   */
2880  static irqreturn_t timer_interrupt(int irq, void *dummy)
2881  {
2882 +#ifdef CONFIG_COLDFIRE
2883 +       /* kick hardware timer if necessary */
2884 +       if (mach_tick)
2885 +               mach_tick();
2886 +#endif
2887         do_timer(1);
2888  #ifndef CONFIG_SMP
2889         update_process_times(user_mode(get_irq_regs()));
2890 --- a/arch/m68k/kernel/vmlinux.lds.S
2891 +++ b/arch/m68k/kernel/vmlinux.lds.S
2892 @@ -1,10 +1,13 @@
2893  PHDRS
2894  {
2895 -  text PT_LOAD FILEHDR PHDRS FLAGS (7);
2896 +  headers PT_PHDR PHDRS ;
2897 +  text PT_LOAD FILEHDR PHDRS FLAGS (5);
2898    data PT_LOAD FLAGS (7);
2899  }
2900  #ifdef CONFIG_SUN3
2901  #include "vmlinux-sun3.lds"
2902 +#elif CONFIG_COLDFIRE
2903 +#include "vmlinux-cf.lds"
2904  #else
2905  #include "vmlinux-std.lds"
2906  #endif
2907 --- a/arch/m68k/lib/checksum.c
2908 +++ b/arch/m68k/lib/checksum.c
2909 @@ -30,6 +30,10 @@
2910   * 1998/8/31   Andreas Schwab:
2911   *             Zero out rest of buffer on exception in
2912   *             csum_partial_copy_from_user.
2913 + *
2914 + * Copyright Freescale Semiconductor, Inc. 2008-2009
2915 + *     Jason Jin Jason.Jin@freescale.com
2916 + *     Shrek Wu B16972@freescale.com
2917   */
2918  
2919  #include <linux/module.h>
2920 @@ -39,8 +43,131 @@
2921   * computes a partial checksum, e.g. for TCP/UDP fragments
2922   */
2923  
2924 +#ifdef CONFIG_COLDFIRE
2925 +
2926 +static inline unsigned short from32to16(unsigned long x)
2927 +{
2928 +       /* add up 16-bit and 16-bit for 16+c bit */
2929 +       x = (x & 0xffff) + (x >> 16);
2930 +       /* add up carry.. */
2931 +       x = (x & 0xffff) + (x >> 16);
2932 +       return x;
2933 +}
2934 +
2935 +static unsigned long do_csum(const unsigned char *buff, int len)
2936 +{
2937 +       int odd, count;
2938 +       unsigned long result = 0;
2939 +
2940 +       if (len <= 0)
2941 +               goto out;
2942 +       odd = 1 & (unsigned long) buff;
2943 +       if (odd) {
2944 +               result = *buff;
2945 +               len--;
2946 +               buff++;
2947 +       }
2948 +       count = len >> 1;               /* nr of 16-bit words.. */
2949 +       if (count) {
2950 +               if (2 & (unsigned long) buff) {
2951 +                       result += *(unsigned short *) buff;
2952 +                       count--;
2953 +                       len -= 2;
2954 +                       buff += 2;
2955 +               }
2956 +               count >>= 1;            /* nr of 32-bit words.. */
2957 +               if (count) {
2958 +                       unsigned long carry = 0;
2959 +                       do {
2960 +                               unsigned long w = *(unsigned long *) buff;
2961 +                               count--;
2962 +                               buff += 4;
2963 +                               result += carry;
2964 +                               result += w;
2965 +                               carry = (w > result);
2966 +                       } while (count);
2967 +                       result += carry;
2968 +                       result = (result & 0xffff) + (result >> 16);
2969 +               }
2970 +               if (len & 2) {
2971 +                       result += *(unsigned short *) buff;
2972 +                       buff += 2;
2973 +               }
2974 +       }
2975 +       if (len & 1)
2976 +               result += (*buff << 8);
2977 +       result = from32to16(result);
2978 +       if (odd)
2979 +               result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
2980 +out:
2981 +       return result;
2982 +}
2983 +
2984 +/*
2985 + *     This is a version of ip_compute_csum() optimized for IP headers,
2986 + *     which always checksum on 4 octet boundaries.
2987 + */
2988 +__sum16 ip_fast_csum(const void *iph, unsigned int ihl)
2989 +{
2990 +       return ~do_csum(iph, ihl*4);
2991 +}
2992 +EXPORT_SYMBOL(ip_fast_csum);
2993 +
2994 +/*
2995 + * computes the checksum of a memory block at buff, length len,
2996 + * and adds in "sum" (32-bit)
2997 + *
2998 + * returns a 32-bit number suitable for feeding into itself
2999 + * or csum_tcpudp_magic
3000 + *
3001 + * this function must be called with even lengths, except
3002 + * for the last fragment, which may be odd
3003 + *
3004 + * it's best to have buff aligned on a 32-bit boundary
3005 + */
3006  __wsum csum_partial(const void *buff, int len, __wsum sum)
3007  {
3008 +       unsigned int result = do_csum(buff, len);
3009 +
3010 +       /* add in old sum, and carry.. */
3011 +       result += sum;
3012 +       if (sum > result)
3013 +               result += 1;
3014 +       return result;
3015 +}
3016 +EXPORT_SYMBOL(csum_partial);
3017 +
3018 +/*
3019 + * copy from fs while checksumming, otherwise like csum_partial
3020 + */
3021 +
3022 +__wsum
3023 +csum_partial_copy_from_user(const void __user *src, void *dst, int len,
3024 +                           __wsum sum, int *csum_err)
3025 +{
3026 +       if (csum_err) *csum_err = 0;
3027 +       memcpy(dst, src, len);
3028 +       return csum_partial(dst, len, sum);
3029 +}
3030 +EXPORT_SYMBOL(csum_partial_copy_from_user);
3031 +
3032 +/*
3033 + * copy from ds while checksumming, otherwise like csum_partial
3034 + */
3035 +
3036 +__wsum
3037 +csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
3038 +{
3039 +       memcpy(dst, src, len);
3040 +       return csum_partial(dst, len, sum);
3041 +}
3042 +EXPORT_SYMBOL(csum_partial_copy_nocheck);
3043 +
3044 +#else /* !CONFIG_COLDFIRE */
3045 +
3046 +unsigned int
3047 +csum_partial(const unsigned char *buff, int len, unsigned int sum)
3048 +{
3049         unsigned long tmp1, tmp2;
3050           /*
3051            * Experiments with ethernet and slip connections show that buff
3052 @@ -423,3 +550,4 @@ csum_partial_copy_nocheck(const void *sr
3053      return(sum);
3054  }
3055  EXPORT_SYMBOL(csum_partial_copy_nocheck);
3056 +#endif /* CONFIG_COLDFIRE */
3057 --- a/arch/m68k/lib/muldi3.c
3058 +++ b/arch/m68k/lib/muldi3.c
3059 @@ -1,6 +1,9 @@
3060  /* muldi3.c extracted from gcc-2.7.2.3/libgcc2.c and
3061                            gcc-2.7.2.3/longlong.h which is: */
3062  /* Copyright (C) 1989, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3063 +   Copyright Freescale Semiconductor, Inc. 2008-2009
3064 +       Jason Jin Jason.Jin@freescale.com
3065 +       Shrek Wu B16972@freescale.com
3066  
3067  This file is part of GNU CC.
3068  
3069 @@ -21,12 +24,22 @@ Boston, MA 02111-1307, USA.  */
3070  
3071  #define BITS_PER_UNIT 8
3072  
3073 +#ifdef CONFIG_COLDFIRE
3074 +#define umul_ppmm(w1, w0, u, v) \
3075 +  do { \
3076 +       unsigned long long x; \
3077 +       x = (unsigned long long)u * v; \
3078 +       w0 = (unsigned long)(x & 0x00000000ffffffff); \
3079 +       w1 = (unsigned long)(x & 0xffffffff00000000) >> 32; \
3080 +     } while (0)
3081 +#else /* CONFIG_COLDFIRE */
3082  #define umul_ppmm(w1, w0, u, v) \
3083    __asm__ ("mulu%.l %3,%1:%0"                                          \
3084             : "=d" ((USItype)(w0)),                                     \
3085               "=d" ((USItype)(w1))                                      \
3086             : "%0" ((USItype)(u)),                                      \
3087               "dmi" ((USItype)(v)))
3088 +#endif /* CONFIG_COLDFIRE */
3089  
3090  #define __umulsidi3(u, v) \
3091    ({DIunion __w;                                                       \
3092 --- a/arch/m68k/lib/string.c
3093 +++ b/arch/m68k/lib/string.c
3094 @@ -1,4 +1,8 @@
3095  /*
3096 + * Copyright Freescale Semiconductor, Inc. 2008-2009
3097 + *  * Jason Jin Jason.Jin@freescale.com
3098 + *    Shrek Wu B16972@freescale.com
3099 + *
3100   * This file is subject to the terms and conditions of the GNU General Public
3101   * License.  See the file COPYING in the main directory of this archive
3102   * for more details.
3103 @@ -21,6 +25,7 @@ char *strcat(char *dest, const char *src
3104  }
3105  EXPORT_SYMBOL(strcat);
3106  
3107 +#ifndef CONFIG_COLDFIRE
3108  void *memset(void *s, int c, size_t count)
3109  {
3110         void *xs = s;
3111 @@ -149,6 +154,69 @@ void *memcpy(void *to, const void *from,
3112  }
3113  EXPORT_SYMBOL(memcpy);
3114  
3115 +#else /* CONFIG_COLDFIRE */
3116 +
3117 +void *memset(void *s, int c, size_t count)
3118 +{
3119 +  unsigned long x;
3120 +  void *originalTo = s;
3121 +
3122 +  for (x = 0; x < count; x++)
3123 +    *(unsigned char *)s++ = (unsigned char)c;
3124 +
3125 +  return originalTo;
3126 +}
3127 +EXPORT_SYMBOL(memset);
3128 +
3129 +void *memcpy(void *to, const void *from, size_t n)
3130 +{
3131 +  void *xto = to;
3132 +  size_t temp;
3133 +
3134 +  if (!n)
3135 +    return xto;
3136 +  if ((long) to & 1) {
3137 +      char *cto = to;
3138 +      const char *cfrom = from;
3139 +      *cto++ = *cfrom++;
3140 +      to = cto;
3141 +      from = cfrom;
3142 +      n--;
3143 +    }
3144 +  if (n > 2 && (long) to & 2) {
3145 +      short *sto = to;
3146 +      const short *sfrom = from;
3147 +      *sto++ = *sfrom++;
3148 +      to = sto;
3149 +      from = sfrom;
3150 +      n -= 2;
3151 +    }
3152 +  temp = n >> 2;
3153 +  if (temp) {
3154 +      long *lto = to;
3155 +      const long *lfrom = from;
3156 +      for (; temp; temp--)
3157 +       *lto++ = *lfrom++;
3158 +      to = lto;
3159 +      from = lfrom;
3160 +    }
3161 +  if (n & 2) {
3162 +      short *sto = to;
3163 +      const short *sfrom = from;
3164 +      *sto++ = *sfrom++;
3165 +      to = sto;
3166 +      from = sfrom;
3167 +    }
3168 +  if (n & 1) {
3169 +      char *cto = to;
3170 +      const char *cfrom = from;
3171 +      *cto = *cfrom;
3172 +    }
3173 +  return xto;
3174 +}
3175 +EXPORT_SYMBOL(memcpy);
3176 +#endif /* CONFIG_COLDFIRE */
3177 +
3178  void *memmove(void *dest, const void *src, size_t n)
3179  {
3180         void *xdest = dest;
3181 --- a/arch/m68k/lib/uaccess.c
3182 +++ b/arch/m68k/lib/uaccess.c
3183 @@ -1,10 +1,15 @@
3184  /*
3185 + * Copyright Freescale Semiconductor, Inc. 2008-2009
3186 + *    Jason Jin Jason.Jin@freescale.com
3187 + *    Shrek Wu B16972@freescale.com
3188 + *
3189   * This file is subject to the terms and conditions of the GNU General Public
3190   * License.  See the file COPYING in the main directory of this archive
3191   * for more details.
3192   */
3193  
3194  #include <linux/module.h>
3195 +#ifndef CONFIG_COLDFIRE
3196  #include <asm/uaccess.h>
3197  
3198  unsigned long __generic_copy_from_user(void *to, const void __user *from,
3199 @@ -220,3 +225,244 @@ unsigned long __clear_user(void __user *
3200      return res;
3201  }
3202  EXPORT_SYMBOL(__clear_user);
3203 +
3204 +#else /* CONFIG_COLDFIRE */
3205 +
3206 +#include <asm/cf_uaccess.h>
3207 +
3208 +unsigned long __generic_copy_from_user(void *to, const void *from,
3209 +               unsigned long n)
3210 +{
3211 +    unsigned long tmp;
3212 +    __asm__ __volatile__
3213 +       ("   tstl %2\n"
3214 +        "   jeq 2f\n"
3215 +        "1: movel (%1)+,%3\n"
3216 +        "   movel %3,(%0)+\n"
3217 +        "   subql #1,%2\n"
3218 +        "   jne 1b\n"
3219 +        "2: movel %4,%2\n"
3220 +        "   bclr #1,%2\n"
3221 +        "   jeq 4f\n"
3222 +        "3: movew (%1)+,%3\n"
3223 +        "   movew %3,(%0)+\n"
3224 +        "4: bclr #0,%2\n"
3225 +        "   jeq 6f\n"
3226 +        "5: moveb (%1)+,%3\n"
3227 +        "   moveb %3,(%0)+\n"
3228 +        "6:\n"
3229 +        ".section .fixup,\"ax\"\n"
3230 +        "   .even\n"
3231 +        "7: movel %2,%%d0\n"
3232 +        "71:clrl (%0)+\n"
3233 +        "   subql #1,%%d0\n"
3234 +        "   jne 71b\n"
3235 +        "   lsll #2,%2\n"
3236 +        "   addl %4,%2\n"
3237 +        "   btst #1,%4\n"
3238 +        "   jne 81f\n"
3239 +        "   btst #0,%4\n"
3240 +        "   jne 91f\n"
3241 +        "   jra 6b\n"
3242 +        "8: addql #2,%2\n"
3243 +        "81:clrw (%0)+\n"
3244 +        "   btst #0,%4\n"
3245 +        "   jne 91f\n"
3246 +        "   jra 6b\n"
3247 +        "9: addql #1,%2\n"
3248 +        "91:clrb (%0)+\n"
3249 +        "   jra 6b\n"
3250 +        ".previous\n"
3251 +        ".section __ex_table,\"a\"\n"
3252 +        "   .align 4\n"
3253 +        "   .long 1b,7b\n"
3254 +        "   .long 3b,8b\n"
3255 +        "   .long 5b,9b\n"
3256 +        ".previous"
3257 +        : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
3258 +        : "d"(n & 3), "0"(to), "1"(from), "2"(n/4)
3259 +        : "d0", "memory");
3260 +    return n;
3261 +}
3262 +EXPORT_SYMBOL(__generic_copy_from_user);
3263 +
3264 +
3265 +unsigned long __generic_copy_to_user(void *to, const void *from,
3266 +               unsigned long n)
3267 +{
3268 +    unsigned long tmp;
3269 +    __asm__ __volatile__
3270 +       ("   tstl %2\n"
3271 +        "   jeq 3f\n"
3272 +        "1: movel (%1)+,%3\n"
3273 +        "22:movel %3,(%0)+\n"
3274 +        "2: subql #1,%2\n"
3275 +        "   jne 1b\n"
3276 +        "3: movel %4,%2\n"
3277 +        "   bclr #1,%2\n"
3278 +        "   jeq 4f\n"
3279 +        "   movew (%1)+,%3\n"
3280 +        "24:movew %3,(%0)+\n"
3281 +        "4: bclr #0,%2\n"
3282 +        "   jeq 5f\n"
3283 +        "   moveb (%1)+,%3\n"
3284 +        "25:moveb %3,(%0)+\n"
3285 +        "5:\n"
3286 +        ".section .fixup,\"ax\"\n"
3287 +        "   .even\n"
3288 +        "60:addql #1,%2\n"
3289 +        "6: lsll #2,%2\n"
3290 +        "   addl %4,%2\n"
3291 +        "   jra 5b\n"
3292 +        "7: addql #2,%2\n"
3293 +        "   jra 5b\n"
3294 +        "8: addql #1,%2\n"
3295 +        "   jra 5b\n"
3296 +        ".previous\n"
3297 +        ".section __ex_table,\"a\"\n"
3298 +        "   .align 4\n"
3299 +        "   .long 1b,60b\n"
3300 +        "   .long 22b,6b\n"
3301 +        "   .long 2b,6b\n"
3302 +        "   .long 24b,7b\n"
3303 +        "   .long 3b,60b\n"
3304 +        "   .long 4b,7b\n"
3305 +        "   .long 25b,8b\n"
3306 +        "   .long 5b,8b\n"
3307 +        ".previous"
3308 +        : "=a"(to), "=a"(from), "=d"(n), "=&d"(tmp)
3309 +        : "r"(n & 3), "0"(to), "1"(from), "2"(n / 4)
3310 +        : "memory");
3311 +    return n;
3312 +}
3313 +EXPORT_SYMBOL(__generic_copy_to_user);
3314 +
3315 +/*
3316 + * Copy a null terminated string from userspace.
3317 + */
3318 +
3319 +long strncpy_from_user(char *dst, const char *src, long count)
3320 +{
3321 +       long res = -EFAULT;
3322 +       if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
3323 +               return res;
3324 +    if (count == 0) return count;
3325 +    __asm__ __volatile__
3326 +       ("1: moveb (%2)+,%%d0\n"
3327 +        "12:moveb %%d0,(%1)+\n"
3328 +        "   jeq 2f\n"
3329 +        "   subql #1,%3\n"
3330 +        "   jne 1b\n"
3331 +        "2: subl %3,%0\n"
3332 +        "3:\n"
3333 +        ".section .fixup,\"ax\"\n"
3334 +        "   .even\n"
3335 +        "4: movel %4,%0\n"
3336 +        "   jra 3b\n"
3337 +        ".previous\n"
3338 +        ".section __ex_table,\"a\"\n"
3339 +        "   .align 4\n"
3340 +        "   .long 1b,4b\n"
3341 +        "   .long 12b,4b\n"
3342 +        ".previous"
3343 +        : "=d"(res), "=a"(dst), "=a"(src), "=d"(count)
3344 +        : "i"(-EFAULT), "0"(count), "1"(dst), "2"(src), "3"(count)
3345 +        : "d0", "memory");
3346 +    return res;
3347 +}
3348 +EXPORT_SYMBOL(strncpy_from_user);
3349 +
3350 +/*
3351 + * Return the size of a string (including the ending 0)
3352 + *
3353 + * Return 0 on exception, a value greater than N if too long
3354 + */
3355 +long strnlen_user(const char *src, long n)
3356 +{
3357 +    long res = -EFAULT;
3358 +    if (!(access_ok(VERIFY_READ, src, 1))) /* --tym-- */
3359 +       return res;
3360 +
3361 +       res = -(long)src;
3362 +       __asm__ __volatile__
3363 +               ("1:\n"
3364 +                "   tstl %2\n"
3365 +                "   jeq 3f\n"
3366 +                "2: moveb (%1)+,%%d0\n"
3367 +                "22:\n"
3368 +                "   subql #1,%2\n"
3369 +                "   tstb %%d0\n"
3370 +                "   jne 1b\n"
3371 +                "   jra 4f\n"
3372 +                "3:\n"
3373 +                "   addql #1,%0\n"
3374 +                "4:\n"
3375 +                "   addl %1,%0\n"
3376 +                "5:\n"
3377 +                ".section .fixup,\"ax\"\n"
3378 +                "   .even\n"
3379 +                "6: moveq %3,%0\n"
3380 +                "   jra 5b\n"
3381 +                ".previous\n"
3382 +                ".section __ex_table,\"a\"\n"
3383 +                "   .align 4\n"
3384 +                "   .long 2b,6b\n"
3385 +                "   .long 22b,6b\n"
3386 +                ".previous"
3387 +                : "=d"(res), "=a"(src), "=d"(n)
3388 +                : "i"(0), "0"(res), "1"(src), "2"(n)
3389 +                : "d0");
3390 +       return res;
3391 +}
3392 +EXPORT_SYMBOL(strnlen_user);
3393 +
3394 +
3395 +/*
3396 + * Zero Userspace
3397 + */
3398 +
3399 +unsigned long __clear_user(void *to, unsigned long n)
3400 +{
3401 +    __asm__ __volatile__
3402 +       ("   tstl %1\n"
3403 +        "   jeq 3f\n"
3404 +        "1: movel %3,(%0)+\n"
3405 +        "2: subql #1,%1\n"
3406 +        "   jne 1b\n"
3407 +        "3: movel %2,%1\n"
3408 +        "   bclr #1,%1\n"
3409 +        "   jeq 4f\n"
3410 +        "24:movew %3,(%0)+\n"
3411 +        "4: bclr #0,%1\n"
3412 +        "   jeq 5f\n"
3413 +        "25:moveb %3,(%0)+\n"
3414 +        "5:\n"
3415 +        ".section .fixup,\"ax\"\n"
3416 +        "   .even\n"
3417 +        "61:addql #1,%1\n"
3418 +        "6: lsll #2,%1\n"
3419 +        "   addl %2,%1\n"
3420 +        "   jra 5b\n"
3421 +        "7: addql #2,%1\n"
3422 +        "   jra 5b\n"
3423 +        "8: addql #1,%1\n"
3424 +        "   jra 5b\n"
3425 +        ".previous\n"
3426 +        ".section __ex_table,\"a\"\n"
3427 +        "   .align 4\n"
3428 +        "   .long 1b,61b\n"
3429 +        "   .long 2b,6b\n"
3430 +        "   .long 3b,61b\n"
3431 +        "   .long 24b,7b\n"
3432 +        "   .long 4b,7b\n"
3433 +        "   .long 25b,8b\n"
3434 +        "   .long 5b,8b\n"
3435 +        ".previous"
3436 +        : "=a"(to), "=d"(n)
3437 +        : "r"(n & 3), "d"(0), "0"(to), "1"(n/4));
3438 +    return n;
3439 +}
3440 +EXPORT_SYMBOL(__clear_user);
3441 +
3442 +#endif /* CONFIG_COLDFIRE */
3443 +
3444 --- a/arch/m68k/Makefile
3445 +++ b/arch/m68k/Makefile
3446 @@ -1,6 +1,8 @@
3447  #
3448  # m68k/Makefile
3449  #
3450 +# Copyright 2007-2009 Freescale Semiconductor, Inc. All Rights Reserved.
3451 +#
3452  # This file is included by the global makefile so that you can add your own
3453  # architecture-specific flags and dependencies. Remember to do have actions
3454  # for "archclean" and "archdep" for cleaning up and making dependencies for
3455 @@ -10,13 +12,13 @@
3456  # License.  See the file "COPYING" in the main directory of this archive
3457  # for more details.
3458  #
3459 -# Copyright (C) 1994 by Hamish Macdonald
3460 -#
3461  
3462 -KBUILD_DEFCONFIG := multi_defconfig
3463 +KBUILD_DEFCONFIG := amiga_defconfig#multi_defconfig
3464  
3465  # override top level makefile
3466 +ifndef CONFIG_COLDFIRE
3467  AS += -m68020
3468 +endif
3469  LDFLAGS := -m m68kelf
3470  LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
3471  ifneq ($(SUBARCH),$(ARCH))
3472 @@ -30,12 +32,18 @@ ifdef CONFIG_SUN3
3473  LDFLAGS_vmlinux = -N
3474  endif
3475  
3476 +ifdef CONFIG_COLDFIRE
3477 +OBJCOPYFLAGS   := -O binary -R .note -R .note.gnu.build-id -R .comment -S
3478 +# LDFLAGS_vmlinux = --verbose
3479 +endif
3480 +
3481  CHECKFLAGS += -D__mc68000__
3482  
3483  # without -fno-strength-reduce the 53c7xx.c driver fails ;-(
3484  KBUILD_CFLAGS += -pipe -fno-strength-reduce -ffixed-a2
3485  
3486  # enable processor switch if compiled only for a single cpu
3487 +ifndef CONFIG_COLDFIRE
3488  ifndef CONFIG_M68020
3489  ifndef CONFIG_M68030
3490  
3491 @@ -49,6 +57,17 @@ endif
3492  
3493  endif
3494  endif
3495 +endif
3496 +
3497 +ifdef CONFIG_M5445X
3498 +KBUILD_CFLAGS += -march=isac -mcpu=54455 -msoft-float -g
3499 +KBUILD_AFLAGS += -march=isac -mcpu=54455 -msoft-float  
3500 +endif
3501 +
3502 +ifdef CONFIG_M547X_8X
3503 +KBUILD_CFLAGS += -mcfv4e -g
3504 +KBUILD_AFLAGS += -mcfv4e
3505 +endif
3506  
3507  ifdef CONFIG_KGDB
3508  # If configured for kgdb support, include debugging infos and keep the
3509 @@ -57,8 +76,12 @@ KBUILD_CFLAGS := $(subst -fomit-frame-po
3510  endif
3511  
3512  ifndef CONFIG_SUN3
3513 +ifndef CONFIG_COLDFIRE
3514  head-y := arch/m68k/kernel/head.o
3515  else
3516 +head-y := arch/m68k/coldfire/common/head.o
3517 +endif
3518 +else
3519  head-y := arch/m68k/kernel/sun3-head.o
3520  endif
3521  
3522 @@ -79,7 +102,20 @@ core-$(CONFIG_SUN3)         += arch/m68k/sun3/
3523  core-$(CONFIG_M68040)          += arch/m68k/fpsp040/
3524  core-$(CONFIG_M68060)          += arch/m68k/ifpsp060/
3525  core-$(CONFIG_M68KFPU_EMU)     += arch/m68k/math-emu/
3526 +core-$(CONFIG_COLDFIRE)                += arch/m68k/coldfire/
3527 +
3528 +ifdef CONFIG_COLDFIRE
3529 +boot := arch/m68k/boot
3530 +
3531 +all:   uImage
3532 +
3533 +zImage zImage.srec uImage uImage.srec vmlinux.srec: vmlinux
3534 +       $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
3535  
3536 +archclean:
3537 +       $(Q)$(MAKE) $(clean)=$(boot)
3538 +
3539 +else
3540  all:   zImage
3541  
3542  lilo:  vmlinux
3543 @@ -117,6 +153,7 @@ endif
3544  
3545  archclean:
3546         rm -f vmlinux.gz vmlinux.bz2
3547 +endif
3548  
3549  install:
3550         sh $(srctree)/arch/m68k/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)"
3551 --- a/arch/m68k/mm/cache.c
3552 +++ b/arch/m68k/mm/cache.c
3553 @@ -4,13 +4,20 @@
3554   *  Instruction cache handling
3555   *
3556   *  Copyright (C) 1995  Hamish Macdonald
3557 + *  Copyright Freescale Semiconductor, Inc. 2008-2009
3558 + *    Jason Jin Jason.Jin@freescale.com
3559 + *    Shrek Wu B16972@freescale.com
3560   */
3561  
3562  #include <linux/module.h>
3563  #include <asm/pgalloc.h>
3564  #include <asm/traps.h>
3565  
3566 +#ifdef CONFIG_COLDFIRE
3567 +#include <asm/cfcache.h>
3568 +#endif /* CONFIG_COLDFIRE */
3569  
3570 +#ifndef CONFIG_COLDFIRE
3571  static unsigned long virt_to_phys_slow(unsigned long vaddr)
3572  {
3573         if (CPU_IS_060) {
3574 @@ -69,11 +76,18 @@ static unsigned long virt_to_phys_slow(u
3575         }
3576         return 0;
3577  }
3578 +#endif /* CONFIG_COLDFIRE */
3579 +
3580  
3581  /* Push n pages at kernel virtual address and clear the icache */
3582  /* RZ: use cpush %bc instead of cpush %dc, cinv %ic */
3583  void flush_icache_range(unsigned long address, unsigned long endaddr)
3584  {
3585 +#ifdef CONFIG_COLDFIRE
3586 +// JKM -- hack until new cpushl stuff is in
3587 +//     cf_icache_flush_range(address, endaddr);
3588 +       flush_icache();
3589 +#else /* !CONFIG_COLDFIRE */
3590  
3591         if (CPU_IS_040_OR_060) {
3592                 address &= PAGE_MASK;
3593 @@ -94,9 +108,11 @@ void flush_icache_range(unsigned long ad
3594                               : "=&d" (tmp)
3595                               : "di" (FLUSH_I));
3596         }
3597 +#endif /* CONFIG_COLDFIRE */
3598  }
3599  EXPORT_SYMBOL(flush_icache_range);
3600  
3601 +#ifndef CONFIG_COLDFIRE
3602  void flush_icache_user_range(struct vm_area_struct *vma, struct page *page,
3603                              unsigned long addr, int len)
3604  {
3605 @@ -115,4 +131,5 @@ void flush_icache_user_range(struct vm_a
3606                               : "di" (FLUSH_I));
3607         }
3608  }
3609 +#endif /* CONFIG_COLDFIRE */
3610  
3611 --- a/arch/m68k/mm/hwtest.c
3612 +++ b/arch/m68k/mm/hwtest.c
3613 @@ -12,6 +12,10 @@
3614   * them here complete with the comments from the original atari
3615   * config.c...
3616   *                -- PMM <pmaydell@chiark.greenend.org.uk>, 05/1998
3617 + *
3618 + * Copyright Freescale Semiconductor, Inc. 2008-2009
3619 + *   Jason Jin Jason.Jin@freescale.com
3620 + *   Shrek Wu B16972@freescale.com
3621   */
3622  
3623  /* This function tests for the presence of an address, specially a
3624 @@ -25,6 +29,7 @@
3625  
3626  #include <linux/module.h>
3627  
3628 +#ifndef CONFIG_COLDFIRE
3629  int hwreg_present( volatile void *regp )
3630  {
3631      int        ret = 0;
3632 @@ -82,4 +87,5 @@ int hwreg_write( volatile void *regp, un
3633         return( ret );
3634  }
3635  EXPORT_SYMBOL(hwreg_write);
3636 +#endif
3637  
3638 --- a/arch/m68k/mm/init.c
3639 +++ b/arch/m68k/mm/init.c
3640 @@ -2,6 +2,9 @@
3641   *  linux/arch/m68k/mm/init.c
3642   *
3643   *  Copyright (C) 1995  Hamish Macdonald
3644 + *  Copyright Freescale Semiconductor, Inc. 2008-2009
3645 + *   Jason Jin Jason.Jin@freescale.com
3646 + *   Shrek Wu B16972@freescale.com
3647   *
3648   *  Contains common initialization routines, specific init code moved
3649   *  to motorola.c and sun3mmu.c
3650 @@ -31,6 +34,10 @@
3651  #include <asm/sections.h>
3652  #include <asm/tlb.h>
3653  
3654 +#ifdef CONFIG_VDSO
3655 +int vdso_init(void);
3656 +#endif
3657 +
3658  DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
3659  
3660  pg_data_t pg_data_map[MAX_NUMNODES];
3661 @@ -88,7 +95,6 @@ void __init mem_init(void)
3662         if (MACH_IS_ATARI)
3663                 atari_stram_mem_init_hook();
3664  #endif
3665 -
3666         /* this will put all memory onto the freelists */
3667         totalram_pages = num_physpages = 0;
3668         for_each_online_pgdat(pgdat) {
3669 @@ -112,7 +118,7 @@ void __init mem_init(void)
3670                 }
3671         }
3672  
3673 -#ifndef CONFIG_SUN3
3674 +#if !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE)
3675         /* insert pointer tables allocated so far into the tablelist */
3676         init_pointer_table((unsigned long)kernel_pg_dir);
3677         for (i = 0; i < PTRS_PER_PGD; i++) {
3678 @@ -131,6 +137,11 @@ void __init mem_init(void)
3679                codepages << (PAGE_SHIFT-10),
3680                datapages << (PAGE_SHIFT-10),
3681                initpages << (PAGE_SHIFT-10));
3682 +
3683 +#ifdef CONFIG_VDSO
3684 +       /* init the vdso page */
3685 +       vdso_init();
3686 +#endif
3687  }
3688  
3689  #ifdef CONFIG_BLK_DEV_INITRD
3690 --- a/arch/m68k/mm/kmap.c
3691 +++ b/arch/m68k/mm/kmap.c
3692 @@ -2,6 +2,9 @@
3693   *  linux/arch/m68k/mm/kmap.c
3694   *
3695   *  Copyright (C) 1997 Roman Hodek
3696 + *  Copyright Freescale Semiconductor, Inc. 2008, 2009
3697 + *      Jason Jin Jason.Jin@freescale.com
3698 + *      Shrek Wu B16972@freescale.com
3699   *
3700   *  10/01/99 cleaned up the code and changing to the same interface
3701   *          used by other architectures                /Roman Zippel
3702 @@ -24,7 +27,11 @@
3703  
3704  #undef DEBUG
3705  
3706 +#ifndef CONFIG_COLDFIRE
3707  #define PTRTREESIZE    (256*1024)
3708 +#else
3709 +#define PTRTREESIZE     PAGE_SIZE
3710 +#endif
3711  
3712  /*
3713   * For 040/060 we can use the virtual memory area like other architectures,
3714 @@ -50,7 +57,11 @@ static inline void free_io_area(void *ad
3715  
3716  #else
3717  
3718 +#ifdef CONFIG_COLDFIRE
3719 +#define IO_SIZE         PAGE_SIZE
3720 +#else
3721  #define IO_SIZE                (256*1024)
3722 +#endif
3723  
3724  static struct vm_struct *iolist;
3725  
3726 @@ -127,8 +138,41 @@ void __iomem *__ioremap(unsigned long ph
3727         }
3728  #endif
3729  
3730 +#ifdef CONFIG_M5445X
3731 +       if (physaddr >= 0xf0000000) {
3732 +               /*
3733 +                * On the M5445x processors an ACR is setup to map
3734 +                * the 0xF0000000 range into kernel memory as
3735 +                * non-cacheable.
3736 +                */
3737 +               return (void __iomem *)physaddr;
3738 +       }
3739 +       if ((physaddr >= KMAP_START) && (physaddr <= KMAP_END)) {
3740 +               /* if physaddr belongs to virtual address range for ioremap,
3741 +                * then return physaddr because it has been ioremapped
3742 +                */
3743 +               return (void __iomem *)physaddr;
3744 +       }
3745 +#endif
3746 +#ifdef CONFIG_M547X_8X
3747 +       if (physaddr >= 0xf0000000) {
3748 +               /*
3749 +               * On the M547x/M548x processors an ACR is setup to map
3750 +               * the 0xF0000000 range into kernel memory as
3751 +               * non-cacheable.
3752 +               */
3753 +               return (void __iomem *)physaddr;
3754 +       }
3755 +
3756 +       if ((physaddr >= 0xd0000000) && (physaddr + size < 0xd800ffff)) {
3757 +               printk(KERN_ERR "ioremap:PCI 0x%lx,0x%lx(%d)"
3758 +                       " - PCI area hit\n", physaddr, size, cacheflag);
3759 +               return (void *)physaddr;
3760 +       }
3761 +#endif
3762  #ifdef DEBUG
3763 -       printk("ioremap: 0x%lx,0x%lx(%d) - ", physaddr, size, cacheflag);
3764 +       printk(KERN_ERR "ioremap: paddr=0x%lx,size=0x%lx(%d) - ",
3765 +                       physaddr, size, cacheflag);
3766  #endif
3767         /*
3768          * Mappings have to be aligned
3769 @@ -147,7 +191,8 @@ void __iomem *__ioremap(unsigned long ph
3770         virtaddr = (unsigned long)area->addr;
3771         retaddr = virtaddr + offset;
3772  #ifdef DEBUG
3773 -       printk("0x%lx,0x%lx,0x%lx", physaddr, virtaddr, retaddr);
3774 +       printk(KERN_ERR " paddr=0x%lx,vaddr=0x%lx,retaddr=0x%lx",
3775 +                       physaddr, virtaddr, retaddr);
3776  #endif
3777  
3778         /*
3779 @@ -172,7 +217,12 @@ void __iomem *__ioremap(unsigned long ph
3780                         break;
3781                 }
3782         } else {
3783 +#ifndef CONFIG_COLDFIRE
3784                 physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY);
3785 +#else
3786 +               physaddr |= (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \
3787 +                            _PAGE_READWRITE);
3788 +#endif
3789                 switch (cacheflag) {
3790                 case IOMAP_NOCACHE_SER:
3791                 case IOMAP_NOCACHE_NONSER:
3792 @@ -252,6 +302,13 @@ void __iounmap(void *addr, unsigned long
3793         pmd_t *pmd_dir;
3794         pte_t *pte_dir;
3795  
3796 +#ifdef CONFIG_M547X_8X
3797 +       if ((addr >= (void *)0xd0000000)
3798 +               && (addr + size < (void *)0xd800ffff)) {
3799 +               printk(KERN_ERR "%s: PCI address\n", __func__);
3800 +               return;
3801 +       }
3802 +#endif
3803         while ((long)size > 0) {
3804                 pgd_dir = pgd_offset_k(virtaddr);
3805                 if (pgd_bad(*pgd_dir)) {
3806 --- a/arch/m68k/mm/Makefile
3807 +++ b/arch/m68k/mm/Makefile
3808 @@ -6,3 +6,5 @@ obj-y           := cache.o init.o fault.o hwtest.
3809  
3810  obj-$(CONFIG_MMU_MOTOROLA)     += kmap.o memory.o motorola.o
3811  obj-$(CONFIG_MMU_SUN3)         += sun3kmap.o sun3mmu.o
3812 +obj-$(CONFIG_MMU_CFV4E)                += cf-mmu.o kmap.o memory.o
3813 +obj-$(CONFIG_SRAM)             += cf-sram.o
3814 --- a/arch/m68k/mm/memory.c
3815 +++ b/arch/m68k/mm/memory.c
3816 @@ -2,6 +2,10 @@
3817   *  linux/arch/m68k/mm/memory.c
3818   *
3819   *  Copyright (C) 1995  Hamish Macdonald
3820 + *  Copyright Freescale Semiconductor, Inc. 2008-2009
3821 + *    Jason Jin Jason.Jin@freescale.com
3822 + *    Shrek Wu B16972@freescale.com
3823 + *
3824   */
3825  
3826  #include <linux/module.h>
3827 @@ -127,6 +131,7 @@ int free_pointer_table (pmd_t *ptable)
3828         return 0;
3829  }
3830  
3831 +#ifndef CONFIG_COLDFIRE
3832  /* invalidate page in both caches */
3833  static inline void clear040(unsigned long paddr)
3834  {
3835 @@ -173,6 +178,7 @@ static inline void pushcl040(unsigned lo
3836                 clear040(paddr);
3837         local_irq_restore(flags);
3838  }
3839 +#endif /* CONFIG_COLDFIRE */
3840  
3841  /*
3842   * 040: Hit every page containing an address in the range paddr..paddr+len-1.
3843 @@ -203,6 +209,11 @@ static inline void pushcl040(unsigned lo
3844  
3845  void cache_clear (unsigned long paddr, int len)
3846  {
3847 +#ifdef CONFIG_COLDFIRE
3848 +// JKM -- revise to use proper caching
3849 +//     cf_cache_clear(paddr, len);
3850 +       flush_bcache();
3851 +#else
3852      if (CPU_IS_040_OR_060) {
3853         int tmp;
3854  
3855 @@ -237,6 +248,7 @@ void cache_clear (unsigned long paddr, i
3856      if(mach_l2_flush)
3857         mach_l2_flush(0);
3858  #endif
3859 +#endif /* CONFIG_COLDFIRE */
3860  }
3861  EXPORT_SYMBOL(cache_clear);
3862  
3863 @@ -250,6 +262,11 @@ EXPORT_SYMBOL(cache_clear);
3864  
3865  void cache_push (unsigned long paddr, int len)
3866  {
3867 +#ifdef CONFIG_COLDFIRE
3868 +// JKM -- revise to use proper caching
3869 +//     cf_cache_push(paddr, len);
3870 +       flush_bcache();
3871 +#else
3872      if (CPU_IS_040_OR_060) {
3873         int tmp = PAGE_SIZE;
3874  
3875 @@ -290,6 +307,7 @@ void cache_push (unsigned long paddr, in
3876      if(mach_l2_flush)
3877         mach_l2_flush(1);
3878  #endif
3879 +#endif /* CONFIG_COLDFIRE */
3880  }
3881  EXPORT_SYMBOL(cache_push);
3882  
3883 --- a/fs/namespace.c
3884 +++ b/fs/namespace.c
3885 @@ -3,6 +3,10 @@
3886   *
3887   * (C) Copyright Al Viro 2000, 2001
3888   *     Released under GPL v2.
3889 + * (c) Copyright Freescale Semiconductor, Inc. 2008, 2009
3890 + *      Change to align on page size for coldfire
3891 + *      Jason Jin Jason.Jin@freescale.com
3892 + *      Shrek Wu B16972@freescale.com
3893   *
3894   * Based on code from fs/super.c, copyright Linus Torvalds and others.
3895   * Heavily rewritten.
3896 @@ -1858,7 +1862,11 @@ int copy_mount_options(const void __user
3897         /* copy_from_user cannot cross TASK_SIZE ! */
3898         size = TASK_SIZE - (unsigned long)data;
3899         if (size > PAGE_SIZE)
3900 +#ifndef CONFIG_COLDFIRE
3901                 size = PAGE_SIZE;
3902 +#else
3903 +               size = PAGE_SIZE - ((unsigned long)data & ~PAGE_MASK);
3904 +#endif
3905  
3906         i = size - exact_copy_from_user((void *)page, data, size);
3907         if (!i) {
3908 --- a/include/linux/fsl_devices.h
3909 +++ b/include/linux/fsl_devices.h
3910 @@ -6,7 +6,7 @@
3911   *
3912   * Maintainer: Kumar Gala <galak@kernel.crashing.org>
3913   *
3914 - * Copyright 2004 Freescale Semiconductor, Inc
3915 + * Copyright 2004-2008 Freescale Semiconductor, Inc
3916   *
3917   * This program is free software; you can redistribute  it and/or modify it
3918   * under  the terms of  the GNU General  Public License as published by the
3919 @@ -18,6 +18,7 @@
3920  #define _FSL_DEVICE_H_
3921  
3922  #include <linux/types.h>
3923 +#include <linux/interrupt.h>
3924  
3925  /*
3926   * Some conventions on how we handle peripherals on Freescale chips
3927 @@ -58,11 +59,42 @@ enum fsl_usb2_phy_modes {
3928         FSL_USB2_PHY_SERIAL,
3929  };
3930  
3931 +struct platform_device;
3932  struct fsl_usb2_platform_data {
3933         /* board specific information */
3934         enum fsl_usb2_operating_modes   operating_mode;
3935         enum fsl_usb2_phy_modes         phy_mode;
3936         unsigned int                    port_enables;
3937 +
3938 +       char *name;             /* pretty print */
3939 +       int (*platform_init) (struct platform_device *);
3940 +       void (*platform_uninit) (struct fsl_usb2_platform_data *);
3941 +       void __iomem *regs;     /* ioremap'd register base */
3942 +       u32 xcvr_type;          /* PORTSC_PTS_* */
3943 +       char *transceiver;      /* transceiver name */
3944 +       unsigned power_budget;  /* for hcd->power_budget */
3945 +       struct platform_device *pdev;
3946 +       struct fsl_xcvr_ops *xcvr_ops;
3947 +       int (*gpio_usb_active) (void);
3948 +       void (*gpio_usb_inactive) (void);
3949 +       unsigned                        big_endian_mmio : 1;
3950 +       unsigned                        big_endian_desc : 1;
3951 +       unsigned                        es : 1; /* need USBMODE:ES */
3952 +       unsigned                        have_sysif_regs : 1;
3953 +       unsigned                        le_setup_buf : 1;
3954 +       unsigned                        suspended : 1;
3955 +       unsigned                        already_suspended : 1;
3956 +
3957 +       /* register save area for suspend/resume */
3958 +       u32                             pm_command;
3959 +       u32                             pm_status;
3960 +       u32                             pm_intr_enable;
3961 +       u32                             pm_frame_index;
3962 +       u32                             pm_segment;
3963 +       u32                             pm_frame_list;
3964 +       u32                             pm_async_next;
3965 +       u32                             pm_configured_flag;
3966 +       u32                             pm_portsc;
3967  };
3968  
3969  /* Flags in fsl_usb2_mph_platform_data */
3970 @@ -92,4 +124,30 @@ struct mpc8xx_pcmcia_ops {
3971   */
3972  int fsl_deep_sleep(void);
3973  
3974 +struct fsl_ata_platform_data {
3975 +#ifdef CONFIG_FSL_PATA_USE_DMA
3976 +       int     udma_mask;      /* UDMA modes h/w can handle */
3977 +       int     fifo_alarm;     /* value for fifo_alarm reg */
3978 +       int     max_sg;         /* longest sglist h/w can handle */
3979 +#endif
3980 +       int     (*init)(struct platform_device *pdev);
3981 +       void    (*exit)(void);
3982 +       int     (*get_clk_rate)(void);
3983 +};
3984 +
3985 +struct coldfire_fec_platform_data {
3986 +       int     hash_table;
3987 +       unsigned int *fec_hw;
3988 +       void    (*request_intrs)(struct net_device *dev,
3989 +               irqreturn_t (*)(int, void *),
3990 +               void *irq_privatedata);
3991 +       void    (*set_mii)(struct net_device *dev);
3992 +       void    (*get_mac)(struct net_device *dev);
3993 +       void    (*enable_phy_intr)(void);
3994 +       void    (*disable_phy_intr)(void);
3995 +       void    (*phy_ack_intr)(void);
3996 +       void    (*localhw_setup)(void);
3997 +       void    (*uncache)(unsigned long addr);
3998 +       void    (*platform_flush_cache)(void);
3999 +};
4000  #endif /* _FSL_DEVICE_H_ */